【问题标题】:Change UITextField width dynamically depends of content动态更改 UITextField 宽度取决于内容
【发布时间】:2016-05-20 20:19:21
【问题描述】:

我和这里有同样的问题:Resize a UITextField while typing (by using Autolayout)

但它已通过UITextView 解决,而不是UITextField。

这段代码没有帮助:

func textFieldDidChange(sender: UITextField) {
    sender.invalidateIntrinsicContentSize()
}

我有UITextField(红色背景)并在 StackView 中使用 AutoLayout:

和约束:

但是UITextField 只有在resignFirstResponder 时才改变它的宽度。 你能给我关于这个问题的任何建议吗? 我是 Swift 和 iOS 开发的新手。

【问题讨论】:

    标签: ios swift uitextfield


    【解决方案1】:

    UITextField 在更改内容时不会调用您的方法textFieldDidChange(_:)(它不是UITextFieldDelegate 的一部分)。你应该改用textField(_:shouldChangeCharactersInRange:replacementString:)。

    func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
        textField.invalidateIntrinsicContentSize()
        return true
    }
    

    【讨论】:

    • 因为这个答案是正确和完整的,我不会说你错了(因为你不是),但UITextField 是UIControl 的子类...你可以添加状态 Editing Changed 的目标(可能在代码中和来自 IB)...您可以在此处检测文本是否更改。
    【解决方案2】:

    要使用自动布局执行此操作,您需要对文本字段的宽度进行约束。然后,当文本更改时,计算所需的宽度并将约束上的constant 属性设置为该值。最后,您需要在父视图上调用layoutIfNeeded()。

    【讨论】:

      【解决方案3】:

      这适用于 UITextField。 就我而言,我希望字体大小相同。我将 textField 宽度约束设置为 >= 10,它在 iOS 9、10、11 上运行良好。

      对于 iOS 11,这甚至可以在编辑文本时使用。

      为了在 iOS 9 和 10 上编辑文本时完成这项工作,我通过注册 textDidChange 事件处理了另一种方法。

      //Swift 3 Sample
      
      //In viewDidLoad
      adjustableTextField.addTarget(self, action: #selector(textFieldDidChange(_:)), for: .editingChanged)
      
      
       @objc func textFieldDidChange(_ textField: UITextField) {
          adjustableTextField.resignFirstResponder()
          adjustableTextField.becomeFirstResponder()
      }
      

      【讨论】:

        猜你喜欢
        • 2021-12-12
        • 1970-01-01
        • 1970-01-01
        • 2011-11-12
        • 2017-01-31
        • 2013-11-23
        • 2020-01-11
        • 1970-01-01
        • 2011-04-24
        相关资源
        最近更新 更多