iPadアプリのメイン画面の上部にUIToolbarがあります。6つのUIBarButtonItemがあります。これらのアイテムのうち4つは、UIPopOversの表示をトリガーします。他の2つの項目は、別のビューに切り替えるか、現在のビューについて何かを変更します。
4つのUIPopOverのうち3つはタップされたUIBarButtonItemから表示され、4つ目は画面の中央に矢印なしで表示されます。
次の機能が欲しいのですが、うまくいきません。
- UIPopOversが表示されず、ユーザーがUIPopOverを生成するUIBarButtonItemsの1つをタップした場合、UIPopOverを表示します(非常に単純です。これが機能します)。
- UIPopOverが表示され、ユーザーがUIToolbarをタップしたら、そのUIPopOverを閉じます。(1回タップするUIGestureRecognizerを使用してこれを機能させました。)
- UIPopOverが表示され、ユーザーがUIBarButtonItemをタップしてUIPopOverが「タイ」になったら、UIPopOverを閉じます。(これが私にとっての問題です。)
- UIPopOverが表示され、ユーザーが別のUIBarButtonItemをタップしたら、現在のUIPopOverを閉じて、適切な新しいUIPopOverを表示します。(これは正常に機能しています。)
したがって、私が直面している問題は、ボタンをタップする前にUIGestureRecognizerが起動することです。また、ユーザーがUIBarButtonItemを押しているときにUIGestureRecognizerを「オプトアウト」する良い方法を見つけることができません(したがって、UIBarButtonItemではなくUIToolbar自体がタップされたときにのみUIGestureRecognizerのアクションを起動します)。この結果、UIPopOverが(UIBarButtonItemから)表示され、ユーザーが同じUIBarButtonItemをタップすると、UIPopOverが閉じられ、再び表示されます。
「toolbarTapped」フラグを0.10秒間YESに設定してから、NO(またはそのようなもの)に戻すという、ある種のタイミングの問題を回避しようとしています。
私はこれを本当にエレガントに(そしてハックではなく)行う方法を見つけたいと思っています。
UIGestureRecognizerが最初に起動し、UIBarButtonItemのフレームを取得するための適切な(非プライベート)方法がないように見えるため、UIGestureRecognizerがUIBarButtonItemタッチに基づいてトリガーされた時期を判断する方法が見つからないようです。
基本的に、私はUIToolbarとそのUIBarButtonItemsを合理的な人が期待するように動作させようとしていますが、壁に頭をぶつけています。
UIGestureRecognizerのコードは次のとおりです。
// Initialization
UITapGestureRecognizer *tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(removeAllPopOvers)];
[tapRecognizer setCancelsTouchesInView:NO];
[tapRecognizer setNumberOfTapsRequired:1];
[tapRecognizer setNumberOfTouchesRequired:1];
[[self Toolbar] addGestureRecognizer:tapRecognizer];
// Tap handler
- (void)removeAllPopOvers {
NSLog(@"removing all popovers");
if ([self firstPopOver]) {
[[self firstPopOver] dismissPopoverAnimated:YES];
[self setFirstPopOver:nil];
}
// and so on with the rest...
}
そして、これが私のUIPopOversの1つがどのように表示されるかです:
- (IBAction)showSettings:(id)sender {
NSLog(@"settings button tapped");
if (![self SettingsPopOver]) {
SettingsViewController *settingsVC = [[SettingsViewController alloc] initWithNibName:@"SettingsView-iPad" bundle:nil];
UIPopoverController *popOver = [[UIPopoverController alloc] initWithContentViewController:settingsVC];
[popOver setDelegate:self];
[self setSettingsPopOver:popOver];
[[self SettingsPopOver] setPopoverContentSize:CGSizeMake(320, 300)];
[[self SettingsPopOver] presentPopoverFromBarButtonItem:[self Settings] permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
}
}
これらすべての正味の効果は、次の2つのオプションのいずれかを選択できることです(両方ではありません)。
- UIBarButtonItemがUIPopOverを閉じることを許可します。
- UIToolbarをタップして、UIPopOverを閉じます。
何か案は?
ありがとう!