[iOS]ストーリーボードでマルチタップの優先度を設定したい
このメソッド、UIViewControllerのカテゴリに仕込むと幸せになれます。要するに「数の多いタップジェスチャを先に処理する」ように設定するものです。
この処理が必要なストーリーボードのviewDidLoadメソッドで[self tapPriolityChange];
のように呼んでおけばオシマイ。
Objective-Cの良さって、Objectのpropertyの値でソートします、みたいなのがまあまあ簡単に書けちゃうところにあるんだよね、的な。それにしても、この書き方、色々なところで応用できそうですね。
//ストーリーボードで生成したtapジェスチャで複数回タップを優先処理させるための設定を行うための初期化メソッド
-(void)tapPriolityChange
{
NSMutableArray *sorting = [NSMutableArray new];
NSSortDescriptor *tapsSortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"self.numberOfTapsRequired" ascending:YES];
NSArray *grs = [[self view]gestureRecognizers];//viewに設定されているジェスチャーレコグナイザの配列を取り出す。
if (!sorting || !tapsSortDescriptor || !grs)//データが揃ってなければ終了
{
sorting = nil; tapsSortDescriptor = nil; grs = nil;
return;
}
for ( id gr in grs )//高速列挙にて、UITapGestureRecognizerのみを取り出す
{
if([gr isMemberOfClass:[UITapGestureRecognizer class]])
{
[sorting addObject:(UITapGestureRecognizer*)gr];
}
}
NSArray *sortedGrs = [sorting sortedArrayUsingDescriptors:@[tapsSortDescriptor]];//Tap数でascendソートした結果をsortedGrsへ
if (sortedGrs && sortedGrs.count > 1)//タップジェスチャーが複数ある場合だけ優先度を付ける。ascendソート済みなので、後ろのものが優先されるように設定する
{
for (int i = 1; i < sortedGrs.count; i++)
{
[(UITapGestureRecognizer*)sortedGrs[i-1] requireGestureRecognizerToFail:(UIGestureRecognizer *)sortedGrs[i]];
}
}
sorting =nil; tapsSortDescriptor = nil; grs = nil; sortedGrs = nil;
return;
}
Author And Source
この問題について([iOS]ストーリーボードでマルチタップの優先度を設定したい), 我々は、より多くの情報をここで見つけました https://qiita.com/tax68k/items/9da4a23871bd3b9e3d25著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .