0

我确实有一个 UIView 子类,我们称之为 PopupView。在此 PopupView 中,我确实有一个带有自定义 uiview 和 uibutton (2)的 NavigationBar 。PopupView 内部还有一个 UIButton (1) 。

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

uibutton 中这个 uibutton 疯狂的原因是因为我可以将 capinsets 用于 uibutton 中的背景图像,但不能用于 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 动画并直接设置新框架,也会发生这种情况。我是否通过单击或直接viewDidLoad在它的 viewController 上调整它的大小也没关系。

任何想法为什么会发生这种情况?

4

2 回答 2

4

recursiveDescriptionHeer 是您输出的相关部分:

|    | <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 视图内部,0xab1MoviePopupView的高度为 300 点,并且(其 Y 原点为 -70)位于 0x9d6 视图“内部”的中心,但溢出了 0x9d6 视图的顶部和底部边缘。

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

然而,命中测试总是裁剪到视图的边界。因此,当您尝试触摸其中一个按钮时,点击超出了 0x9d6 视图的边界(只有 160 点的高度)。0x9d6 视图在到达其MoviePopupView下方的 或 按钮之前拒绝触摸。

hitTest:withEvent:文档中提到了这一点:

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

于 2012-10-19T19:23:43.170 回答
0

由于我们看不到按钮的位置,因此无法确定,但如果您为包含按钮的 UIView 提供背景颜色(或将其设置为剪辑子视图),您可能会发现调整大小导致您的按钮位于框架之外,从而使它们无法点击。

于 2012-10-19T19:11:44.107 回答