【问题标题】:iOS 9 UITextField textRectForBounds issueiOS 9 UITextField textRectForBounds 问题
【发布时间】:2015-12-12 06:17:45
【问题描述】:

我在 iOS 9、XCode 7 GM 上运行。我有一个扩展 UITextField (CustomOffsetTextField) 并为自定义文本定位提供支持的类,如下所示:

override func textRectForBounds(bounds: CGRect) -> CGRect {
    return CGRectOffset(bounds, textOffset.x + leftViewOffset, textOffset.y)
}

override func placeholderRectForBounds(bounds: CGRect) -> CGRect {
    return CGRectOffset(bounds, textOffset.x + leftViewOffset, textOffset.y)
}

override func editingRectForBounds(bounds: CGRect) -> CGRect {
    return CGRectOffset(bounds, textOffset.x + leftViewOffset, textOffset.y)
}

leftViewOffset 是文本字段的 leftView 的宽度,如果存在的话。 textOffset 是一个 CGPoint,它定义了自定义的 x 和 y 偏移以应用于文本矩形。

我的问题出现在我的登录视图中。我有 2 个 CustomOffsetTextField 实例 - 一个用于用户的电子邮件,一个用于他们的密码。

在第一次加载视图控制器时,如果我在一个字段中输入文本,然后点击另一个字段,则该文本将在其文本字段中短暂跳回位置 0,0,然后再跳回定义的位置通过 textRectForBounds。一些基本的打印调试验证这些函数总是返回我期望的值。

在这个最初的打嗝之后,文本字段的行为就像我期望的那样。此问题仅在视图控制器加载后的每个文本字段中发生一次。之后,我可以随意在字段之间来回点击,而不会再次发生。

有没有人在 iOS 9 中看到与 UITextField 类似的问题?如果是这样,你能找到解决办法吗?

【问题讨论】:

  • 我遇到了类似的问题,除了当我点击“第二个”UITextField 时,我的“第一个”UITextField 的文本被暂时清除(这只是短暂发生,很快被正确的用户提供的文本)。在实施@Jesse 提出的解决方案后,这不再是问题。我仍然遇到与 secureTextEntry 设置为 YES 的 UITextField 相关的问题 - 也就是说,当它成为第一响应者时,editingRectForBounds 比它应该的低几个点(它在 UITextField 的范围内没有垂直对齐)。
  • 您使用的是自定义字体吗?已知某些自定义字体会导致与 secureTextEntry 相关的问题。我们不得不在我们自己的应用程序中跳过一些障碍来解决这个问题。如果您允许用户显示/隐藏该字段中的文本,请尝试在将 secureTextEntry 设置为 YES 之前立即应用系统字体,然后在将其设置回 NO 后立即重新应用您的自定义字体。这对我们有用。

标签: cocoa-touch uitextfield ios9


【解决方案1】:

在 iOS 9 中,每当您在文本字段之间点击时,都会发送一个额外的 UIKeyboardWillShowNotification 通知。如果您在通知回调中调用了[self.view layoutIfNeeded],则会导致跳转。

// Animate
[UIView beginAnimations:@"keyboardDidShowAnimations" context:NULL];
[UIView setAnimationDuration:duration];
[UIView setAnimationCurve:curve];
[self.view layoutIfNeeded];
[UIView commitAnimations];

与此有关: https://forums.developer.apple.com/message/53905#53905

如果您在没有软件键盘的情况下在模拟器中进行测试,您将获得一个额外的UIKeyboardWillHideNotification,如果您在该通知回调中也有 layoutIfNeeded 调用,则可能会导致同样的问题。

我通过在回调顶部进行检查来解决这个问题,以确保我确实需要动画/更新约束。

- (void)keyboardWillShow:(NSNotification *)note {
    BOOL shouldAnimate = self.someConstraint.constant != kMinimumSize;
    if (shouldAnimate) {
...

- (void)keyboardWillHide:(NSNotification *)note {
    BOOL shouldAnimate = self.someConstraint.constant == kMinimumSize;
    if (shouldAnimate) {
...

更新: 这不一定适用于多次调用通知方法的 3rd 方键盘。见https://stackoverflow.com/a/26004605

【讨论】:

  • 很奇怪,调用 layoutIfNeeded 会导致这种情况。无论如何,您的解决方案也对我有用。谢谢!
  • 谢谢,很有帮助!
猜你喜欢
  • 1970-01-01
  • 2016-04-02
  • 2016-01-04
  • 2015-12-19
  • 2015-12-14
  • 2015-12-28
  • 2015-12-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多