親ビューでuserInteractionEnabled = NOを指定すると、すべてのサブビューでユーザーの操作が妨げられるようです。これは正しいです?これを回避する方法はありますか?
正しいです。親ビューでuserInteractionEnabledをNOに設定すると、すべてのサブビューにカスケードされます。一部のサブビューでインタラクションを有効にし、他のサブビューを有効にしない場合、サブビューを2つの親ビューに分割できます。1つはuserInteractionEnabled = YES、もう1つはNOです。次に、これらの2つの親ビューをメインビューに配置します。
私はちょうど奇妙な状況に遭遇しました。 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>
}
私はこれのために奇妙な解決策を作りました、私はタッチ可能にしたいが、親は持ってはいけないtableViewセルに子ビューがありました...
上記の解決策はどちらもうまくいきませんでしたが、別の解決策を見つけました。ストーリーボードに移動し、tapGestureRecognizerを親ビューに追加して、親ビューのタッチを吸収します。問題が解決しました!
私はこれを「カスタムアラートコントローラー」ビューであるxibで実行しています。
for (UIView *subview in self.superview.subviews) {
if (![subview isEqual:self]) {
subview.userInteractionEnabled = NO;
}
}