uiscrollview won't scroll when dragging on ios-charts subview

2.4k views Asked by At

I have a ios-chart as a subview that takes up half the screen. When I pan up on any other subview it scrolls. But not when I pan on the chart. I tried setting:

[self.chart setDefaultTouchEventsEnabled:YES];
//and
[self.chart setScaleEnabled:NO];

It says in the documentation

defaultTouchEventsEnabled enables/disables default touch events to be handled. When disable, touches are not passed to parent views so scrolling inside a UIScrollView won’t work.

What can I do to enable scrolling when panning/dragging on the chart?

3

There are 3 answers

0
Entrabiter On

I think I figured it out... I removed all the UIPanGestureRecognizers from the ios-charts subview. This allowed for the scrollview to handle all the pan events.

for(UIGestureRecognizer *rec in self.chart.gestureRecognizers){
    if([rec isKindOfClass:[UIPanGestureRecognizer class]]){
        [self.chart removeGestureRecognizer:rec];
    }
}
3
rounak On

Set userInteractionEnabled on the chart view to NO.

0
ergoon On

I was struggling with this as well. Since I needed the chart to be scrollable, @Entrabiter's solution didn't work for me. The only solution that worked for me, was assigning the delegate of the chart view's UIPanGestureRecognizer to my ViewController and implement UIGestureRecognizerDelegate.

This solution is in Swift, but it should also work fine in Objective-C.

class MyViewController: UIViewController, UIGestureRecognizerDelegate {
    // MARK: Outlets
    @IBOutlet weak var contentView: UIScrollView!
    @IBOutlet weak var myChart: LineChartView!

    override func viewDidLoad() {
        super.viewDidLoad()

        if let gestureRecognizers = myChart.gestureRecognizers {
            for gestureRecongnizer in gestureRecognizers {
                if gestureRecongnizer is UIPanGestureRecognizer {
                    gestureRecongnizer.delegate = self
                }
            }
        }
    }
}

The important part is to tell the gestureRecognizer to recognize both the scrollview's panGestureRecognizer as well as the chartview's panGestureRecognizer.

// MARK: UIGestureRecognizerDelegate
func gestureRecognizer(gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWithGestureRecognizer otherGestureRecognizer: UIGestureRecognizer) -> Bool {
    if otherGestureRecognizer == contentView.panGestureRecognizer {
        return true
    }

    return false
}