在调整帧大小后禁用uiviews按钮中的用户操作

我有一个UIView子类,让我们称之为PopupView。 在这个PopupView中,我确实有一个带有自定义uiview的NavigationBar,里面有一个uibutton (2) 。 另外在PopupView中直接有一个UIButton (1)

PopupView - UIButton (1) - UINavigationBar - UINavigationItem - UIBarButtonItem - UIView - UIButton (2) 

这个uibutton在uinavigationbar疯狂的原因是因为我可以在一个uibutton中使用capinsets作为背景图像,而不是在uibarbuttonitem中使用capinsets。

我的问题:

我使用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上也没关系。

任何想法为什么会这样?

Heer是recursiveDescription输出的相关部分:

 | | > | | | > | | | > | | | > | | | | > 

0xaac视图覆盖屏幕。

在0xaac视图内,0x9d6视图的高度为160点,并在0xaac视图中垂直居中。

在0x9d6视图中,0xab1 MoviePopupView的高度为300点,并且(其Y原点为-70)位于0x9d6视图的“内部”中心,但溢出了0x9d6视图的顶部和底部边缘。

clipsToBounds属性的默认值为NO,因此0x9d6视图不会直观地剪切其0xab1子视图的内容。 因此,按钮仍然在屏幕上可见。

但是,命中测试总是剪辑到视图的边界。 因此,当您尝试触摸其中一个按钮时,命中超出了0x9d6视图的范围(其高度仅为160点)。 0x9d6视图在到达MoviePopupView或其下的按钮之前拒绝触摸。

这在hitTest:withEvent:文档中提到:

位于接收器边界之外的点永远不会被报告为命中,即使它们实际上位于接收者的子视图中。 如果当前视图的clipsToBounds属性设置为NO并且受影响的子视图超出视图的边界,则会发生这种情况。

由于我们没有看到按钮的位置,所以不可能肯定地说,但是如果你给包含按钮的UIView提供背景颜色(或将其设置为剪辑子视图),你可能会发现resize会导致你的按钮位于框架外部,从而使它们不可点击。