微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

UIScrollview中设置框架后,UIButton不响应

如何解决UIScrollview中设置框架后,UIButton不响应

| 我有一个UIScrollView,其内容是使用Interface Builder设计的。它下面有一个带有UIButton的表。如果按钮之前未移动过,则可以正常工作(touchesBegan和TouchUpInside会被调用),但是如果响应内容增长(表变大)而使用\'button.frame = \'进行了移动,则它将停止响应任何接触。 我验证了它前面没有隐藏的视图,甚至使用了BringViewToFront。     

解决方法

检查UIButton的最终位置是否在
UITableView
UIScrollView
范围内。 将其移动后,
UIBUtton
可能会被放置在边界之外,然后将不响应触摸事件。 一种快速设置可以使您验证是否将
UITableView
UIScrollView
clipToBounds
属性设置为
NO
,那么放置在边界之外的所有内容甚至都不可见。     ,最近在一个项目中,我有一个UITableView和一个FooterView中的UIButton。当您尝试滚动经过按钮时(因为它是此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];
}
    

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。