1

これは予想されることですが、以前はプライベート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];


    }
4

3 に答える 3

3

UIGestureRecognizerは、iOS3.2より前ではサポートされていません。メソッドaddGestureRecognizer:が存在する場合でも、それが安全に使用できることを意味するわけではありません。

于 2010-11-10T07:28:29.107 に答える
3

システムバージョンを明示的に確認する必要があります。

NSString *currentSystemVersion = [[UIDevice currentDevice] systemVersion];
if([currentSystemVersion compare:@"3.2"] == NSOrderedAscending) {
    //add gesture recognizer
} else {
    // :(
}
于 2010-11-10T09:07:43.113 に答える
0

これは確かにプライベートAPIであり、3.2より前のバージョンではサポートされていませんでした。

Appleのドキュメントによると:

アプリケーションでジェスチャレコグナイザーを使用できるかどうかを実行時に判断するには、クラスが存在するかどうかをテストし、存在する場合はインスタンスを割り当てて、セレクターlocationInView:に応答するかどうかを確認します。このメソッドは、iOS3.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リリースで実行時にクラスが使用可能かどうかを判断するには、通常、クラスがnilであるかどうかを確認します。残念ながら、このテストはUIGestureRecognizerに対して完全に正確ではありません。このクラスはiOS3.2から公開されていましたが、その少し前に開発中でした。このクラスは以前のリリースに存在しますが、そのクラスおよび他のジェスチャ認識クラスの使用は、その以前のリリースではサポートされていません。これらのクラスのインスタンスを使用しようとしないでください。

ここで全文をチェックしてください。

于 2012-11-05T14:44:05.390 に答える