【问题标题】:UIButton inside UIView doesn't respond to touch eventsUIView 内的 UIButton 不响应触摸事件
【发布时间】:2012-11-12 21:10:23
【问题描述】:

我在自定义 UIView 中放置了一个 UIButton 并且该按钮没有接收任何触摸事件(它没有进入突出显示状态,所以我的问题是不是无法连接向上触摸内部处理程序)。我已经尝试将它放入 Interface Builder 中的 XIB 中,还尝试以编程方式将 UIButton 分别添加到 UIView 中,但都没有成功。我所有的视图都在 UIScrollView 内,所以我首先虽然 UIScrollView 可能会阻止它们,所以我还以编程方式添加了一个按钮,就像我将自定义视图添加到 UIScrollView 中一样,并且按钮工作,消除了 UIScrollView 的可能性成为原因。我的视图层次结构是这样的:

按钮在图像视图之上,并且前层没有完全占据我的按钮,所以我没有理由不与按钮进行物理交互。在我的自定义视图的代码方面,我正在创建我的视图:

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        // Initialization code
        UIView *sub = [[[NSBundle mainBundle] loadNibNamed:@"ProfileView" owner:self options:nil] objectAtIndex:0];
        [self addSubview:sub];
        [sub setUserInteractionEnabled:YES];
        [self setUserInteractionEnabled:YES];
        CALayer *layer = sub.layer;
        layer.masksToBounds = YES;
        layer.borderWidth = 5.0;
        layer.borderColor = [UIColor whiteColor].CGColor;
        layer.cornerRadius = 30.0;
        /*layer.shadowOffset = CGSizeZero;
        layer.shadowRadius = 20.0;
        layer.shadowColor = [[UIColor blackColor] CGColor];
        layer.shadowOpacity = 0.8;
        */
    }
    return self;
}

我尝试了setUserInteractionsEnabled 的所有组合,但没有运气。 (是的,也将它们设置为在 Interface Builder 中检查)。我还阅读了另一个有类似问题的问题,我应该尝试覆盖“canBecomeFirstResponder”以返回“YES”,我也这样做了。但问题依然存在,我无法点击按钮。我没有为按钮提供任何特殊属性和设置,它只是一个普通的。我在视图中的其他对象(下面的标签、按钮后面的图像视图等)工作正常,没有问题。这里可能有什么问题?

谢谢,

可以。

更新:这是问题的快速重现:https://dl.dropbox.com/u/79632924/Test.zip 尝试运行并点击按钮。

【问题讨论】:

  • 你能把这个视图提取到小型测试项目中吗?
  • 愚蠢的问题:您是否记得将按钮链接到 IBAction?
  • @HotLicks 是的,它们是链接的。但问题不在于触摸时事件处理程序没有触发,问题在于按钮根本没有接收(或至少响应)触摸事件。
  • @DmitryShevchenko 我现在创建了一个迷你测试项目,根本没有 UIScrollViews 等,还有一个新视图和一个从头开始的 XIB(没有复制粘贴旧的)和按钮还是不行。
  • 你能上传那个让我们看看吗?

标签: objective-c uiview uibutton interface-builder xib


【解决方案1】:

我找到了解决方案。我将我的自定义视图初始化为:

MyView *view = [[MyView alloc] init];

我已经用我的视图大小的框架来初始化它,它开始响应事件:

CGRect rect = CGRectMake(0,0,width,height);
MyView *view = [[MyView alloc] initWithFrame:rect];

【讨论】:

    【解决方案2】:

    查看测试项目,我相信你的问题在于你创建TestView的方式,你没有为它指定框架,所以基本上父视图是0大小,你从XIB看到的子视图延伸出父视图查看,因此不会在响应者链中得到任何东西。

    您应该在创建TestView时指定框架,或者在加载XIB文件后调整框架。

    【讨论】:

    • 是的,刚上传了测试项目,就更容易看到了(因为测试项目的东西少了很多)。现在我的按钮就像一个魅力!
    【解决方案3】:

    我也遇到过这个问题。我的原因是UIButton superview 框架的高度为 0,所以我相信即使发生了触摸,它也没有被传递给按钮。

    在确保按钮的超级视图采用更大的矩形作为框架后,按钮操作起作用了。

    我这边这个问题的根本原因是错误的自动布局实现(我忘记为按钮的超级视图设置高度约束)。

    【讨论】:

      【解决方案4】:

      故事板解决方案

      仅适用于在使用情节提要和约束时想要解决此问题的任何人。

      在超级视图(包含按钮)和具有等高约束的 UIButton 之间添加一个约束。

      在我的例子中,我选择了将 UIButton 嵌入到 UIView 中,而故事板上没有插图。在 UIButton 和 superview 之间添加额外的高度约束允许 UIButton 响应触摸。

      您可以通过启动 View Debugger 来确认问题,并直观地确认 UIButton 的 superview 可选择。

      (Xcode 11,*- 也应该在早期版本中工作)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-03-30
        • 2016-01-06
        • 1970-01-01
        • 2016-12-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多