UITextField,辞职第一响应者时,导致文本的奇怪动画滚动
Posted
技术标签:
【中文标题】UITextField,辞职第一响应者时,导致文本的奇怪动画滚动【英文标题】:UITextField, when resigning first responder, causing strange animation scroll of text 【发布时间】:2016-01-31 06:26:51 【问题描述】:我在 UITableView 中为登录表单实现了几个 UITextField。当在第一次中辞职第一响应者时,正在发生一个非常奇怪的动画跳跃。由于这些几乎完全是在带有 .xib 文件的 Interface Builder 中构建的,因此我几乎没有要添加的代码。但这里有一个有趣的 .gif 来显示行为:
更新:
我已将范围缩小到我正在监听键盘事件以调整视图约束这一事实。这是导致问题的代码:
func keyboardWillHide(notification: NSNotification)
// tried self.formContainer.layoutIfNeeded() here too to force pending layouts
formContainerYConstraint.constant = 40
UIView.animateWithDuration(0.4) () -> Void in
self.formContainer.layoutIfNeeded()
...表单容器是一个包含表格视图和登录按钮的视图。
【问题讨论】:
如何将控制从第一个文本字段切换到第二个 模拟器,所以选项卡(下一步)和点击也可以。 傻但只是为了确认?是textView还是TextField?? 您是在重新加载单元格还是表格?显示你有什么代码。 我也有同样的问题。具体来说,当您在animateWithDuration
块中调用 layoutIfNeeded
时,在相同的布局循环中辞去第一响应者时会发生这种情况。
【参考方案1】:
感觉就像一个彻底的黑客(我希望有人能发布一个更好的答案),但与此同时,我已经通过在动画动作中添加一点延迟来解决这个问题 - 我怀疑这与在两个输入字段之间切换时发生的 become- 和 resignFirstResponder 事件。
let delay: dispatch_time_t = dispatch_time(DISPATCH_TIME_NOW, Int64(0.1 * Double(NSEC_PER_SEC)))
dispatch_after(delay, dispatch_get_main_queue()) () -> Void in
self.formContainerYConstraint.constant = 40
UIView.animateWithDuration(0.4) () -> Void in
self.formContainer.layoutIfNeeded()
【讨论】:
即将发布完全相同的问题和完全相同的hacky解决方案。我也找不到更好的了。 有趣的是,在我应用上述代码之前,动画持续时间没有得到尊重,并且似乎自动与键盘动画同步。添加 dispatch_after 后,我不得不调整动画持续时间以尝试匹配键盘正在做的事情 是的,这确实是一个丑陋的黑客攻击【参考方案2】:试试这个
- (void)textFieldDidEndEditing:(UITextField *)textField
[textField layoutIfNeeded];
【讨论】:
这里建议:***.com/questions/33544054/…以上是关于UITextField,辞职第一响应者时,导致文本的奇怪动画滚动的主要内容,如果未能解决你的问题,请参考以下文章
使用 UIToolbar/UITextField 辞职第一响应者问题
UITextField辞职第一响应者后如何更改UIScrollView contentSize