输入文本时 UITextField 位置重置
Posted
技术标签:
【中文标题】输入文本时 UITextField 位置重置【英文标题】:UITextField position reset when entering text 【发布时间】:2018-02-08 20:42:45 【问题描述】:我在试图理解 ios 上 UITextField
s 的定位问题时不知所措。我使用 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
区域输入文本时没有发生这种情况?我可能可以通过使用UITextView
s 而不是UITextField
s 来避免这个问题,但我仍然不知道发生了什么:-|
编辑:我明白了,我没有意识到约束是可以玩的;-)。我最终只是根据被带到顶部的字段以正确的顺序重新创建约束。所有的答案都有帮助!非常感谢:-)
【问题讨论】:
您正在使用自动布局,但您直接在 viewDidAppear 中设置框架。这是一个禁止 - 使用自动布局或框架 布局约束和直接设置框架不能很好地协同工作。如果我是你,我宁愿更改 layoutconstraint 而不是设置原始值。您可以在这篇文章中查看我的回答,了解如何做到这一点。 ***.com/questions/40583602/… 【参考方案1】:所以它不是因为打字而发生的,它是由“自动布局”重新计算引起的。
要解决这个问题,有两种解决方案: 1. 编辑布局约束,使其匹配所需的布局(通过代码或更改 InterfaceBuilder 中的情节提要。) 2. 实现自定义视图渲染功能,完全去掉自动布局约束。
我会推荐第一个解决方案。因为它更“合法”。我的意思是它符合文档指南。第二个更强大,但同时也容易失去效率。
【讨论】:
【参考方案2】:这是因为您直接设置了两个文本字段的frame
s。每当自动布局重新计算帧数时,这个直接设置的帧数就会失效。什么时候发生都没有关系——你不应该那样做。完全使用自动布局 - SO上有几个问题可以解决这个问题,例如:How to make textFields stay in place when keyboard moves up? Swift
或者您可以按照我对完全相同的事情的回答 here - 但只向上移动您需要的任何内容(在您的情况下,您只想向上移动文本字段)。您不必使用键盘高度,只需对键盘更改做出反应以更新文本字段上的位置约束。
【讨论】:
以上是关于输入文本时 UITextField 位置重置的主要内容,如果未能解决你的问题,请参考以下文章
UITableViewCell 内的 UITextField - 防止文本重置的方法