我有一个UIScrollView,其内容是使用Interface Builder设计的。它有一个下面有UIButton的桌子。如果按钮之前没有被移动,它可以工作(touchesBegan和TouchUpInside被调用),但如果它是使用'button.frame ='移动以响应内容增长(表格变大),它会停止响应任何触摸。
我确认前面没有隐藏的视图,我甚至使用了bringViewToFront。
答案 0 :(得分:20)
检查您的UIButton最终位置是否都在UITableView
和UIScrollView
范围内。
移动后,UIBUtton
可能会被置于界限之外,然后不会响应触摸事件。
一个快速设置可以让您验证是将clipToBounds
和UITableView
的{{1}}属性设置为UIScrollView
,然后将所有内容设置在界限之外甚至不可见。
答案 1 :(得分:2)
在我最近工作的项目中,我在FooterView中有一个带UIButton的UITableView。当您尝试滚动按钮时,因为它是此UITableView中的最后一项,该按钮将固定在视图的底部。
当我的UITableView的内容导致contentSize小于UITableView的高度时,我遇到了与此帖相同的问题。我的UIButton基本上超出了UITableView可滚动内容的初始帧的范围,因此没有收到任何事件。
我想发布我的解决方案,以便其他任何接受此行为的人都可以得到帮助。
我必须在自定义UITableView类中覆盖pointInside:withEvent
和hitTest:withEvent
方法:
- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event {
BOOL pointInside = [super pointInside:point withEvent:event];
if (!pointInside) {
CGRect buttonFrame = [self convertRect:self.myButton.frame fromView:self];
if (CGRectContainsPoint(buttonFrame, point)) {
return YES;
}
}
return pointInside;
}
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
if (!self.clipsToBounds && !self.hidden && self.alpha > 0) {
for (UIView *subview in self.subviews.reverseObjectEnumerator) {
CGPoint subPoint = [subview convertPoint:point fromView:self];
UIView *result = [subview hitTest:subPoint withEvent:event];
if (result != nil) {
return result;
}
}
}
// No other subviews have triggered this 'touch' check self.myButton
CGPoint subPoint = [self.myButton convertPoint:point fromView:self];
UIView *result = [self.myButton hitTest:subPoint withEvent:event];
if (result != nil) {
return result;
}
// Pass the 'touch' on if no subviews trigger the 'touch'
return [super hitTest:point withEvent:event];
}