2011-02-28 55 views
0

的頂部有麻煩隱藏鍵盤我在玩3項...使用隱形按鈕,它坐落在UIScrollView的

1)的UIView坐落在層次結構的基礎,包含的UIScrollView。 2)UIScrollview呈現冗長的用戶表單。 3)我用來提供「隱藏鍵盤」功能的UIScrollview上的不可見按鈕。

請注意下面的代碼,我註冊的時候會在鍵盤出現的時候收到通知,以及當它將要消失的時候。這些工作很好。

我的問題看似是「圖層」之一。請參閱下面我將按鈕插入視圖atIndex:0的位置。這會導致按鈕被激活並在滾動視圖後面「填充」,以便當您單擊它時,滾動視圖會抓取觸摸並且按鈕不知道。沒有辦法「觸及」按鈕並禁止鍵盤。

但是,如果我插入atIndex:1,該按鈕會超級強加在文本輸入字段的頂部,因此任何觸摸都將由按鈕執行,立即抑制鍵盤然後消失。

如何在UIScrollview頂部插入按鈕,但在坐在那裏的UITextfield後面?其他物流:我有一個 - (void)hidekeyboard函數,我用UIButtion設置爲IBAction()。我通過ctrl-drag/drop將UIButton連接到「文件所有者」。 (我需要這兩個公約?)

在viewDidLoad中此代碼()...

[[NSNotificationCenter defaultCenter] addObserverForName:UIKeyboardWillShowNotification object:nil queue:nil usingBlock:^(NSNotification *notification){ 

[self.view insertSubview:self.keyboardDismissalButton atIndex:0]; 

}]; 

回答

0

想通了......

這是答案。

下面的代碼都在UIViewController的ViewDidLoad()中。首先從UIView中完全刪除按鈕。 (當鍵盤被激活時它會被渲染)。

注意下面的鍵盤「WillShow」通知,我將按鈕插入我的UIScrollView層而不是UIView層,如前所述。但是,一旦按鈕被點擊並且鍵盤即將被解散,我就從UIView中完全刪除按鈕(即自己)。

[self.keyboardDismissalButton removeFromSuperview]; 


[[NSNotificationCenter defaultCenter] addObserverForName:UIKeyboardWillShowNotification object:nil queue:nil usingBlock:^(NSNotification *notification){ 

[theScroller insertSubview:self.keyboardDismissalButton atIndex:0]; 

}]; 



[[NSNotificationCenter defaultCenter] addObserverForName:UIKeyboardWillHideNotification object:nil queue:nil usingBlock:^(NSNotification *notification){ 

     [self.keyboardDismissalButton removeFromSuperview]; 

}]; 
0

有沒有辦法有一個觀點是在兄弟姐妹面前,但兄弟姐妹的孩子落後。您可以將該按鈕作爲滾動視圖的子項插入(位於所有文本框的後面),或者您可以覆蓋上視圖上的pointInside:withEvent:,以便在文本框上方返回false,否則返回true(實際上是「打洞」 )。

2

這是一個很好的方式來做到這一點,甚至不需要不可見的按鈕。這種方法僅適用於3.2以上的設備,但由於我們已經在NSNotificationCenter上使用了塊方法,因此我們知道我們至少在4.0。

代替一個按鈕,我們將點擊手勢識別器添加到我們的視圖中。此輕擊手勢識別器調用-dismissKeyboard:,然後我們要求我們的視圖結束所有編輯。此方法僅在3.2及更高版本上可用,並通過它的子視圖進行處理,直到它找到當前的第一個響應者併發送它-resignFirstResponder-endEditing:所需的布爾參數決定是否強制firstResponder的退出。該文檔有點含糊不清,但我認爲如果被迫,將不會調用UITextField上的-textFieldShouldEndEditing委託方法。

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    [[NSNotificationCenter defaultCenter] addObserverForName:UIKeyboardWillShowNotification object:nil queue:nil usingBlock:^(NSNotification *notification) { 
     UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(dismissKeyboard:)]; 
     tap.numberOfTapsRequired = 1; 
     tap.numberOfTouchesRequired = 1; 
     [self.view addGestureRecognizer:tap]; 
    }]; 

    [[NSNotificationCenter defaultCenter] addObserverForName:UIKeyboardWillHideNotification object:nil queue:nil usingBlock:^(NSNotification *notification) { 
     [self.view removeGestureRecognizer:[self.view.gestureRecognizers lastObject]]; 
    }]; 
} 

- (void)dismissKeyboard:(UIGestureRecognizer *)gesture 
{ 
    [self.view endEditing:NO]; 
} 
+0

謝謝,男人!這是好東西。 – phil 2011-03-02 05:17:49