【问题标题】:UITextField, when resigning first responder, causing strange animation scroll of textUITextField,辞职第一响应者时,导致文本的奇怪动画滚动
【发布时间】: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 时,在相同的布局循环中辞去第一响应者时会发生这种情况。

标签: ios swift uitextfield interface-builder


【解决方案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];
}

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多