2016-05-20 3 views
1

У меня такая же проблема, как здесь: Resize a UITextField while typing (by using Autolayout)Изменить UITextField ширина динамически зависит от содержания

Но это была решена с UITextView и не с UITextField.

Этот код не помогает:

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

У меня есть UITextField (красный фон) и использовать AutoLayout с StackView:

enter image description here

и ограничения:

enter image description here

но UITextField изменить это ширина только если есть resignFirstResponder. Не могли бы вы дать мне какие-либо советы по этой проблеме? Я новичок в Swift и iOS Development.

ответ

1

Для этого, используя Autolayout, вам понадобится ограничение ширины текстового поля. Затем, когда текст изменяется, вычислите желаемую ширину и установите свойство constant на ограничение на это значение. Наконец, вам нужно будет позвонить layoutIfNeeded() на родительском представлении.

2

UITextField не называет ваш метод textFieldDidChange(_:), когда он меняет содержание (он не является частью UITextFieldDelegate). Вместо этого вы должны использовать textField(_:shouldChangeCharactersInRange:replacementString:).

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

Поскольку этот ответ является правильным и полным, я не хочу сказать, что вы не правы (потому что вы не), но 'UITextField' является подклассом' UIControl' ... Вы можете добавить цель для состояния «Редактирование изменено» (возможно в коде и из IB) ... вот где вы можете обнаружить, изменился ли текст. – farzadshbfn

0

Это работает для 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() 
} 
Смежные вопросы