SwiftUI - UITextField 中的状态更改导致 frameWidth 不受控制地增长并忽略边界/框架

Posted

技术标签:

【中文标题】SwiftUI - UITextField 中的状态更改导致 frameWidth 不受控制地增长并忽略边界/框架【英文标题】:SwiftUI - State change in UITextField causes the frameWidth to grow uncontrolled and ignore bounds/frame 【发布时间】:2019-12-05 09:42:07 【问题描述】:

我正在使用 SwiftUI 并桥接到 UITextField(我需要分配 firstResponder)。我使用这里的代码:SwiftUI: How to make TextField become first responder?

以下代码更新了我的 @Binding 变量。这当然是预期的行为。问题是这会导致 textField 忽略框架/边界。它只是扩展并将其他元素推出视图。视图的其他部分也依赖于@State。

func textFieldDidChangeSelection(_ textField: UITextField) 
            text = textField.text ?? ""

如何更新@State 并仍将 textField 保留在框架中?

【问题讨论】:

【参考方案1】:

您需要降低makeUIView 中内容阻力的优先级(因此内容不会推送在 SwiftUI 中设置的外部布局),如下所示

func makeUIView(context: UIViewRepresentableContext<MyField>) -> UITextField 
    let field = UITextField(frame: .zero)
    field.setContentCompressionResistancePriority(.defaultLow, for: .horizontal)
    ...

【讨论】:

我已经为此苦苦挣扎了好几个小时。终于找到了与 *** 一起使用的正确咒语,并且出现了这个问题以及您极其简单的答案。非常感谢! 只需花 4 个小时来弄清楚这一点。如果我可以投票 1k 次,我会的!谢谢@Asperi 工作就像一个魅力。在最初的几次谷歌搜索中没有找到这个链接:( 这可能是我找到的最伟大的“钻石原石”堆栈溢出答案之一。简直不敢相信这对于解决方案的有效性来说实施起来并不明显。 寻找这个答案很久了。按预期工作,谢谢。

以上是关于SwiftUI - UITextField 中的状态更改导致 frameWidth 不受控制地增长并忽略边界/框架的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI 从 UITextField 中关闭键盘

如何在 SwiftUI 中更改 UIViewRepresentable 内的 UITextField 大小

带有 mkmapview 和 uitextfield 委托函数的 Swiftui

UITextField 未更新以更改 ObservableObject (SwiftUI)

SwiftUI:如何在 UIViewRepresentable UITextField 上调用 becomeFirstResponder 时修复“通过属性检测到的 AttributeGraph 循环”

更新 SwiftUI 中的 inputAccessoryView (UIViewRepresentable)