输入文本

时间:2018-02-08 20:42:46

标签: iphone swift uitextfield uikit

我试图理解iOS上UITextField的定位问题。我使用Interface Builder设计了一个简单的用户界面,其中一张图片占据了屏幕的上半部分,然后是一些用户需要输入一些信息的文本字段。使用自动布局限制所有内容并显示良好。但是,当用户开始编辑文本字段时,键盘向上移动并隐藏字段,或者整个屏幕向上移动并且图片被隐藏,其中任何一个都不可接受,所以我的方法是将文本字段移动到当用户开始编辑时,屏幕顶部,并在编辑完成后将其移回原来的位置。上下移动工作正常。但是,每当我在字段中实际键入任何文本时,它都会重置到其原始位置 - 实际上,超级视图中的所有视图都会重置为其原始位置。我尝试删除约束,或者在构建时设置要删除的垂直约束,没有任何变化。

我已经设置了一个非常简单的视图控制器来重现问题: Simple view controller in Interface builder

视图控制器类也是完全基本的:

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
    }
}

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

original screen

如果我在UITextView(绿色)中输入一些文字,则不会发生任何事情:

entering text in the UITextView

但是只要我在UITextField(红色的)中输入文字,两个文字区域就会移回原来的位置:

entering text in the UITextField

在各种iPhone模拟器和我自己的iPhone上都会出现同样的行为,所以它是一致的。

我希望整个视图控制器能够获得一些重绘信号的信号,但为什么呢?当我在UITextView区域输入文字时,为什么不会发生这种情况呢?我可能会使用UITextView而不是UITextField来避免这个问题,但我仍然不知道发生了什么: - | < / p> 编辑:我明白了,我没有意识到限制是可以玩的东西;-)。我最终只是简单地重新创建约束,具体取决于哪个字段被带到顶部。所有答案都有帮助!非常感谢: - )

2 个答案:

答案 0 :(得分:2)

所以它没有因为打字而发生,它是由一个&#34;自动布局&#34;重新计算。

要解决此问题,有两种解决方案: 1.编辑布局约束,使其与所需的布局匹配(通过代码或更改InterfaceBuilder中的故事板。) 2.实现自定义视图渲染功能并完全删除自动布局约束。

我会推荐第一个解决方案。因为它更具有合法性[&34;我的意思是它符合文档的指导原则。第二个更强大,但同时容易失去效率。

答案 1 :(得分:1)

这是因为您直接设置了两个文本框的frame s。每当自动布局重新计算帧时,这个直接设置的帧将失效。发生这种情况并不重要 - 你不应该这样做。只需完全使用自动布局 - SO上有几个问题可以解决这个问题,例如:How to make textFields stay in place when keyboard moves up? Swift

或者你可以按照我对here完全相同的答案 - 但只提升你需要的任何东西(在你的情况下你想要向上移动textFields)。你没有事件必须使用键盘高度,只是对键盘更改做出反应来更新文本字段的位置约束。