uigesturerecognizerが
-
30-09-2019 - |
質問
これは予想されることですが、以前はプライベートAPIだったように適切に機能するランタイムを見つけることができないようです!!!!
私が持っている現時点では、OS3.1.3はAddgesturerEcognizerセレクターに応答します!!!!
if ( [self.view respondsToSelector:@selector(addGestureRecognizer:)] ) {
UIGestureRecognizer *recognizer;
recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(morePress)];
[self.view addGestureRecognizer:recognizer];
recognizer.delegate = self;
[recognizer release];
}
解決
システムバージョンを明示的に確認する必要があります。
NSString *currentSystemVersion = [[UIDevice currentDevice] systemVersion];
if([currentSystemVersion compare:@"3.2"] == NSOrderedAscending) {
//add gesture recognizer
} else {
// :(
}
他のヒント
uigesturerecognizerは、iOS 3.2より前にサポートされていません。メソッドであっても addGestureRecognizer:
存在しますが、それは安全に使用してもよいという意味ではありません。
それは確かにプライベートAPIであり、3.2より前のバージョンではサポートされていませんでした。
Appleのドキュメントは次のように述べています
実行時にアプリケーションでジェスチャー認識者を使用できるかどうかを判断するには、クラスが存在するかどうかをテストし、インスタンスを割り当ててセレクターLocationInviewに応答するかどうかを確認します。この方法は、iOS 3.2までクラスに追加されませんでした。
サンプルコード:
UIGestureRecognizer *gestureRecognizer = [[UIGestureRecognizer alloc] initWithTarget:self action:@selector(myAction:)];
if (![gestureRecognizer respondsToSelector:@selector(locationInView:)]) {
[gestureRecognizer release];
gestureRecognizer = nil;
}
// do something else if gestureRecognizer is nil
説明:
特定のiOSリリースで実行時にクラスが利用可能かどうかを判断するには、通常、クラスがゼロかどうかを確認します。残念ながら、このテストはUigestureRecognizerにとってきれいに正確ではありません。このクラスはiOS 3.2から公開されていましたが、それ以前の短期間で開発中でした。クラスは以前のリリースに存在しますが、ITおよびその他のジェスチャー認識クラスの使用は、その以前のリリースではサポートされていません。これらのクラスのインスタンスを使用しようとしないでください。
全文をご覧ください ここ.