0

UIViewサブクラスがあります。PopupViewと呼びましょう。このPopupViewの中には、カスタムuiviewとuibutton (2)が入ったNavigationBarがあります。また、PopupViewのすぐ内側にUIButton (1)があります。

PopupView
  - UIButton (1)
  - UINavigationBar
    - UINavigationItem
      - UIBarButtonItem
        - UIView
          - UIButton (2)

uinavigationbarの狂気のこのuibuttonの理由は、uibuttonのbackgroundimagesに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アニメーションを使用せず、新しいフレームを直接設定した場合にも発生します。viewDidLoadまた、クリックでサイズを変更するか、 viewControllerで直接サイズを変更するかは関係ありません。

なぜこれが起こるのか考えはありますか?

4

2 に答える 2

4

recursiveDescriptionHeerはあなたの出力の関連部分です:

|    | <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ビューの内部では、0xab1MoviePopupViewの高さは300ポイントで、(Yの原点が-70で)0x9d6ビューの「内側」の中央に配置されていますが、0x9d6ビューの上端と下端を超えてこぼれています。

プロパティのデフォルト値clipsToBoundsはNOであるため、0x9d6ビューはその0xab1サブビューのコンテンツを視覚的にクリップしません。したがって、ボタンは引き続き画面に表示されます。

ただし、ヒットテストは常にビューの境界にクリップします。したがって、ボタンの1つに触れようとすると、ヒットは0x9d6ビュー(高さ160ポイントのみ)の境界外になります。0x9d6ビューは、MoviePopupViewまたはその下のボタンに到達する前にタッチを拒否します。

これはhitTest:withEvent:ドキュメントに記載されています:

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

于 2012-10-19T19:23:43.170 に答える
0

ボタンの位置が表示されないため、確実に言うことはできませんが、ボタンを含むUIViewに背景色を指定すると(またはサブビューをクリップするように設定すると)、サイズ変更が原因でボタンをフレームの外側に配置して、クリックできないようにします。

于 2012-10-19T19:11:44.107 に答える