UIButton在UIScrollview中设置框架后没有响应

时间:2011-05-24 11:56:20

标签: iphone objective-c cocoa-touch uibutton

我有一个UIScrollView,其内容是使用Interface Builder设计的。它有一个下面有UIButton的桌子。如果按钮之前没有被移动,它可以工作(touchesBegan和TouchUpInside被调用),但如果它是使用'button.frame ='移动以响应内容增长(表格变大),它会停止响应任何触摸。

我确认前面没有隐藏的视图,我甚至使用了bringViewToFront。

2 个答案:

答案 0 :(得分:20)

检查您的UIButton最终位置是否都在UITableViewUIScrollView范围内。

移动后,UIBUtton可能会被置于界限之外,然后不会响应触摸事件。

一个快速设置可以让您验证是将clipToBoundsUITableView的{​​{1}}属性设置为UIScrollView,然后将所有内容设置在界限之外甚至不可见。

答案 1 :(得分:2)

在我最近工作的项目中,我在FooterView中有一个带UIButton的UITableView。当您尝试滚动按钮时,因为它是此UITableView中的最后一项,该按钮将固定在视图的底部。

当我的UITableView的内容导致contentSize小于UITableView的高度时,我遇到了与此帖相同的问题。我的UIButton基本上超出了UITableView可滚动内容的初始帧的范围,因此没有收到任何事件。

我想发布我的解决方案,以便其他任何接受此行为的人都可以得到帮助。

我必须在自定义UITableView类中覆盖pointInside:withEventhitTest: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];
}