键盘动画移动 UITableView 部分标题

Posted

技术标签:

【中文标题】键盘动画移动 UITableView 部分标题【英文标题】:Keyboard animation moves the UITableView section header 【发布时间】:2018-04-30 10:54:31 【问题描述】:

我遇到了问题,如果有人之前已经经历过这种情况,我正在徘徊。 我的设置如下: - 我使用由 3 个元素组成的 UIViewController - 顶部的 UIView - 居中的 UITableView - 底部的 UiView

我正在做的事情如下: 一旦显示键盘,我将动画底部 UIView 向上推。这工作正常,但我遇到的问题是,一旦键盘消失,表格视图中第一个单元格的部分标题会随着动画的移动而移动一点下载。

extension UserDetailsViewController: KeyboardDelegate 
func keyboardWillShow(notification: NSNotification) 
    if let info = notification.userInfo 
        let keyboardFrame = (info[UIKeyboardFrameEndUserInfoKey] as! NSValue).cgRectValue

        UIView.animate(withDuration: 0.3, animations:  
            if UserDeviceType.IPad || UserDeviceType.IPadPro 
                self.updateConstraints(gradientHeight: 90, footerHeight: 60, footerBottom: keyboardFrame.height)
             else if UserDeviceType.IPhone5 || UserDeviceType.IPhone4 
                self.updateConstraints(gradientHeight: 65, footerHeight: 40, footerBottom: keyboardFrame.height)
             else if UserDeviceType.IPhoneX 
                self.updateConstraints(gradientHeight: 90, footerHeight: 60, footerBottom: keyboardFrame.height)
             else 
                self.updateConstraints(gradientHeight: 67, footerHeight: 40, footerBottom: keyboardFrame.height)
            
            self.view.layoutIfNeeded()
            self.tableView.layoutIfNeeded()
        )
    


func keyboardWillHide(notification: NSNotification) 
    UIView.animate(withDuration: 0.3, animations:  
        self.setupConstraints()
        self.view.layoutIfNeeded()
        self.tableView.layoutIfNeeded()
    )


键盘正确显示

键盘动画出来后

【问题讨论】:

我相信滚动视图插图正在发生一些事情。顶部插入增加了,因此当标题部分与顶部的屏幕对齐时,它允许单元格在其下方滚动。 首先你应该删除keyboardWillHide中的动画......所以你可以确定,这不是因为动画。我将尝试的下一步是检查keyboardWillHide 的主线程。如果这不起作用,我只能在您向我们展示 setupConstraints 和 updateConstraints 函数时提供更多帮助。 哦,键盘通知的 userInfor 也包含动画持续时间。你可以在你的动画中使用它:) 关键是“UIKeyboardAnimationDurationUserInfoKey” 谢谢你们的建议。我发现了问题 【参考方案1】:

问题是由动画内部的 self.view.layoutIfNeeded() 引入的。似乎在执行布局步骤之后,滚动视图的顶部插图不情愿地增加了。 解决方案是添加 tableview 函数开始和结束更新。

    func keyboardWillHide(notification: NSNotification) 
    if let info = notification.userInfo 
        self.tableView.beginUpdates()

        UIView.animate(withDuration: info[UIKeyboardAnimationDurationUserInfoKey] as! TimeInterval, animations:  
            self.setupConstraints()
            self.view.layoutIfNeeded()
            self.tableView.endUpdates()
        )
    

【讨论】:

以上是关于键盘动画移动 UITableView 部分标题的主要内容,如果未能解决你的问题,请参考以下文章

键盘出现时向上移动 UITextField 和 UITableView

弹出键盘时如何为 UITableView 设置动画?

UITableView ReloadData 动画单元格 UI

带有文本字段的 UiTableView - 出现键盘时滚动

删除 UITableView 的部分后,标题视图的框架永远改变

使用动画将uitableview单元格移动到顶部