【问题标题】:UIButton is unclickable after change in container height更改容器高度后,UIButton 不可点击
【发布时间】:2013-04-08 21:13:14
【问题描述】:

UIButton 包含在 UIScrollView 中。我在xib中有这个设置。我使用 NSLayoutConstraint 来更改滚动视图的高度。单击按钮后,滚动视图会更改高度,但随后 UIButton 变得无法单击。

代码如下:

- (IBAction)TagPressed:(UIButton *)sender {

    if (self.height.constant == 200) {

       self.height.constant = 88;
    }else
       self.height.constant = 200;

    [self.view setNeedsUpdateConstraints];

    [UIView animateWithDuration:0.5f animations:^{
        [self.view layoutIfNeeded];
    }];

    DRect(_scrollView.frame)
    DRect(self.view.frame)
    DRect(sender.frame)
    NSLog(sender.selected ? @"Selected" : @"Not Selected");

}

Drect 是帧的 nslog。所以控制台输出是:

2013-04-08 17:04:19.264 TouchSelectApp[93618:c07] CGRect ( 20.000000, -112.000000, 62.000000, 200.000000)
2013-04-08 17:04:19.266 TouchSelectApp[93618:c07] CGRect ( 0.000000, 300.000000, 320.000000, 88.000000)
2013-04-08 17:04:19.266 TouchSelectApp[93618:c07] CGRect ( 7.000000, 78.500000, 48.000000, 44.000000)

来自 (lldb) po [[UIApp keyWindow] recursiveDescription] 的输出 我必须添加一个额外的按钮来创建调试停止。我关心的按钮在 SelectableTag 里面。

$0 = 0x0887e0e0 <UIWindow: 0x7197a90; frame = (0 0; 320 568); autoresize = W+H; layer =    <UIWindowLayer: 0x7199620>>
   | <UIView: 0x719ed20; frame = (0 20; 320 548); autoresize = W+H; layer = <CALayer: 0x719edd0>>
   |    | <UIRoundedRectButton: 0x719b9d0; frame = (51 464; 73 44); opaque = NO; autoresize = TM+BM; layer = <CALayer: 0x719baf0>>
   |    |    | <UIGroupTableViewCellBackground: 0x719c2a0; frame = (0 0; 73 44); userInteractionEnabled = NO; layer = <CALayer: 0x719c370>>
   |    |    | <UIImageView: 0x719da50; frame = (1 1; 71 43); opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x719dd20>>
   |    |    | <UIButtonLabel: 0x719d0f0; frame = (12 12; 49 19); text = 'Button'; clipsToBounds = YES; opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x719d1e0>>
   |    | <UIView: 0x71a1160; frame = (0 300; 320 88); autoresize = RM+BM; layer = <CALayer: 0x71a11c0>>
   |    |    | <SelectableTag: 0x719fcc0; baseClass = UIScrollView; frame = (20 -112; 62 200); clipsToBounds = YES; autoresize = W+H; gestureRecognizers = <NSArray: 0x71a04e0>; layer = <CALayer: 0x719fef0>; contentOffset: {0, 0}>
   |    |    |    | <UIImageView: 0x71a0c20; frame = (55 193; 7 7); alpha = 0; opaque = NO; autoresize = TM; userInteractionEnabled = NO; layer = <CALayer: 0x71a0cc0>>
   |    |    |    | <UIImageView: 0x71a0dd0; frame = (55 62; 7 7); alpha = 0; opaque = NO; autoresize = LM; userInteractionEnabled = NO; layer = <CALayer: 0x71a0e70>>
   |    |    |    | <UIRoundedRectButton: 0x719ddd0; frame = (-1 7; 64 44); opaque = NO; layer = <CALayer: 0x719b630>>
   |    |    |    |    | <UIGroupTableViewCellBackground: 0x719d630; frame = (0 0; 64 44); userInteractionEnabled = NO; layer = <CALayer: 0x719b690>>
   |    |    |    |    | <UIImageView: 0x719dea0; frame = (1 1; 62 43); opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x719d990>>
   |    |    |    |    | <UIButtonLabel: 0x71a1630; frame = (12 12; 40 19); text = 'Test1'; clipsToBounds = YES; opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x71a1e50>>

(lldb)

【问题讨论】:

  • 使按钮进入不可点击状态。然后在调试器中暂停并运行:po [[UIApp keyWindow] recursiveDescription]。复制输出并将其粘贴到您的问题中。
  • @robmayoff 我将输出添加到原始帖子中。谢谢!
  • 哪个按钮不能按?标有“Button”的还是标有“Test1”的?
  • @robmayoff “Test1”是我无法按下的。我刚刚为断点添加了“按钮”。

标签: ios objective-c


【解决方案1】:

来自the documentation of hitTest:withEvent: in the UIView Class Reference

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

滚动视图的父级是地址为0x71a1160 的视图。注意滚动视图的frame.origin.y 是-112。所以滚动视图的前 112 个点超出了其父级的范围。滚动视图的那部分将永远不会收到触摸。您的 Test1 按钮完全位于滚动视图的那部分。

【讨论】:

  • 将父视图向上移动 112 点,然后将滚动视图向下移动相同的量。
【解决方案2】:

我也注意到 UIButtons 的这种行为。更改父视图的框架后,如果再次添加按钮,它将起作用。

【讨论】:

  • 这似乎是一个黑客行为。这一定有一个真正的原因。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多