Ios UIButton通过点击和滚动手势进入UIScrollView

Ios UIButton通过点击和滚动手势进入UIScrollView,ios,objective-c,cocoa-touch,uiscrollview,uibutton,Ios,Objective C,Cocoa Touch,Uiscrollview,Uibutton,我有一个水平分页的UIScrollView,带有UIButton部分覆盖滚动视图 像这样: UIView | |- UIScrollView | |- UIButton 我想使ui按钮在点击滚动时不触发,并在按钮上方松弛(我想让ui滚动视图)。我希望按钮只对点击和释放做出响应,而不移动 这件事能简单快捷地完成吗?或者我应该将ui按钮子类化,并覆盖-touchesbeated:等,以便在适当时手动将触摸传递到滚动视图 好吧,试试这个。这会将按钮上的点击识别器设置为等待点击结束,然后测试触摸是否在

我有一个水平分页的
UIScrollView
,带有
UIButton
部分覆盖滚动视图

像这样:

UIView
|
|- UIScrollView
|
|- UIButton
我想使
ui按钮
在点击滚动时不触发,并在按钮上方松弛(我想让
ui滚动视图
)。我希望按钮只对点击和释放做出响应,而不移动


这件事能简单快捷地完成吗?或者我应该将
ui按钮子类化,并覆盖
-touchesbeated:
等,以便在适当时手动将触摸传递到
滚动视图

好吧,试试这个。这会将按钮上的点击识别器设置为等待点击结束,然后测试触摸是否在按钮中结束

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.

        }
    }
}

经过一些额外的研究,我找到了一个合理的解决方案。这里的问题是
uicrollview
UIButton
不在同一个响应器链层次结构中:这两个的下一个响应器都是父级
UIView
,因此默认情况下它们不会相互发送事件

解决方案是将
UIButton
子类化并实现

- (UIResponder *)nextResponder
方法,使其返回
UIScrollView


另一种解决方案是将
ui按钮
设置为
UIScrollView
的子级。然而,如果你想在不考虑单元格滚动的情况下将按钮保持在一个固定的位置,那就不太好了


有点恼人的是,没有比这更简单的方法了。:-)