「iOS」解决Charts中图表手势与UIScrollView滑动手势冲突

问题:Charts中图表手势与UIScrollView滑动手势冲突

我在UITableView(UIScrollView)中添加了PieChartView后出现手势混乱。如旋转图表的圆环时,UITableView(UIScrollView)也跟着跑了,而圆环却不转了。

解决思路:获取当前点击操作及位置,当用户点的是图表就将UITableView(UIScrollView)的isScrollEnabled置为false
实现代码:

在发生冲突的viewController或view中添加extension
如果你单独封装了一个图表的view,那么就在那个view里override hitTest方法就行

extension UITableView{
    
    /// 重写tableview hittest方法
    /// 1、遍历subviews
    /// 2、查找手势冲突的view
    /// 3、将当前点击Point转换到所要解决手势冲突的view上
    /// 4、判断当前点击是否在这个view上
    /// 5、修改冲突手势
    /// 6、否则返回原点击事件
    open override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
        //  我的图表是添加在tableview的headerview上,所以直接取到headerview即可
        let headerView = self.tableHeaderView
        if let tmpHeaderView = headerView{
            for subview in tmpHeaderView.subviews{
                if subview is XXXChartView{
                    let xxxChartView = subview as? XXXChartView
                    if let tmpChartView = xxxChartView{
                        let pieChartView = tmpChartView.pieChartView
                        let newPoint = tmpHeaderView.convert(point, to: pieChartView)
                        //这个方法是关键,获取是否点到了你的图表
                        let isHit = pieChartView.point(inside: newPoint, with: event)
                        //点击到了图表则不可滚动
                        self.isScrollEnabled = !isHit
                    }
                }
            }
        }
        return super.hitTest(point, with: event)
    }
}

至此问题完美解决。
需要注意的是:图表的大小和setExtraOffsets方法需要你仔细设置一下,让用户感觉到只有点到图表才会旋转,而不是空白处。

你可能感兴趣的:(「iOS」解决Charts中图表手势与UIScrollView滑动手势冲突)