代码之家  ›  专栏  ›  技术社区  ›  David

输入文本时UITextField位置重置

  •  0
  • David  · 技术社区  · 7 年前

    我无法理解 UITextField 在iOS上。我使用interface Builder设计了一个简单的用户界面,其中图片占据了屏幕的上半部分,然后是一些文本字段,用户需要在下面输入一些信息。所有内容都使用自动布局进行约束,并显示得很好。然而,当用户开始编辑文本字段时,要么键盘向上移动并隐藏字段,要么整个屏幕向上移动并隐藏图片,所有这些都是不可接受的,因此我的方法是在用户开始编辑文本字段时将其移到屏幕顶部,然后在编辑完成后将其移回原来的位置。上下移动很好。然而,每当我在字段中实际键入任何文本时,它都会重置为其原始位置–实际上,superview中的所有视图都会重置为其原始位置。我尝试过移除约束,或者将垂直约束设置为在构建时移除,但没有任何改变。

    我已经设置了一个非常简单的视图控制器来再现问题: 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

    但只要我在 输入框 (红色区域),两个文本区域都会移回其原始位置:

    entering text in the UITextField

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

    我希望整个视图控制器都能收到一些信号来重新绘制所有内容,但为什么呢?为什么我在 UITextView 地区我可能会通过使用 UITextView s而不是 输入框 s、 但我仍然不知道发生了什么:-|

    编辑:我明白了,我没有意识到约束是可以玩弄的;-)。最后,我简单地重新创建了约束,并根据将哪个字段置于顶部进行了适当的排序。所有的答案都很有用!非常感谢:-)

    2 回复  |  直到 7 年前
        1
  •  2
  •   Codetector    6 年前

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

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

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

        2
  •  1
  •   Milan Nosáľ    7 年前

    因为你设定了 frame 两个文本字段的直接。每当自动布局重新计算帧时,此直接设置的帧将失去效果。什么时候发生并不重要,你不应该那样做。只需完全使用autolayout-上有几个问题可以解决该问题,例如: How to make textFields stay in place when keyboard moves up? Swift

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