UITextField 不会自动调整宽度以适应内容,直到 resignFirstResponder 被调用?

Posted

技术标签:

【中文标题】UITextField 不会自动调整宽度以适应内容,直到 resignFirstResponder 被调用?【英文标题】:UITextField does not automatically resize width to fit contents until resignFirstResponder is called? 【发布时间】:2017-04-07 18:11:19 【问题描述】:

我不确定为什么会这样,但基本上我有一个静态单元格,其中包含一个UITextFieldinputViewUIPickerView,其 inputAccessoryTypeUIToolBar

我是这样创建的:

var repeat_ARRAY: [String] = []

override func viewDidLoad()

    super.viewDidLoad()

    repeat_ARRAY.append("No Cycle")
    repeat_ARRAY.append("Semi-Monthly")

    toolBar.barStyle = UIBarStyle.default
    toolBar.isTranslucent = true
    toolBar.sizeToFit()

    let doneButton = UIBarButtonItem(title: "Done", style: .done, target: self, action: #selector(ViewController.dismissPicker(_:) ) )

    let spaceButton = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.flexibleSpace, target: nil, action: nil)

    toolBar.setItems([spaceButton, doneButton], animated: false)
    toolBar.isUserInteractionEnabled = true

    createCell()


func numberOfComponents(in pickerView: UIPickerView) -> Int

    return 1


func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String?

    return repeat_ARRAY[row]


func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int)

    textField.text = repeat_ARRAY[row]


func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int

    return repeat_ARRAY.count


func dismissPicker(_ sender: UIBarButtonItem)

    textField.resignFirstResponder()


func createCell()

    textField.text = "No Cycle"
    textField.delegate = self

    let pickerView: UIPickerView = UIPickerView()

    pickerView.delegate = self
    pickerView.dataSource = self

    textField.inputView = pickerView

    textField.inputAccessoryView = toolBar

这就是它在故事板中的设置方式:

最初加载 ViewController 时,textField.text 的值为 No Cycle,非常适合。但是,当我滚动 UIPickerView 以选择第二行时,即 Semi-Monthly,文本会像这样被截断:

直到我点击 Done UIBarButtonItem 调用 textField.resignFirstResponder 之后,textField 的宽度才会自动扩展以适应字符串 Semi-Monthly 的内容强>像这样:

我不太明白为什么会这样?

【问题讨论】:

【参考方案1】:

为您的文本字段设置“前导、尾随、顶部和固定高度约束”,您的问题将得到解决!如果你不能同时设置前导和尾随,那么你应该设置固定宽度。

【讨论】:

但是设置固定宽度意味着文本字段不会根据文本内容自动调整其宽度。如果不需要,我不希望文本字段占用大量宽度空间。我认为这是将宽度优先级设置为低于水平Hugging Priority 的重点?我试图通过考虑自动布局来实现这一点,因为我在单元格的左边缘有UILabel,它也会占用很多空间。 您也可以设置最小字体比例或大小,因此如果文本将是大字符串,那么它将减小字体大小以适合标签。如果适合你!您当前方法中的第二件事,您在选择器的 didselectrow 方法中发布了有问题的调用 layoutifneeded 或 layoutsubviews。 我的要求是保持字体大小不变,如果文本是大字符串,则不要缩放它。如前所述,我认为这是通过Hugging Priority 处理的。 嗨@Pangu,你能解决这个问题吗?

以上是关于UITextField 不会自动调整宽度以适应内容,直到 resignFirstResponder 被调用?的主要内容,如果未能解决你的问题,请参考以下文章

如何自动调整标签大小以适应固定宽度的容器?

调整文本大小以适应宽度(1行标签)后,如何在 UILabel 中垂直和水平居中?

自动调整 UILabel 文本大小以适应 UILabel 宽度

Swift 3 - 调整字体大小以适应宽度,多行

XIB TableViewCell 未调整大小以适应宽度

调整网站宽度以适应 iPad 屏幕的宽度