1

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)

4

2 回答 2

3

UIView Class Reference的文档hitTest:withEvent:

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

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

于 2013-04-08T23:58:12.380 回答
1

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

于 2013-04-08T21:22:05.960 回答