直接从textField移动到textField时,UITableView不会移动

我目前正在与我的基于Swift的iPhone应用程序覆盖一些textField问题的键盘作战。

这张图片显示了主要问题(前三张图片显示了问题,最后三张是应该做的):

问题正确地移动tableview

当tableViewCell中的textField被编辑时,我想要移动整个tableview和导航栏。 我可以用下面的代码(取自viewController的片段)做到这一点:

var tableViewShiftedUp = false 

 func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as! QuantityTableViewCell let componentLocationQuantity = tableViewData[indexPath.row] if let locationString = componentLocationQuantity.location.valueForKey("location_name") as? String { cell.setCellContents(locationString, quantity: componentLocationQuantity.quantity.floatValue) cell.quantityLabel.delegate = self } //get stock level related to current build rate and lead time (good - green, warning - orange, urgent - red) let status = model.determineStockLevelStatus(component) cell.setQuantityLabelBackgroundStatusColor(status) if editingMode == true { cell.makeQuantityEditable() } //add control event to detect text change cell.quantityLabel.addTarget(self, action: #selector(quantityCellTextChanged(_:)), forControlEvents: UIControlEvents.EditingChanged) cell.quantityLabel.addTarget(self, action: #selector(quantityCellSelected(_:)), forControlEvents: UIControlEvents.EditingDidBegin) return cell } 

 //MARK: - UITextfield delegate override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) { self.view.endEditing(true) if tableViewShiftedUp == true { moveTable() } } func textFieldShouldReturn(textField: UITextField) -> Bool { textField.resignFirstResponder() return true } func quantityCellSelected(textField: UITextField){ if tableViewShiftedUp == false { moveTable() } //check table was moved print(tableView.frame.origin.y) } func hideKeyboard(){ self.view.endEditing(true) if tableViewShiftedUp == true { moveTable() } } func moveTable(){ if tableViewShiftedUp == true { animateTableViewMoving(false, moveValue: 250) animateNavigationBarMoving(false, moveValue: 250) tableViewShiftedUp = false } else { animateTableViewMoving(true, moveValue: 250) animateNavigationBarMoving(true, moveValue: 250) tableViewShiftedUp = true } } // moving the tableView func animateTableViewMoving (up:Bool, moveValue :CGFloat){ let movementDuration:NSTimeInterval = 0.0 let movement:CGFloat = ( up ? -moveValue : moveValue) UIView.beginAnimations( "animateView", context: nil) UIView.setAnimationBeginsFromCurrentState(true) UIView.setAnimationDuration(movementDuration ) self.tableView.frame = CGRectOffset(self.tableView.frame, 0, movement) UIView.commitAnimations() } // moving the navigationBar func animateNavigationBarMoving (up:Bool, moveValue :CGFloat){ let movementDuration:NSTimeInterval = 0.0 let movement:CGFloat = ( up ? -moveValue : moveValue) UIView.beginAnimations( "animateView", context: nil) UIView.setAnimationBeginsFromCurrentState(true) UIView.setAnimationDuration(movementDuration ) self.midNavigationBar.frame = CGRectOffset(self.midNavigationBar.frame, 0, movement) UIView.commitAnimations() } 

直接移动到tableView中的textField时它工作正常。 但是,当我已经在tableView外部编辑一个textField时,不会发生移位,所以移位切换不同步。

我已经打印了tableView框架的原点:

 //check table was moved print(tableView.frame.origin.y) 

所以我可以看到tableView被设置为什么,并且首先从tableView外部的textField移动到tableView内部的textField,这个属性是我期望它是134的,但是它仍然在屏幕上的384处下次调用。

在tableView中的单元格内移动时,不会发生此问题。

这感觉就像我遇到了某种竞争条件问题,或者我错过了一些委托方法被称为从一个单元格转换到下一个单元格时抛弃所有的东西。

帮助会很好。

看看这个库: https : //github.com/michaeltyson/TPKeyboardAvoiding 。 devise的目的是让键盘远离文本字段。

当你使用autolayout时, 你不能直接调整框架的大小 ,你必须使用约束 (你可以为在IB中创build的约束创buildIBOutlets或添加新的约束,然后从animation块中发送layoutIfNeeded到你的视图)。

您可以遵循苹果官方的指示:

  • 关于自动布局和布局约束
  • animation层内容