【问题标题】:user action in uiviews buttons disabled after frame resizing调整框架大小后禁用 uiviews 按钮中的用户操作
【发布时间】:2012-10-10 10:43:45
【问题描述】:

我确实有一个 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 动画并直接设置新框架,也会发生这种情况。同样,我是否通过单击或直接在其 viewController 中的viewDidLoad 上调整它的大小也没关系。

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

【问题讨论】:

  • 运行您的应用程序并使其进入按钮不响应的状态。然后在调试器中暂停并运行以下命令:po [[UIApp keyWindow] recursiveDescription]。复制输出并将其粘贴到您的帖子中。
  • 嘿,抢劫,请参阅gist.github.com/d9f7bb875be6590b315a。我正在谈论的 PopupView 在 GIST 中称为MoviePopupView,靠近底部。

标签: iphone objective-c ios uiview uiviewanimation


【解决方案1】:

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

【讨论】:

  • 我可以看到它们,我只是无法点击它们
  • 啊现在我明白了。似乎在视图内部,剪裁不会改变任何东西,仍然在原地。
  • 是的,但是如果您的视图没有设置为剪辑子视图,即使它们在框架之外,您也可以看到它们。
【解决方案2】:

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 并且受影响的子视图超出了视图的边界,则会发生这种情况。

【讨论】:

  • 成功了。太感谢了。需要使用recursiveDescription更多。希望看到像 webkit 检查器这样的检查器用于模拟器 :)
  • 甜!!!陷入了类似的境地。视图宽度和高度设置小于要求,但视图完全可见。将clipsToBounds 设置为YES 后,我意识到帧值偏离了。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-01
相关资源
最近更新 更多