2011-05-30 16 views

回答

15

好的有一個解決方案。以下適用於的UIActionSheet

// For detecting taps outside of the alert view 
-(void)tapOut:(UIGestureRecognizer *)gestureRecognizer { 
    CGPoint p = [gestureRecognizer locationInView:self]; 
    if (p.y < 0) { // They tapped outside 
     [self dismissWithClickedButtonIndex:0 animated:YES]; 
    } 
} 

-(void) showFromTabBar:(UITabBar *)view { 
    [super showFromTabBar:view]; 

    // Capture taps outside the bounds of this alert view 
    UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapOut:)]; 
    tap.cancelsTouchesInView = NO; // So that legit taps on the table bubble up to the tableview 
    [self.superview addGestureRecognizer:tap]; 
    [tap release]; 
} 

它的要點是添加一個手勢識別器的動作片的上海華,並測試所有水龍頭,看看他們是動作片上的子類。

+2

我目前正在嘗試這種解決方案,但是我發現UIAlertView吸收所有事件,所以tapOut:方法永遠不會被手勢識別器調用。因此,這個解決方案根本不起作用。 – StCredZero 2012-08-27 21:05:27

+0

我得到了與@StCredZero相同的結果。在8.1中,如果您使用的是UIAlertController,那麼添加一個UIAlertActionStyleCancel會給你帶來這種效果。在以前的版本中,無法添加此功能。 – 2014-11-13 17:13:28

4

它可能對你有用 用途:

- (void)dismissWithClickedButtonIndex:(NSInteger)buttonIndex animated:(BOOL)animated 

previous so question

+0

這可以解除它,但我仍然需要一些方法來捕獲'外部觸發'事件發生時,所以我可以調用這個函數。 – Chris 2011-05-30 04:33:37

+0

http://developer.apple.com/library/ios/#documentation/uikit/reference/UITapGestureRecognizer_Class/Reference/Reference.html – Aravindhan 2011-05-30 04:44:59

+0

我正在嘗試使用水龍頭手勢識別器,但我無法找到要附加的視圖它來。動作表的視圖?它的超級觀點?在'showfromtabbar'中傳遞給它的tabbar? *它的*超級觀點?他們都沒有工作... – Chris 2011-05-30 05:12:52

3

我認爲你正在尋找這種方法

- (void)dismissWithClickedButtonIndex:(NSInteger)buttonIndex animated:(BOOL)animated 

編輯

可以使用這個在你的動作表對象上,它工作得很好,但你不能在該表之外註冊事件,如灰色部分

可能是你的視圖控制器上使用的UITapGestureRecognizer比它可能的伎倆。

UITapGestureRecognizer *recognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(nothing)]; 
[actionSheet addGestureRecognizer:recognizer]; 
+0

再說一遍,這是我一旦有了一個處理程序,只要用戶在外面打開就會調用它。但是捕捉'外部攻擊'事件是我的問題。謝謝 – Chris 2011-05-30 04:41:40

+0

通過將GR添加到操作表或容器視圖不起作用。 – 2011-07-29 05:02:29

+0

那麼你還沒有嘗試過,因爲在我的情況下,它的工作。 – Robin 2011-07-29 05:10:11

0

,因爲動作片覆蓋整個視圖片的形式按鈕一些透明的黑色鑑於iPhone手機,但在ipad這種行爲在默認情況下呈現你不能這樣做,通過點擊之外。

因此用於觸摸外部你不能調用觸摸方法。所以我不這麼認爲,你可以這樣做,並且當蘋果在操作表中提供一個取消按鈕時,爲什麼不使用該按鈕而不是這個。

+0

我們有一個自定義的操作表,其中有一個表格提供了很多選項,覆蓋了正常的按鈕,這就是爲什麼我要這樣做。 – Chris 2011-05-30 05:06:09

+0

那麼你爲什麼不嘗試觸摸方法touchesBegain。 – Ishu 2011-05-30 05:14:52

0

這不回答這個問題準確,但這裏是我做的項目之一(從增加額外這樣可以防止「完成」按鈕或「外部點擊」的東西),當點擊關閉選擇器:

落實在其中創建一個UILabel的viewForRow選擇器的委託方法並返回它:

- (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view 

在這些自定義行標籤,添加自來水動作處理程序:

UITapGestureRecognizer *tapAction = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleClick:)]; 
[label addGestureRecognizer:tapAction]; 

在​​回調,關閉該開放片(包含該選擇器視圖的一個):

[pickerSheet dismissWithClickedButtonIndex:0 animated:TRUE]; 
0

使用showFromRect,例如:

UIView *barButtonView = [barButtonItem valueForKey:@"view"]; 
CGRect buttonRect = barButtonView.frame; 

[actionSheet showFromRect:buttonRect inView:self.view animated:YES]; 
0
在iOS7

我在gestureRecognizerShouldBegin添加dismissWithClickedButtonIndex味精,它的工作原理。

1

將UIActionSheet的cancelButtonIndex屬性設置爲有效值後,輕敲外部將關閉UIActionSheet。我已經在iOS 9中嘗試過了。但是,如果此cancelButtonIndex未設置爲錯誤值(例如,一個超過UIActionSheet中按鈕總數的指數),在外部點擊時不會發生任何事情。

1

不需要任何點擊手勢。只需使用UIAlertActionStyleCancel操作即可。

0

使用。取消 UIAlertActionStyle作爲選項。