2017-10-11 99 views
0

我有一個具有多個文本框的UITableView。當我點擊文本框時,我將setContentOffset設置爲使文本框位於頁面的頂部,但當鍵盤出現時,我沒有足夠的插入框來執行此操作。所以我在插圖底部添加了插圖。這使我可以一直向下滾動,但現在當我選擇一個向下滾動的字段時,比我設置的setContentOffset更遠。我試過不同的內容插值,但沒有任何工作。有沒有辦法解決這個內容插入問題?UITableView滾動/插入問題

func adjustInsetForKeyboardShow(_ show: Bool, notification: Notification) { 
     if !keyboardAdjusted || !show { 
      guard let value = (notification as NSNotification).userInfo?[UIKeyboardFrameEndUserInfoKey] as? NSValue else { return } 
      let keyboardFrame = value.cgRectValue 
      var adjustmentHeight = (keyboardFrame.height + 100) * (show ? 1 : -1) 
      adjustmentHeight = (adjustmentHeight < 0.0) ? 0.0 : adjustmentHeight 

      self.editPaymentTableView.contentInset.bottom = adjustmentHeight 
      self.editPaymentTableView.scrollIndicatorInsets.bottom = adjustmentHeight 
     } 
     keyboardAdjusted = show 
    } 
+0

如果你想使用框架[IQKeyboardManager](https://github.com/hackiftekhar/IQKeyboardManager)可以幫助,易於使用。 –

回答

1

我前一段時間發現這對SO,但無法找到鏈接到它了,這裏要說的是很整齊地處理鍵盤和tableview中的插圖代碼。好的是它是用於顯示和隱藏的。無需執行其他鍵盤通知:

public func keyboardWillChangeFrame(notification: NSNotification) { 
    guard 
     let userInfo = notification.userInfo, 
     let endFrame = (userInfo[UIKeyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue, 
     let duration: TimeInterval = (userInfo[UIKeyboardAnimationDurationUserInfoKey] as? NSNumber)?.doubleValue, 
     let animationCurveRawNSNumber = userInfo[UIKeyboardAnimationCurveUserInfoKey] as? NSNumber 
     else { 
      return 
    } 

    let animationCurveRaw = animationCurveRawNSNumber.uintValue 
    let animationCurve: UIViewAnimationOptions = UIViewAnimationOptions(rawValue: animationCurveRaw) 

    let offsetY: CGFloat 
    if endFrame.origin.y >= UIScreen.main.bounds.size.height { 
     offsetY = 0.0 
    } else { 
     offsetY = endFrame.size.height 
    } 

    let contentInsets = UIEdgeInsetsMake(0, 0, offsetY, 0) 
    UIView.animate(withDuration: duration, delay: TimeInterval(0), options: animationCurve, animations: { 
     self.tableView.contentInset = contentInsets 
     self.tableView.scrollIndicatorInsets = contentInsets 
    }, completion: nil) 
} 

在解決方案方面,可以取代這兩條線路:

var adjustmentHeight = (keyboardFrame.height + 100) * (show ? 1 : -1) 
adjustmentHeight = (adjustmentHeight < 0.0) ? 0.0 : adjustmentHeight 

有:

var adjustmentHeight = keyboardFrame.height * (show ? 1 : 0) 

而且,以確保您'也將top插入到0做:

let contentInsets = UIEdgeInsetsMake(0, 0, adjustmentHeight, 0) 
self.editPaymentTableView.contentInset = contentInsets 
+0

我試過這個,但它仍然不會讓我一直滾動到我的最後一個領域時,鍵盤顯示 –

+0

那麼取決於如果您的視圖控制器設置爲調整頂部滾動插入或不,你可能必須包括當前頂部插入像'let contentInsets = UIEdgeInsetsMake(tableview.contentInset.top,0,adjustmentHeight,0)' –

+0

爲了確保您的視圖控制器不會更改您的表視圖的insets,您可以嘗試設置'邊緣擴展布局= UIRectEdge(rawValue: UInt(0))'在'viewDidLoad()'中。 –