【问题标题】:iOS UIButton outside Frame not firing touchinside event框架外的iOS UIButton没有触发touchinside事件
【发布时间】:2012-05-28 11:49:16
【问题描述】:

我有一个三视图控制器和一个视图。

一个包含主视图,另一个包含自定义导航栏,第三个包含视图(也称为第三个视图控制器的子视图)。

当应用程序加载时,导航栏视图将与子视图一起可见。在子视图中,我有一个按钮,我想将它放在导航栏视图的顶部。不幸的是,我不能直接使用类似navigationitem.setrightbutton...或任何其他此类方法(一切都是编码的,没有笔尖)。

所以我正在做的是将我的按钮框架 y 值设置为负值。这意味着按钮超出了子视图的框架边界,但它实现了我想要的,即将按钮放置在导航栏的顶部。

不幸的是,没有将点击事件传递给按钮,因为它位于子视图框架边界之外...

我已尝试覆盖视图的 pointinside 和 hittest,但没有任何效果。

我希望我已经说清楚了。任何可以解决此问题的代码将不胜感激。

【问题讨论】:

  • 添加这个,[btnName setUserInteractionEnabled:YES];

标签: objective-c ios xcode cocoa-touch uibutton


【解决方案1】:

触摸事件仅在视图范围内传播。尽管可以将子视图放置在其父级边界之外并且仍然可以看到它,但不会将事件传递给它。

处理事件的底层机制是UIView的如下方法:

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event

此方法负责决定给定的触摸事件应该转到哪个视图。当你触摸屏幕时,会调用根视图(窗口)的 hitTest 方法,它会在它的子视图上调用该方法,它们会在其子视图上调用该方法,以此类推。

原则上,您可以创建一个自定义窗口类并覆盖窗口中的 hitTest 方法,以强制它将事件转发到按钮,即使它超出了其父级的边界,但要正确执行此操作非常繁琐。应该是这样的:

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
    CGRect rect = WORK_OUT_WHERE_THE_BUTTON_RECT_IS_RELATIVE_TO_THE_WINDOW;
    if (CGRectContainsPoint(rect, point))
    {
        return theButtonView;
    }
    else
    {
        return [super hitTest:point withEvent:event];
    }
}

相反,我建议您省去很多麻烦,并通过将按钮添加为导航栏的子视图而不是使用负定位将其放置在此处来更改应用的工作方式。

【讨论】:

    猜你喜欢
    • 2013-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-03
    • 1970-01-01
    • 1970-01-01
    • 2010-12-11
    • 1970-01-01
    相关资源
    最近更新 更多