web-dev-qa-db-ja.com

UIView-「ユーザーインタラクションが有効」親でfalse、子でtrue?

親ビューでuserInteractionEnabled = NOを指定すると、すべてのサブビューでユーザーの操作が妨げられるようです。これは正しいです?これを回避する方法はありますか?

56
morgancodes

正しいです。親ビューでuserInteractionEnabledをNOに設定すると、すべてのサブビューにカスケードされます。一部のサブビューでインタラクションを有効にし、他のサブビューを有効にしない場合、サブビューを2つの親ビューに分割できます。1つはuserInteractionEnabled = YES、もう1つはNOです。次に、これらの2つの親ビューをメインビューに配置します。

35
lazycs

私はちょうど奇妙な状況に遭遇しました。 UIView(これをVと呼ぶ)があり、サブビューとしてUIButtonがあります。このUIButton、ボタンXを呼び出します。以下は、ボタンXのターゲット/セレクターに使用しているメソッドです。以下は、ビューVです。送信側パラメーターは、ボタンXです。

私が問題を引き起こしている状況は、UIの別のボタン(ナビゲーションバーで、このボタンをYと呼びます)をタッチし、ボタンXを非常にすばやくタッチすると、ボタンYアクションがビューVを無効にし、ボタンXに送信されたタッチイベント。

- (void) buttonAction: (UIButton *) sender
{
    NSLog(@"superview: %d", sender.superview.userInteractionEnabled);  
    NSLog(@"button itself: %d", sender.userInteractionEnabled);

    // <snip>
}

出力は次のとおりです。

2014-12-19 16:57:53.826 MyApp [6161:960615] superview:0
2014-12-19 16:57:53.826 MyApp [6161:960615]ボタン自体:1

つまり、ボタンアクションが発生し、ボタンのスーパービューでユーザー操作が無効になりました。そして、サブビューはまだユーザーとの対話を有効にしていました!!

IPad(iOS 8.1.2を実行)で実行している私のアプリのUIで、これが人為的であると考えている人のために、これはアプリの使用中に偶然に発生しました。それは、私がもともと生成していたものではありませんでした試行

考え?

私の現在の回避策を以下に示しますが、それが必要であることは本当に奇妙に思えます!

- (void) buttonAction: (id) sender
{
    NSLog(@"superview: %d", sender.superview.userInteractionEnabled);  
    NSLog(@"button itself: %d", sender.userInteractionEnabled);
    if (! self.userInteractionEnabled) return;

    // <snip>
}
2
Chris Prince

私はこれのために奇妙な解決策を作りました、私はタッチ可能にしたいが、親は持ってはいけないtableViewセルに子ビューがありました...

上記の解決策はどちらもうまくいきませんでしたが、別の解決策を見つけました。ストーリーボードに移動し、tapGestureRecognizerを親ビューに追加して、親ビューのタッチを吸収します。問題が解決しました!

0
Alfi

私はこれを「カスタムアラートコントローラー」ビューであるxibで実行しています。

for (UIView *subview in self.superview.subviews) {

    if (![subview isEqual:self]) {
        subview.userInteractionEnabled = NO;
    }
}
0
NeoGER89