15

I am using SwiftUI and bridge to UITextField (I need to assign firstResponder). I use the code from here: SwiftUI: How to make TextField become first responder?

The following code updates my @Binding var. This of course is intended behavior. The problem is that this causes the textField to ignore the frame/ bounds. It just expands and pushes other elements out of the view. Other parts of the view are also reliant on the @State.

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

How can I update the @State and still keep the textField in the frame?

denninho
  • 233
  • 1
  • 6

1 Answers1

49

You need to decrease priority of content resistance in makeUIView (so content would not push external layout set in SwiftUI) like below

func makeUIView(context: UIViewRepresentableContext<MyField>) -> UITextField {
    let field = UITextField(frame: .zero)
    field.setContentCompressionResistancePriority(.defaultLow, for: .horizontal)
    ...
Asperi
  • 123,447
  • 8
  • 131
  • 245
  • 10
    I have been struggling with this for hours. Finally figured out the right incantation to use with Stackoverflow and this question, along with your gloriously simple answer, appeared. THANK YOU so much! – P. Ent Feb 19 '20 at 11:23
  • 2
    Just spend 4 hours trying to figure that out. If I could upvote that 1k times I would !! Thanks @Asperi – FitzChill Jan 05 '21 at 10:55
  • Worked like a charm. Didn't came up this link on first few Google searches :( – umali Mar 15 '21 at 19:29
  • This might be one of the greatest "diamond in the rough" stack overflow answers I've ever found. Can't believe this isn't more obvious to implement for how effective of a solution it is. – Kyle Beard Mar 26 '21 at 15:25