输入文本时 UITextField 位置重置

Posted

技术标签:

【中文标题】输入文本时 UITextField 位置重置【英文标题】:UITextField position reset when entering text 【发布时间】:2018-02-08 20:42:45 【问题描述】:

我在试图理解 iosUITextFields 的定位问题时不知所措。我使用 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
    

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

如果我在UITextView(绿色的)中输入一些文本,什么也不会发生:

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

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

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

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

【问题讨论】:

您正在使用自动布局,但您直接在 viewDidAppear 中设置框架。这是一个禁止 - 使用自动布局或框架 布局约束和直接设置框架不能很好地协同工作。如果我是你,我宁愿更改 layoutconstraint 而不是设置原始值。您可以在这篇文章中查看我的回答,了解如何做到这一点。 ***.com/questions/40583602/… 【参考方案1】:

所以它不是因为打字而发生的,它是由“自动布局”重新计算引起的。

要解决这个问题,有两种解决方案: 1. 编辑布局约束,使其匹配所需的布局(通过代码或更改 InterfaceBuilder 中的情节提要。) 2. 实现自定义视图渲染功能,完全去掉自动布局约束。

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

【讨论】:

【参考方案2】:

这是因为您直接设置了两个文本字段的frames。每当自动布局重新计算帧数时,这个直接设置的帧数就会失效。什么时候发生都没有关系——你不应该那样做。完全使用自动布局 - SO上有几个问题可以解决这个问题,例如:How to make textFields stay in place when keyboard moves up? Swift

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

【讨论】:

以上是关于输入文本时 UITextField 位置重置的主要内容,如果未能解决你的问题,请参考以下文章

UITableViewCell 内的 UITextField - 防止文本重置的方法

如何将 uitextfield 字符范围限制为 10 位

iOS UITextField光标/文字起始位置

UITextField 的标签在其键盘设置为数字键盘时重置?

UITextField输入文本位置[重复]

编辑 UITextField 时正在重置 UIScrollView