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

时间:2012-10-19 18:53:54

标签: iphone objective-c ios uiview uiviewanimation

我有一个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上进行调整也没关系。

为什么会发生这种情况?

2 个答案:

答案 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提供背景颜色(或将其设置为剪辑子视图),您可能会发现调整大小导致您的按钮位于框架外部,从而使其无法点击。