2015-05-24 149 views
1

此問題源於我以前的問題dismiss keyboard on tapping on any UIControl object如何在使用水龍頭關閉UIKeyboard時忽略所有UIControl水龍頭

因此,當用戶有一個鍵盤存在時,我希望用戶能夠點擊鍵盤或UITextView之外的任何位置來關閉鍵盤。這有效......但我也希望那個「第一次」敲擊關閉鍵盤不會導致任何其他動作。

UIKeyboard目前...用戶點擊任何地方關閉,碰巧點擊一個UIButtonUIKeyboard已關閉,並且UIButton的操作未發送。


我試圖把

@IBAction func blahblah(sender: UIButton){ 
    if keyboardShow == false {//UIButtons action here 
    } 
} 

但隨着一些println()測試中,它顯示的是,鍵盤被關閉(因此keyboardShow設置爲false)UIButton以前註冊的水龍頭。

回答

2

但我也希望「第一次」點擊關閉鍵盤不會導致任何其他操作。

你可以像你這樣做,但這是非常不靈活的,因爲你必須單獨處理所有其他控件。

最簡單的方法就是在整個「屏幕」上放置一個不可見的視圖(即將其添加到視圖控制器的視圖中,位於所有視圖的前面) - 除了它應位於文本視圖。

text view 
secret invisible view 
all other views (buttons etc.) 

通常情況下,你的祕密隱形視圖的userInteractionEnabledfalse,所以水龍頭剛好落在通過對什麼是它背後,彷彿無形的看法甚至不存在。用戶可以點擊按鈕等。

但是,當您顯示鍵盤時,您還將您的祕密隱形視圖的userInteractionEnabled設置爲true,併爲其指定一個輕擊手勢識別器。因此,當用戶在文本視圖之外輕擊時,輕擊手勢識別器響應,並且您關閉鍵盤。

當您關閉鍵盤時,您將反轉所有這些:刪除輕擊手勢識別器並將不可見視圖的userInteractionEnabled變爲false

我在應用程序中始終使用這種技巧。

也可能是更復雜的:把你的干擾無形鑑於一切的前面,並覆蓋其觸摸操作(hitTest:)。這裏有一個觀點的一個例子是阻止除觸摸所有觸摸將在一個特定的passthruView位於土地背後

class BlockerView: UIView { 
    weak var passthruView : UIView! 
    override func hitTest(point: CGPoint, withEvent event: UIEvent?) -> UIView? { 
     if let pv = self.passthruView { 
      let pt = pv.convertPoint(point, fromView: self) 
      if pv.pointInside(pt, withEvent: event) { 
       return nil // let the touch fall thru 
      } 
     } 
     return super.hitTest(point, withEvent: event) 
    } 
} 
+0

是的,我想這樣做,但我有多個TextEditing控制,這將是乏味帶來除了當前的文本編輯控件之外,其他所有內容都不可見。 – Dustin

+0

不,它不會。重新排列視圖的分層順序很容易。你做什麼是單調乏味的。 – matt

+0

好吧,我可能不得不這樣做,因爲,我剛剛爲UIButton工作,但沒有爲UITableView工作,你可以舉一個例子。說我有5個UITextViews。我如何將隱形按鈕置於其他四個以上,但低於當前? – Dustin