2012-02-24 15 views
1

我有我的iPad應用程序的主屏幕頂部的UIToolbar。它有6個UIBarButtonItems。其中4個項目觸發UIPopOver出現。其他2個項目可以切換到不同的視圖或改變當前視圖的某些內容。iOS版 - 酥料餅的介紹和解僱

4個UIPopOvers 3出現從抽頭的UIBarButtonItem,所述第四顯示而不在屏幕的中間的箭頭。

我想下面的功能,但我有困難得到它:

  1. 當顯示沒有UIPopOvers和用戶點擊產生一個UIPopOver的UIBarButtonItems之一,表明UIPopOver(非常簡單;得到了這個工作。)
  2. 當顯示UIPopOver和用戶點擊的UIToolbar,關閉那些UIPopOver。 (使用需要1次點擊的UIGestureRecognizer才能正常工作。)
  3. 當顯示UIPopOver並且用戶點擊UIPopOver爲「TIED」的UIBarButtonItem時,關閉UIPopOver。 (下面是我的問題。)
  4. 當顯示UIPopOver和用戶水龍頭的UIBarButtonItem另一個,關閉當前UIPopOver並顯示相應的新的。 (這是工作正常。)

所以,我面臨的問題是,UIGestureRecognizer觸發按鈕水龍頭之前。我還不能找到一個很好的方式向UIGestureRecognizer的「退出」,當用戶按下的UIBarButtonItem(因此,僅燒製UIGestureRecognizer的行動時,UIToolbar本身被竊聽,而不是一個的UIBarButtonItem)。這樣做的最終結果是,當顯示UIPopOver(來自的UIBarButtonItem),和用戶輕敲相同的UIBarButtonItem,所述UIPopOver被駁回,然後重新出現。

我試圖避免某種時間問題,我在0.10秒將「toolbarTapped」標誌設置爲YES,然後將其設置回NO(或類似的東西)。

我想找到一種方法,真正做到這一點優雅(和沒本事-Y)。

我似乎無法找到一種方法來確定自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之一所示:

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

這一切的最終結果是,我可以選擇的一個遵循兩個選項(但不是全部):

  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上點擊,但沒有任何UIBarButtonItems。這看起來相當簡單(邏輯上),但相當困難(實際上)。

0

的問題3:

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

如果酥料餅是可見的,它會關閉它;否則你創建popover。

其餘的,你是否只希望popover忽略,如果工具欄被觸摸?如果用戶觸摸屏幕上的任何其他位置,您希望彈出窗口保留?

popover控制器有一個passthroughViews正確的,我相信可以讓你添加一個uiview,所以實際上如果你添加一個主視圖和它的觸摸,它不會觸發popover關閉。我不完全確定這是如何工作的,你需要做一些挖掘。

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

+0

沒有,我想它會自動解僱像往常一樣,每當用戶觸摸其他地方在屏幕上。最初的問題是,點擊「生成」按鈕不會消除彈出窗口(我固定),但同時點擊UIToolbar不會解僱(我不明白,但也得到解決)。 – mbm29414 2012-02-24 19:02:36

+0

此外,我有問題#3工作,直到我實施「修復」用戶點擊UIToolbar時解散PopOver。 – mbm29414 2012-02-24 19:04:04

+0

是的,如果我點擊該按鈕所在的工具欄,我的彈出窗口不會消失。 – Padin215 2012-02-24 19:38:42

0

所以我解決了有2點手勢通過實現手勢識別的委託,然後調用下面的方法在認可的同時(對我來說,這讓我的移動手勢滾動和滑動手勢調用一個新的查看彈出同時註冊):

(BOOL)gestureRecognizer:(UIGestureRecognizer*)gestureRecognizer  
shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer*)otherGestureRecognizer 
{ 
    return YES; 
}