简体   繁体   中英

Scrolling is disabled when i add A UIPangesturerecognizer to UIScrollView

I have a scroll view and i want to make it disappear whenever a pan is done. It works fine and on panning , scrollview disappear but the problem is now i cant scroll the contents.

[UIView animateWithDuration:0.2
                      delay:0.2
                    options: UIViewAnimationCurveLinear
                 animations:^{
                     slideView.frame=CGRectMake(268, 0, 500, 950);
                     curtain.frame=CGRectMake(0, 0, 268, 950);
                     curtain.backgroundColor=[[UIColor alloc]initWithRed:0 green:0 blue:0 alpha:0.6];
                     [self.view addSubview:slideView];
                    [self.view addSubview:curtain];

                 } 
                 completion:^(BOOL finished){
                     NSLog(@"Done!");
                 }];

this is how i how i make my uiscrollview to appear (slideview is scrollview).And then I add a pangesturerecognizer.All works fine but scrolling is disabled. (panImage again hides my slideview.)how to make scrolling works .??

[slideView addGestureRecognizer:panImage];

UIScrollView has its own pan gesture recognizer, which controls scrolling. By adding another pan gesture recognizer, you are preventing the scroll view's own pan gesture recognizer from working.

There are a number of ways to deal with this, but it would be helpful if you could explain how the system is supposed to know when the user is trying to dismiss the scroll view, and when he is trying to scroll, since you want a pan gesture to do both.

For example, you could set the delegates of both gesture recognizers to allow the recognizers to operate simultaneously (by overriding the gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer: method). You could make each gesture recognizer require a different number of touches (by setting the minimumNumberOfTouches and maximumNumberOfTouches properties). You could use a UISwipeGestureRecognizer to recognize the dismiss gesture. You could detect when the user tries to scroll past the left edge of the scroll view by overriding the scrollViewDidScroll: method of the scroll view's delegate.

You can set priorities of your panGestureRecognizers manually. This is how I solved the same problem: in delegate (BOOL)gestureRecognizerShouldBegin: I made scrolling disable in my scrollView if it should return YES. And in the beginning of a selector of my panGestureRecognizer I made scrolling enabled.

In this delegate you can create a condition of your panGestureRecognizer to enable such a way, that it will be work if and only if you want it to have a major priority.

Swift method,
Need to add UIGestureRecognizerDelegate to your class:

class ViewController: UIViewController, UIGestureRecognizerDelegate {

Need to set its delegate to self:

override func viewDidLoad() {
    super.viewDidLoad()
    var scrollView = UIScrollView(frame: self.view.frame)
    scrollView.delegate = self
}

Add this part in your class methods to active simultaneous gestures:

func gestureRecognizer(gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWithGestureRecognizer otherGestureRecognizer: UIGestureRecognizer) -> Bool {
    return true
}

当我在scrollView顶部有一个视图并且我需要添加一个手势识别器以便在视图中滚动它时,我做了这样的事情(放置在viewDidAppear方法中):

  hostedView.addGestureRecognizer(scrollView.panGestureRecognizer)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM