簡體   English   中英

當鍵盤顯示secureTextEntry時移動視圖

[英]Moving view when keyboard shows for secureTextEntry

當鍵盤出現時,我正在嘗試將self.view向上移動。

我用正常的:

NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("keyboardWillShow:"), name:UIKeyboardWillShowNotification, object: nil)
NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("keyboardWillHide:"), name:UIKeyboardWillHideNotification, object: nil)

在我的viewDidLoad() ,就viewDidLoad() 具有這兩個功能。

func keyboardWillShow(sender: NSNotification) {
    self.view.frame.origin.y -= 160
}
func keyboardWillHide(sender: NSNotification) {
    self.view.frame.origin.y += 160
}

但是這種特殊的看法。 UITextFields具有不同的鍵盤類型。

具體來說,這些文本字段是:

firstName - normal keyboard
lastName - normal keyboard
email - email keyboard
password - secureTextEntry

除密碼外,我所有的常用功能似乎都能正常使用。 不幸的是,當我單擊電子郵件UITextField上的“下一個/返回”時。 這使我的觀點又提高了160點。

它顯然以為我要添加另一個鍵盤而不刪除它。

我的第一個想法是簡單地在調用特定的UITextField時更改值。 但是,當我僅單擊密碼UITextField時,該視圖便按照預期的方式運行。

僅當我當前處於其他視圖之一中,然后單擊“下一步”或點擊密碼UITextFIeld ,它才會混亂,所以我不能只在textFieldShouldReturn指定視圖移動了多少。

考慮到secureTextEntry問題,如何正確地向上移動視圖?

根據Joko Sarmiento的建議,我也嘗試了以下方法:

var originalFrame: CGRect!

override func viewDidLoad() {
    originalFrame = self.view.frame
}

func textFieldShouldReturn(textField: UITextField) -> Bool {
    self.view.frame = originalFrame
    return false
}

我還向我的touchesBegan事件中添加了self.view.frame = originalFrame ,因為如前所述,它不僅返回。

但是上面的嘗試沒有用,這是在電子郵件字段中單擊下一步后的密碼字段的屏幕截圖。 在關閉文本字段后,它也保持這種狀態。

在此處輸入圖片說明

我還嘗試使用self.view.frame = originalframe.origin.y+160代替它。 但是仍然會導致密碼字段出現問題。

弄亂的原因是由於我的errorView改變了高度。 使其originalFrame框架現在不正確。

任何幫助將不勝感激!

我前陣子經歷過。 密碼字段成為第一響應者時,似乎沒有調用您的keyboardWillHide:方法。

您可以在textFieldShouldReturn:中將視圖的原點重置為其原始值,而不是通過添加160px ,而是具有在viewDidLoad設置的originalValue變量。

您可以執行以下操作:

var originalFrame: CGRect!

override func viewDidLoad() {
    originalFrame = self.view.frame
}

func textFieldShouldReturn(textField: UITextField) -> Bool {
    self.view.frame = originalFrame

    return false
}

編輯1:

我只是注意到上面的代碼僅在您點擊返回按鈕時才起作用。 每當文本字段退出第一響應者時,都應重置視圖的框架。


編輯2:

如果您在內容視圖中使用了UIScrollView ,則應該可以輕松解決此問題。 將表單元素嵌入UIScrollView並且每當應用程序觸發keyboardWillShow:keyboardWillHide: ,您都可以根據鍵盤高度(可以從通知的userInfo )調整UIScrollViewcontentInset屬性。

無論如何,由於您無需使用UIScrollView即可解決了問題,因此以下說明了您的方法為何行不通以及您如何使它行得通:

  1. 首先,您嘗試為內容視圖減去/增加固定高度160px 您必須了解不同設備上的鍵盤高度不同。 一個好的方法是使用從NSNotification userInfo獲得的鍵盤高度。 可通過您的keyboardWillShow:keyboardWillHide: notification.userInfo輕松檢索到此信息。

  2. 您沒有將self.view重置為其原始框架。 這可能會導致幀的Y原點被修改多次而不重置,導致減去的像素增加一倍, UIKeyboardWillShowNotification 。由於您使用的是UIKeyboardWillShowNotification self.view.frame.origin.y -= 160 ,如果UIKeyboardWillShowNotification通知沒有當您切換到密碼字段時觸發,該幀的原點不會重置,並且會減去160px

  3. 每當您切換密碼文本字段時, UIKeyboardWillHideNotification可能不會一直觸發。 我仍然需要確認這一點,但這可能是未調用keyboardWillHide:函數的原因,因此減去了另外的160px而不是加上160px然后減去160px

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM