2017-08-17 46 views
1

我使用UIColletion視圖與自定義單元格與裏面的UITextField。正如我發現的那樣,當textField成爲第一響應者時,collectionView會自動滾動,所以鍵盤不會覆蓋編輯的字段。UICollectionView becomeFirstResponder錯誤的行爲

問題是,此功能無法正常工作。它將文本字段滾動到鍵盤正上方的位置,但接下來滾動一點點,鍵盤隱藏文本字段的一部分。

我嘗試了只有一個簡單的收集視圖,只有一個原型單元格與其中的文本字段的新項目,它也不工作。

在我的原始項目中有更復雜的單元格,第二個滾動要大得多,所以整個文本字段都在鍵盤下。

這是集合視圖中的錯誤還是我做錯了什麼? (在這個簡單的項目有幾乎不可能什麼錯....

+0

你能添加一些你正在使用的代碼在新的,小的項目? –

+0

發表於新的回答 –

+0

@MartinKubišta請檢查答案下面。添加了一個片段,看起來像一個更靈活的解決方案 –

回答

0

至於我的樣本項目。

UICollectionViewController

import UIKit 

private let reuseIdentifier = "Cell" 

class CollectionCollectionViewController: UICollectionViewController { 

    override func viewDidLoad() { 
     super.viewDidLoad() 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
     // Dispose of any resources that can be recreated. 
    } 

    /* 
    // MARK: - Navigation 

    // In a storyboard-based application, you will often want to do a little preparation before navigation 
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
     // Get the new view controller using [segue destinationViewController]. 
     // Pass the selected object to the new view controller. 
    } 
    */ 

    // MARK: UICollectionViewDataSource 

    override func numberOfSections(in collectionView: UICollectionView) -> Int { 
     // #warning Incomplete implementation, return the number of sections 
     return 1 
    } 


    override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { 
     // #warning Incomplete implementation, return the number of items 
     return 50 
    } 

    override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 
     let cell = collectionView.dequeueReusableCell(withReuseIdentifier: reuseIdentifier, for: indexPath) as? CollectionViewCell 

     cell?.field.backgroundColor = .red 

     return cell ?? UICollectionViewCell() 
    } 

} 

UICollectionViewCell

import UIKit 

class CollectionViewCell: UICollectionViewCell { 
    @IBOutlet var field: UITextField! 
} 

enter image description here

0

只是重新創建了你的項目,似乎在工作對於我在iPhone 7 plus上進行測試很不錯。

集合視圖滾動並顯示文本字段。現在有一個問題是鍵盤下面的填充不總是相同的。我的建議是確保您的文本框已經到位,然後重試。這可能會有所作爲。

另一方面,我會建議使用ScrollView而不是集合視圖。 集合視圖具有單元重用,這可能會導致重新使用單元格和文本字段被釋放的問題。

具有很多TextField的形式時,我最常做的是:

  • 創建滾動視圖和引腳到所有的邊緣。尤其是底部約束很重要
  • 在scrollView中添加視圖以將其固定到所有邊,並使您包含的UIView的寬度和高度等於ScrollViews超級視圖的寬度和高度。 (這樣滾動插圖將正確比例)
  • 作爲子視圖添加您的文本框的UIView的上述
  • 添加鍵盤通知觀察員在UIViewController和滾動型的底部約束動畫鍵盤的高度和回0當鍵盤從屏幕移動時。

通過這種方式,您可以確保控制屏幕動畫,並且如果您覺得有必要,可以添加更多的填充。 scrollView將處理抵抗並讓你的textField放置在正確的視口中。

此外,您將能夠引用所有的textField。通過創建插座或將它們添加到OutletCollection中。

我通常會做後者爲了保持他們的秩序,並將焦點移到列表中的下一個。

import UIKit 

class KeyboardViewController: UIViewController { 

    @IBOutlet weak var bottomScrollViewConstraint: NSLayoutConstraint! 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardWillShow), name: NSNotification.Name.UIKeyboardWillShow, object: nil) 
     NotificationCenter.default.addObserver(self, selector: #selector(self.keyboardWillHide), name: NSNotification.Name.UIKeyboardWillHide, object: nil) 
    } 

    @IBAction func hideKeyboard(_ sender: Any) { 
     self.view.endEditing(true) 
    } 

    func keyboardWillShow(notification: NSNotification) { 

     if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue { 
      self.bottomScrollViewConstraint.constant = keyboardSize.height //Add more padding here if you want 
      UIView.animate(withDuration: 0.8, animations: { 
       self.view.layoutIfNeeded() 
      }) 
     } 

    } 

    func keyboardWillHide(notification: NSNotification) { 
     self.bottomScrollViewConstraint.constant = 0 
     UIView.animate(withDuration: 0.8, animations: { 
      self.view.layoutIfNeeded() 
     }) 
    } 
} 

enter image description here

+0

我知道這個解決方案,但它不能在我們的項目中完成。整個屏幕是某種形式的,具有許多不同類型的輸入和文本字段只是這種輸入中的一種。它不是靜態的,而是完全由我們的collectionview子類中的代碼生成,它處理一些佈局變化,基本輸入,項目重新排序等等。 –

+0

仍然集合視圖的自主行爲看起來像一個bug。我用輔助視圖試了一下,它的表現也一樣。 https://youtu.be/lN-I59qF2cY –

相關問題