UIView.为什么在其父级范围之外的子视图不会收到触摸?
我有一个简单的 UIView 父/子层次结构。一位父级 (UIView)。一个孩子(UIButton)。父级边界小于子级边界,因此子级的一部分会超出其父级的边界框。
问题是:在父级的 bbox 之外的子级的那些部分不会接收触摸。只有在父级的 bbox 内点击才允许子级按钮接收触摸。
有人可以建议修复/解决方法吗?
更新
对于那些关注这个问题的人,这是我根据@Bastians最优秀的答案实现的解决方案:
- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event {
BOOL isInside = [super pointInside:point withEvent:event];
// identify the button view subclass
UIButton *b = (UIButton *)[self viewWithTag:3232];
CGPoint inButtonSpace = [self convertPoint:point toView:b];
BOOL isInsideButton = [b pointInside:inButtonSpace withEvent:nil];
if (isInsideButton) {
return isInsideButton;
} // if (YES == isInsideButton)
return isInside;
}
I have a simple - trivial - UIView parent/child hierarchy. One parent (UIView). One child (UIButton). The parents bounds are smaller then it's child's bounds so that a portion of the child extends beyond the bounding box of its parent.
Here's the problem: Those portions of the child outside the bbox of the parent do not receive touches. Only tapping within the bbox of the parent allows the child button to receive touches.
Can someone please suggest a fix/workaround?
UPDATE
For those following this question, here is the solution I implemented as a result of @Bastians most excellent answer:
- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event {
BOOL isInside = [super pointInside:point withEvent:event];
// identify the button view subclass
UIButton *b = (UIButton *)[self viewWithTag:3232];
CGPoint inButtonSpace = [self convertPoint:point toView:b];
BOOL isInsideButton = [b pointInside:inButtonSpace withEvent:nil];
if (isInsideButton) {
return isInsideButton;
} // if (YES == isInsideButton)
return isInside;
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
问题在于响应者链。当您触摸显示屏时,它会从父母向下移动到孩子。
所以..当您触摸屏幕时,父母会发现触摸超出了自己的范围,因此孩子们甚至不会询问。
执行此操作的函数是 hitTest。如果您有自己的 UIView 类,您可以覆盖它并自行返回按钮。
The problem is the responder chain. When you touch the display it will go down from the parents to the childen.
So .. when you touch the screen the parent will see that the touch is outside of it's own bounds and so the children will not even asked.
The function that does that is the hitTest. If you have your own UIView class you can overwrite it and return the button by yourself.
根据 Apple 自己的文档,我拥有的最简单、最可靠的方法发现这样做的方法是在剪辑视图的超类中重写
hitTest:withEvent:
,如下所示:Per Apple’s own documentation, the simplest and most reliable way I have found to do this is to override
hitTest:withEvent:
in the superclass of your clipped view to look like the following:斯威夫特4
Swift 4
前提条件:
您在
UIView
(名为容器)内有一个UIButton
(名为 Button1),并且 Button1 部分位于容器边界之外。问题:
button1容器外的部分不会响应点击。
解决方案:
从 UIView 子类化您的容器:
不要忘记为您的 Button1 指定
10086
标签Precondition:
You have a
UIButton
(named as button1) inside aUIView
(named as container), and button1 is partially outside the container's bounds.Problem:
the part outside the container of button1 will not response click.
Solution:
subclass your container from UIView:
Don't forget to give your button1 a tag of
10086
我手头有同样的问题。您只需要覆盖:
-(BOOL) pointInside:(CGPoint)point withEvent:(UIEvent *)event
以下是自定义 UIView 子类的工作代码,其创建的目的只是为了可点击其外部 -限制孩子。
I had the same exact problem at hand. You only need to override:
-(BOOL) pointInside:(CGPoint)point withEvent:(UIEvent *)event
Here is working code for a custom UIView subclass created solely to be tappable for its out-of-bounds children.