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:から:

レシーバーの境界外にあるポイントは、実際にはレシーバーのサブビューの 1 つにある場合でも、ヒットとして報告されることはありません。これは、現在のビューのclipsToBoundsプロパティが に設定されてNOいて、影響を受けるサブビューがビューの境界を超えている場合に発生する可能性があります。

スクロール ビューの親は、 address を持つビューです0x71a1160。スクロール ビューframe.origin.yが -112 であることに注意してください。したがって、スクロール ビューの上位 112 ポイントは、親の境界の外にあります。スクロール ビューのその部分がタッチされることはありません。Test1 ボタンは完全にスクロール ビューのその部分にあります。

于 2013-04-08T23:58:12.380 に答える
1

UIButtons でもこの動作に気付きました。親ビューのフレームを変更した後、再度ボタンを追加すると動作します。

于 2013-04-08T21:22:05.960 に答える