gpt4 book ai didi

objective-c - 框架外的 iOS UIButton 未触发 touchinside 事件

转载 作者:可可西里 更新时间:2023-11-01 05:57:24 26 4
gpt4 key购买 nike

我有三个 View Controller 和一个 View 。

一个包含主视图,另一个包含自定义导航栏,第三个包含 View (也就是第三个 View Controller 的 subview )。

当应用程序加载时,导航栏 View 将与 subview 一起可见。在 subview 中,我有一个按钮,我想将其放置在导航栏 View 的顶部。不幸的是,我不能使用像 navigationitem.setrightbutton 这样的方法直接做到这一点......或任何其他此类方法(一切都是编码的,没有 Nib )。

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

不幸的是,没有点击事件被传递给按钮,因为它在 subview 框架边界之外...

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

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

最佳答案

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

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

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

此方法负责决定给定的触摸事件应该转到哪个 View 。当你触摸屏幕时, Root View (窗口)的 hitTest 方法被调用,它会调用它的 subview 的方法,它们会调用它们的 subview 的方法,等等。

原则上,您可以创建一个自定义窗口类并覆盖窗口中的 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];
}
}

相反,我建议您通过将按钮添加为导航栏的 subview 而不是使用负定位将其放置在那里,从而避免很多麻烦并改变您的应用程序的工作方式。

关于objective-c - 框架外的 iOS UIButton 未触发 touchinside 事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10694382/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com