我有一个UIView子类,我们称之为PopupView。在这个PopupView里面我有一个带有自定义uiview的NavigationBar,里面有一个uibutton (2)。此外,PopupView中还有一个UIButton (1)。
PopupView
- UIButton (1)
- UINavigationBar
- UINavigationItem
- UIBarButtonItem
- UIView
- UIButton (2)
这种uibutton在uinavigationbar疯狂的原因是因为我可以在一个uibutton中使用capinsets作为背景图像而不是uibarbuttonitem。
我的问题:
我使用uiview动画调整PopupView的大小,并在动画完成后重新调整大小,我无法再单击此uiview中的按钮。
[UIView animateWithDuration:0.4f delay:0.0f options:UIViewAnimationCurveEaseOut animations:^{
CGRect popupFrame = self.frame;
popupFrame.size.height += 140.0f;
popupFrame.origin.y = floorf(popupFrame.origin.y - (140.0f / 2));
self.frame = popupFrame;
} completion:^(BOOL finished) {
}];
如果我不使用uiview动画并直接设置新帧,也会发生这种情况。如果我通过点击调整大小或直接在它的viewController中的viewDidLoad
上进行调整也没关系。
为什么会发生这种情况?
答案 0 :(得分:4)
Heer是recursiveDescription
输出的相关部分:
| | <UIView: 0xaac0480; frame = (0 0; 320 568); tag = 23945; layer = <CALayer: 0xaac04e0>>
| | | <MJPopupBackgroundView: 0xaac0710; frame = (0 0; 320 568); tag = 23943; layer = <CALayer: 0xaac07c0>>
| | | <UIButton: 0xaac0aa0; frame = (0 0; 320 568); opaque = NO; layer = <CALayer: 0xaac0b60>>
| | | <UIView: 0x9d6fea0; frame = (10 204; 300 160); autoresize = W+H; tag = 23942; layer = <CALayer: 0x9d6ff50>>
| | | | <MoviePopupView: 0xab1aaa0; frame = (0 -70; 300 300); clipsToBounds = YES; layer = <CALayer: 0xab1a070>>
0xaac视图覆盖了屏幕。
在0xaac视图中,0x9d6视图的高度为160点,并在0xaac视图中垂直居中。
在0x9d6视图中,0xab1 MoviePopupView
的高度为300点,并且(其Y的原点为-70)位于0x9d6视图的“内部”中间,但是溢出了顶部和底部的边缘。 0x9d6视图。
clipsToBounds
属性的默认值为NO,因此0x9d6视图不会直观地剪切其0xab1子视图的内容。因此,按钮仍然可以在屏幕上看到。
然而,命中测试总是剪辑到视图的边界。因此,当您尝试触摸其中一个按钮时,命中超出了0x9d6视图的范围(其高度仅为160点)。 0x9d6视图在到达MoviePopupView
或其下的按钮之前拒绝触摸。
hitTest:withEvent:
documentation:
位于接收者界限之外的点永远不会被报告为命中,即使它们实际上位于接收者的一个子视图中。如果当前视图的
clipsToBounds
属性设置为NO
且受影响的子视图超出视图边界,则会发生这种情况。
答案 1 :(得分:0)
由于我们没有看到按钮的位置,因此无法确定,但如果您为包含按钮的UIView提供背景颜色(或将其设置为剪辑子视图),您可能会发现调整大小导致您的按钮位于框架外部,从而使其无法点击。