UIScrollView和touchesBegan/touchesEnded等

Mar*_*ard 5 objective-c uiscrollview uiview ios

我有UIView2个子视图,我们称之为视图A:

  • 一个基本的UIView,叫做B
  • a UIScrollView,叫C

我在视图中覆盖了以下方法A:

  • - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
  • - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event

当我触摸视图B,touchesBegan:withEvent:并被touchesEnded:withEvent:调用,但如果我触摸UIScrollView(视图C),则没有调用.

我知道这是预期的行为,但我想知道为什么.我找不到任何明确的答案.任何的想法?

Lil*_*ilo 7

使用TapGestureRecognizer而不是touchBegan方法

UITapGestureRecognizer *singleTapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(singleTap:)];
singleTapGestureRecognizer.numberOfTapsRequired = 1;
singleTapGestureRecognizer.enabled = YES;
singleTapGestureRecognizer.cancelsTouchesInView = NO;
[scrollView addGestureRecognizer:singleTapGestureRecognizer];

- (void)singleTap:(UITapGestureRecognizer *)gesture {  
//handle taps   
}
Run Code Online (Sandbox Code Playgroud)

Swift版本:

let singleTapGestureRecognizer = UITapGestureRecognizer(target: self, action: "singleTap:")
    singleTapGestureRecognizer.numberOfTapsRequired = 1
    singleTapGestureRecognizer.enabled = true
    singleTapGestureRecognizer.cancelsTouchesInView = false
    scrollViewH.addGestureRecognizer(singleTapGestureRecognizer)

func singleTap(sender: UITapGestureRecognizer) {
    println("handle taps ")

}
Run Code Online (Sandbox Code Playgroud)


Anu*_*han 7

如果你有滚动视图thouchesBegan方法将无法工作,因为如果想要滚动你必须在故事板中启用userInteractionEnabled为YES.如果你把它变为NO,它就会触发.因此解决方案是使用TapGestureRecognizer将此添加到viewDidLoad:

let singleTapGestureRecognizer = UITapGestureRecognizer(target: self, action: "MyTapMethod:")
    singleTapGestureRecognizer.numberOfTapsRequired = 1
    singleTapGestureRecognizer.enabled = true
    singleTapGestureRecognizer.cancelsTouchesInView = false
    myscrollView.addGestureRecognizer(singleTapGestureRecognizer)
Run Code Online (Sandbox Code Playgroud)

然后在控制器中添加此MyTapMethod.

func MyTapMethod(sender: UITapGestureRecognizer) {
        //NSLog("touchesBegan")
        self.view.endEditing(true)
    }
Run Code Online (Sandbox Code Playgroud)

这工作正常.


Ton*_*enu 5

您至少有两个选择:

1)"通过设置userInteractionEnabledNO为您滚动视图".更多信息请访问/sf/answers/1757565491/

2)您的UIScrollView的子类 - 例如,使用此https://dl.dropboxusercontent.com/u/19438780/ClassScrollViewDelegate.zip

UPDATE

为什么?请再次阅读文档:

"因为滚动...它必须知道触摸是否表示滚动的意图......它会暂时拦截触摸事件......滚动视图取消子视图中的任何跟踪并自行执行滚动"

最重要的是:**

子类可以覆盖touchesShouldBegin:withEvent:inContentView:,pagingEnabled和touchesShouldCancelInContentView:方法

从这里:https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIScrollView_Class/index.html#//apple_ref/doc/uid/TP40006922