输入文本时 UITextField 位置重置

UITextField position reset when entering text

我在尝试理解 iOS 上 UITextField 的定位问题时不知所措。我使用 Interface Builder 设计了一个简单的用户界面,图片占据了屏幕的上半部分,下面是一些文本字段,用户需要在其中输入一些信息。一切都使用自动布局进行约束并很好地显示。但是,当用户开始编辑文本字段时,要么键盘向上移动并隐藏该字段,要么整个屏幕向上移动并隐藏图片,none 是可以接受的,所以我的方法是移动当用户开始编辑文本字段时将文本字段移至屏幕顶部,并在编辑完成后将其移回原来的位置。上下移动效果很好。然而,每当我实际在该字段中键入任何文本时,它都会重置到其原始位置——实际上,父视图中的所有视图都将重置到其原始位置。我试过删除约束,或设置要在构建时删除的垂直约束,没有任何变化。

我设置了一个非常简单的视图控制器来重现该问题:

视图控制器 class 也是完全基础的:

import UIKit
class ViewController: UIViewController {
    @IBOutlet weak var textField: UITextField!
    @IBOutlet weak var textView: UITextView!
    override func viewDidLoad() {
        super.viewDidLoad()
    }
    override func viewDidAppear(_ animated: Bool) {
        textField.frame.origin.y = 100
        textView.frame.origin.y = 150
    }
}

没什么特别的。当我启动它时,我得到了预期的屏幕,文本区域移到了蓝色区域:

如果我在 UITextView(绿色的)中输入一些文本,没有任何反应:

但是当我在 UITextField(红色的)中输入文本时,两个文本区域都会移回原来的位置:

相同的行为发生在各种 iPhone 模拟器和我自己的 iPhone 上,所以它是一致的。

我希望整个视图控制器都能收到一些信号,按照原来的方式重新绘制所有内容,但为什么呢?为什么当我在 UITextView 区域输入文本时没有出现这种情况?我可能可以通过使用 UITextViews 而不是 UITextFields 来避免这个问题,但我仍然不知道发生了什么:-|

编辑:我明白了,我没有意识到约束是可以玩的东西;-)。我最终只是根据将哪个字段带到顶部,以正确的顺序重新创建约束。不过,所有答案都有帮助!非常感谢:-)

这是因为您直接设置了两个文本框的frame。每当自动布局重新计算帧时,直接设置的帧将失效。什么时候发生并不重要——你不应该那样做。只需完全使用自动布局 - SO 上有几个问题可以解决该问题,例如:

或者您可以按照我对完全相同的事情的回答进行操作 here - 但只向上移动您需要的任何内容(在您的情况下,您只想向上移动文本字段)。您甚至不必使用键盘高度,只需对键盘变化做出反应以更新文本字段上的位置限制。

所以它不是因为输入而发生的,它是由 "auto layout" 重新计算引起的。

要解决这个问题,有两种解决方法: 1. 编辑布局约束,使其匹配所需的布局(通过代码或更改 InterfaceBuilder 中的故事板。) 2. 实现自定义view render函数,完全移除自动布局约束。

我会推荐第一个解决方案。因为它更"legit"。我的意思是它符合文档指南。第二种更强大,但同时容易失去效率。