2016-11-27 99 views
-2

我環顧四周,發現this後顯示鍵盤出現時移動視圖。它工作的很好,隨時隨地移動鍵盤,我點擊一個UITextField。問題是我有三個UITextField s,並且只有當鍵盤出現在UITextField以上時,鍵盤纔會移動。我也查看了蘋果documentation,並發現了一些有用的信息,但我仍然沒有獲得所需的功能。當鍵盤顯示在UITextField上時移動視圖

func keyboardWillShow(notification: NSNotification) { 
    if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue { 
     var aRect = self.view.frame; 

     aRect.size.height -= keyboardSize.size.height 

     if self.view.frame.origin.y == 0{ 
      if aRect.contains(activeField.frame.origin){ 
       self.view.frame.origin.y -= keyboardSize.height 
      } 
     } 
    } 
} 

func textFieldDidBeginEditing(_ textField: UITextField) { 
    activeField = textField 
} 

func textFieldDidEndEditing(_ textField: UITextField) { 
    activeField = nil 
} 

func keyboardWillHide(notification: NSNotification) { 
    if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue { 
     if self.view.frame.origin.y != 0{ 
      self.view.frame.origin.y += keyboardSize.height 
     } 
    } 
} 

從Apple文檔我只是把我在那裏創建aRect,然後檢查點與contains功能交叉的部分。我希望這會讓視圖僅在鍵盤與文本框重疊時才移動,否則保持視圖不變。由於某些原因,我不完全瞭解,情況並非如此。在任何文本字段被點擊的情況下,鍵盤將移動視圖(即使對於某些它不應該)。我現在玩了一會兒,並嘗試調試但未成功。有任何想法嗎?

編輯:我做了一些調試,似乎aRect.contains(...)返回true時,所有的文本字段被點擊,但實際上它不應該。是否包含正確的使用方法?

+0

請檢查我編輯的答案。 –

回答

1

我跟着這種方式來管理你可以在視圖管理的TableView同樣這樣的問題在這裏是一步一步的代碼:

內viewDidLoad中添加registerForKeyboardNotifications()

這裏是方法

func registerForKeyboardNotifications() { 
     NSNotificationCenter.defaultCenter().addObserver(self, selector: "keyboardWasShown:", name: UIKeyboardDidShowNotification, object: nil) 
     NSNotificationCenter.defaultCenter().addObserver(self, selector: "keyboardWillBeHidden:", name: UIKeyboardWillHideNotification, object: nil) 
    } 

再次定義其他方法:

func keyboardWasShown(aNotification: NSNotification) { 
     let info = aNotification.userInfo as! [String: AnyObject], 
     kbSize = (info[UIKeyboardFrameBeginUserInfoKey] as! NSValue).CGRectValue().size, 
     contentInsets = UIEdgeInsets(top: 0, left: 0, bottom: kbSize.height, right: 0) 

     electricalViewListTableview.contentInset = contentInsets 
     electricalViewListTableview.scrollIndicatorInsets = contentInsets 

     // If active text field is hidden by keyboard, scroll it so it's visible 
     // Your app might not need or want this behavior. 
     var aRect = self.view.frame 
     aRect.size.height -= kbSize.height 

     if let activeTF = activeField { 
      if !CGRectContainsPoint(aRect, activeTF.frame.origin) { 
       electricalViewListTableview.scrollRectToVisible(activeTF.frame, animated: true) 
      } 
     } 
    } 

鍵盤隱藏方法:

func keyboardWillBeHidden(aNotification: NSNotification) { 
     let contentInsets = UIEdgeInsetsZero 
     electricalViewListTableview.contentInset = contentInsets 
     electricalViewListTableview.scrollIndicatorInsets = contentInsets 
    } 

這種使用方法UITextFieldDelegates跟蹤活動的文本框後: VAR activeField:的UITextField?

func textFieldDidBeginEditing(textField: UITextField) { 
    self.activeField = textField 
} 

func textFieldDidEndEditing(textField: UITextField) { 
    self.activeField = textField 
} 

希望它有幫助!

1

嘗試IQKeyboardManager。它會自動管理文本字段以使其可見。您只需將其添加到您的項目中,而無需編寫一行代碼。從它一塊的文檔:

通常在開發一個應用程序,我們遇到了一個問題,其中iPhone 鍵盤向上滑動並覆蓋的UITextField/UITextView的。 IQKeyboardManager可讓您防止鍵盤滑動並覆蓋UITextField/UITextView,而無需輸入任何 代碼,無需其他設置。要使用IQKeyboardManager,您只需將源文件添加到您的項目中即可。

編輯:除了Rmaddy的回答,我只能說,你應該考慮改變if aRect.contains(activeField.frame.origin)if !aRect.contains(activeField.frame),因爲第一次檢查將返回true即使你的文本框的頂部視圖的框架,並另外,你應該檢查它是否不包含你的文本框的框架,然後改變視圖的框架。 而且,我並不完全確定,但是,如果您將activeField = textField代碼移至textFieldShouldBeginEditing委託方法,可能會更好。

+1

問題是關於發佈的代碼。這個「答案」沒有試圖解釋發佈的代碼不工作的原因。 – rmaddy

+0

是的,我也想回答這個問題,沒有那麼多時間。我會添加答案。 –

1

您的keyboardWillShow代碼有兩個主要問題。

  1. 您正在使用錯誤的鍵來獲取鍵盤框架。您需要UIKeyboardFrameEndUserInfoKey,而不是UIKeyboardFrameBeginUserInfoKey。你想知道鍵盤將在哪裏結束,而不是從哪裏開始。
  2. 一旦你得到鍵盤的框架,你需要將其轉換爲本地座標。它以屏幕座標給你。

你更新的代碼將是:

func keyboardWillShow(notification: NSNotification) { 
    if let keyboardScreenFrame = (notification.userInfo?[UIKeyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue { 
     let keyboardLocalFrame = self.view.convert(keyboardScreenFrame, from: nil) 
     var aRect = self.view.frame; 

     aRect.size.height -= keyboardLocalFrame.size.height 

     if self.view.frame.origin.y == 0 { 
      if aRect.contains(activeField.frame.origin) { 
       self.view.frame.origin.y -= keyboardSize.height 
      } 
     } 
    } 
} 

你也有你的keyboardWillHide方法的一個大問題。由於keyboardWillShow方法總是會縮短視圖的框架,因此您的keyboardWillHide方法也需要始終恢復視圖的框架高度。

如果我是你,我不會在任何一種方法中改變視圖的高度。只需根據需要調整其來源即可使文本字段可見。

+0

這仍然不適合我。仍然會出現鍵盤會移動整個視圖,無論點擊哪個文本字段。並澄清,是不是正在調整幀的來源正是我已經在做什麼?如果不是通過self.view.frame.origin.y來修改框架的原點,我該怎麼辦?對不起,對於Swift和iOS來說相當新穎,所以這些問題看起來可能有點初學者。 – mufc