2012-02-24 11 views
1

iPadアプリのメイン画面の上部にUIToolbarがあります。それには6つのUIBarButtonItemがあります。これらのアイテムのうち4つがUIPopOversをトリガします。他の2つのアイテムは、別のビューに切り替えるか、または現在のビューについて何かを変更します。iOS - PopOverプレゼンテーションと解雇

タップされたUIBarButtonItemから4つのUIPopoverが表示されますが、4番目の矢印は画面の中央に矢印が表示されません。

私は、次の機能をしたいと思いますが、難易度それになったのです。何UIPopOversが表示されず、ユーザーがUIPopOverを生成UIBarButtonItemsのいずれかをタップ、UIPopOver(非常にシンプルことを示しているとき

  1. を。これが動作しています。)
  2. UIPopOverが表示され、ユーザーがUIToolbarをタップすると、そのUIPopOverを閉じます。 (1タップかかるUIGestureRecognizerを使用しています)
  3. UIPopOverが表示され、ユーザーがUIPopOverが「TIED」になるまでUIBarButtonItemをタップすると、UIPopOverが閉じられます。
  4. UIPopOverが表示され、ユーザーが別のUIBarButtonItemをタップすると、現在のUIPopOverを却下し、適切な新しいUIPopOverを表示します。 (これは問題ありません)

私が直面している問題は、ボタンタップの前にUIGestureRecognizerが起動することです。また、ユーザーがUIBarButtonItemを押しているときに、UIGestureRecognizerを「オプトアウト」する良い方法を見つけることができません(したがって、UIToolbar自体がタップされたときにUIGestureRecognizerのアクションが発生するだけで、UIBarButtonItemは発生しません)。この結果、UIPopOverが(UIBarButtonItemから)表示され、ユーザーが同じUIBarButtonItemをタップすると、UIPopOverは終了し、再び表示されます。

私は、「toolbarTapped」フラグを0.10秒間YESに設定し、NO(またはそのようなもの)に戻すようなタイミングの問題を回避しようとしています。

私は真にこれをエレガントに(そしてハックインではなく)行う方法を見つけたいと思います。

UIGestureRecognizerが最初に起動し、フレームを取得するための良い(非プライベート)方法ではないように見えるので、UIBestureRecognizerがUIBarButtonItemタッチに基づいてトリガされたタイミングを判断する方法が見つからないようです。 UIBarButtonItemの

基本的には、私はUIToolbarとそのUIBarButtonItemsを、合理的な人が期待する方法で動作させるようにしようとしていますが、壁に頭を打つのです。

ここUIGestureRecognizerのためのコードです:このすべての正味の効果は、Iのいずれかを選択することができるということです

- (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]; 
    } 
} 

// 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のいずれかが表示されます次の2つのオプションに従ってください(両方ではありません)。

  1. UIBarButtonItemがUIPopOverを閉じることを許可します。
  2. UIToolbarをタップしてUIPopOverを閉じることができます。

ありがとうございます!

答えて

0

今のところ、私は機能するものを実装しましたが、エレガントではありません(少なくとも、私はそうは思わない)。

基本的に、私がやっていることは遅延が「バッファ」メソッドに最初にそれを送信することにより、UIGestureRecognizerからのアクションです:

#pragma mark - PopOver Dismissal 
// dismissAllPopOversBuffer is called as the action of my UIGestureRecognizer 
- (void)dismissAllPopOversBuffer { 
    NSLog(@"dismiss all popovers buffer..."); 
    [self performSelector:@selector(dismissAllPopOvers) withObject:nil afterDelay:0.1]; 
} 
- (void)dismissAllPopOvers { 
    NSLog(@"dismissing all popovers"); 
    // actual dismissal logic 
} 

あなたが見ることができるように、これはアウト0.1秒を実際の解雇ロジックをプッシュします。その後、ボタンを押す方法のそれぞれで、私はこれを行う:

#pragma mark - UIBarButtonItem Press Event Handlers 
- (IBAction)buttonPressed:(id)sender { 
    [NSObject cancelPreviousPerformRequestsWithTarget:self 
              selector:@selector(dismissAllPopOvers) 
               object:nil]; 
    // The rest of the logic to dismiss/show UIPopOver 
} 

はこれまでのところ、私のテストは、それが動作するように示しています。 NSLogのタイムスタンプに基づいて、UIGestureRecognizerアクションとUIBarButtonItemイベントの間の実際の経過時間は、通常1ミリ秒(0.001秒)だったので、ほとんどの場合、0.1秒(または通常のタイムラプスの100倍)を押し出すべきですが、それが好きではありません。

ユーザーがUIToolbarをタップしたときにUIBoolButtonItemsをタップしたときを判断する方法を見つけたいと思います。それはかなり(論理的に)かなり簡単だがかなり難しい(実質的に)ようだ。問題3用

0

:ポップオーバーが表示されている

if ([self.popoverController isPopoverVisible]) 
    [self.popoverController dismissPopoverAnimated:YES]; 
else 

場合、それはそれを却下します。それ以外の場合は、ポップオーバーを作成します。

残りの部分は、ツールバーをタッチするとポップオーバーを解除するだけですか?ユーザーが画面上の他の場所に触れると、ポップオーバーを維持しますか?

popoverコントローラには、あなたがそれにuiviewを追加することができると信じているので、実際にメインビューに追加してタッチすると、ポップオーバーが解除されません。私はこの仕組みが完全にはわからないので、掘り起こす必要があります。

https://developer.apple.com/library/ios/#documentation/uikit/reference/UIPopoverController_class/Reference/Reference.html

+0

いいえ、ユーザーが画面のどこかに触れるたびにいつものように自動的に解除します。最初の問題は、 "生成"ボタンをタップしてもPopOver(私が修正したもの)を却下しないということでしたが、UIToolbarをタップしても解消できませんでした(私は理解できませんでした。 – mbm29414

+0

また、ユーザーがUIToolbarをタップしたときにPopOversを終了するための「修正」を実装するまで、問題3を実行しました。 – mbm29414

+0

ボタンが入っているツールバーをタップすると、私のpopoverは却下しません。 – Padin215

0

だから私は、私にとって、これは私のスクロールのパンジェスチャーやスワイプジェスチャが新しいを呼び出すことが許可され(ジェスチャ認識装置のデリゲートを実装して、以下のメソッドを呼び出すことにより、同時に認識2つのジェスチャーを持つ解決同時に登録するためのポップアップ表示):

(BOOL)gestureRecognizer:(UIGestureRecognizer*)gestureRecognizer  
shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer*)otherGestureRecognizer 
{ 
    return YES; 
} 
関連する問題