【问题标题】:UIButton pass-through tap-and-scroll gesture to UIScrollViewUIButton 通过点击和滚动手势到 UIScrollView
【发布时间】:2014-09-29 08:52:40
【问题描述】:
我有一个水平分页 UIScrollView 和一个 UIButton 部分覆盖滚动视图。
像这样:
UIView
|
|- UIScrollView
|
|- UIButton
我想让UIButton 不触发tap-scroll-and-relase-above-the-button(我希望UIScrollView 改为滚动)。我希望按钮只响应点击并释放而不移动。
这可以简单快速地完成吗?或者我应该继承UIButton 并覆盖-touchesBegan: 等,以便在适当的时候手动将触摸传递给scrollView?
【问题讨论】:
标签:
ios
objective-c
cocoa-touch
uiscrollview
uibutton
【解决方案1】:
好吧,试试这个。这会将按钮上的点击识别器设置为等到点击结束,然后测试触摸是否在 UIButton 中结束。
UIButton * btn;
UITapGestureRecognizer * getTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(methodToPerformOnTap:)];
[btn addGestureRecognizer:getTap];
-(void) methodToPerformOnTap:(UITapGestureRecognizer *)sender {
if ([sender state] == UIGestureRecognizerStateEnded)
{
CGPoint point = [sender locationInView:btn];
if ( CGRectContainsPoint(btn.bounds, point) ) {
// Point lies inside the bounds. HANDLE BUTTON TAP HERE.
}
}
}
【解决方案2】:
经过一些额外的研究,我找到了一个合理的解决方案。这里的问题是UIScrollView 和UIButton 不在同一个响应者链层次结构中:两者的下一个响应者是父UIView,因此默认情况下它们不会相互发送事件。
解决方案是继承 UIButton 并实现
- (UIResponder *)nextResponder
方法使其返回UIScrollView。
另一种解决方案是使UIButton 成为UIScrollView 的子代。但是,如果您想将按钮保持在固定位置而不考虑单元格滚动,则效果不佳。
这有点烦人,没有更简单的方法可以做到这一点。 :-)