Когда я создаю UITextField с помощью раскадровки, он выглядит как на изображении ниже. Однако, когда я создаю UITextField программно, у него нет абсолютно никакого стиля. Я знаю, что могу применять пользовательские стили к текстовому полю, но есть ли простой способ получить этот стандартный стиль при программном создании текстового поля?





Что-то вроде этого:
let t = UITextField()
t.frame = CGRect(x: 10, y: 20, width: self.view.frame.width - 20, height: 40)
t.layer.cornerRadius = 5
t.layer.borderColor = UIColor.lightGray.cgColor
t.layer.borderWidth = 1
t.leftView = UIView(frame: CGRect(x: 0, y: 0, width: 10, height: t.frame.height))
t.leftViewMode = .always
t.rightView = UIView(frame: CGRect(x: 0, y: 0, width: 10, height: t.frame.height))
t.rightViewMode = .always
t.clearButtonMode = .whileEditing
self.view.addSubview(t)
Обновлено:
Добавьте этот класс где-нибудь ниже, чтобы он был легко / глобально доступен.
class StyledTextField: UITextField {
override init(frame: CGRect) {
super.init(frame: frame)
self.layer.cornerRadius = 5
self.layer.borderColor = UIColor.lightGray.cgColor
self.layer.borderWidth = 1
self.leftView = UIView(frame: CGRect(x: 0, y: 0, width: 10, height: t.frame.height))
self.leftViewMode = .always
self.rightView = UIView(frame: CGRect(x: 0, y: 0, width: 10, height: t.frame.height))
self.rightViewMode = .always
self.clearButtonMode = .whileEditing
}
}
Затем вы можете вызвать этому UITextField из любого места следующим образом
let t = StyledTextField()
t.frame = CGRect(x: 10, y: 20, width: self.view.frame.width - 20, height: 40)
self.view.addSubview(t)
Обновлено еще раз:
Используйте UIEdgeInsets, чтобы получить обивку со всех четырех сторон.
class StyledTextField: UITextField {
let insetConstant = UIEdgeInsets(top: 4, left: 10, bottom: 4, right: 10)
override func textRect(forBounds bounds: CGRect) -> CGRect {
return UIEdgeInsetsInsetRect(bounds, insetConstant)
}
override func editingRect(forBounds bounds: CGRect) -> CGRect {
return UIEdgeInsetsInsetRect(bounds, insetConstant)
}
override func placeholderRect(forBounds bounds: CGRect) -> CGRect {
return UIEdgeInsetsInsetRect(bounds, insetConstant)
}
override init(frame: CGRect) {
super.init(frame: frame)
self.layer.cornerRadius = 5
self.layer.borderColor = UIColor(white: 2/3, alpha: 0.5).cgColor
self.layer.borderWidth = 1
self.clearButtonMode = .whileEditing
self.keyboardType = UIKeyboardType.decimalPad
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
Спасибо, это работает! Но разве невозможно каким-то образом создать UITextField, который просто использует стиль по умолчанию, не пытаясь воспроизвести его?
Привет @hoan, да, ты можешь это сделать! Другие предложенные людьми ответы позволяют сделать это легко. Я обновлю свой, чтобы показать вам, как
@hoan, вы даже читали мой ответ, который был опубликован до того, как этот ответ был отредактирован, чтобы скопировать мой ответ и сказать то же самое, плюс многое другое?
@RakeshaShastri Я сделал, и ваше объяснение подкласса было отличным. Я думаю, что вопрос, который я задал в комментариях, был неправильно понят. Я не хотел знать, как создать подкласс UITextField, потому что вы это уже объяснили. Я хотел знать, есть ли способ просто получить стиль по умолчанию, предоставленный Apple, без, самостоятельно создав любой код стиля. Потому что при использовании раскадровки вам также не нужно стилизовать UITextField, чтобы получить стиль по умолчанию.
@hoan, что, вероятно, связано с тем, что при создании текстового поля в раскадровке устанавливается явная установка. И как этот ответ отвечает на ваш вопрос?
@RakeshaShastri, мой первоначальный вопрос был о том, как получить / воссоздать стиль по умолчанию для UITextField, который предоставил @AntersBear.
@hoan Понятно. Теперь я понимаю. Вам нужны были точные параметры, которые воспроизводили бы эффект, создаваемый раскадровкой? Я бы снял свой голос против, если ответ был немного отредактирован снова, потому что я не могу проголосовать снова, пока он не будет отредактирован. Виноватсожалею
Вы можете создать подкласс из UITextField, который будет служить вашим настраиваемым текстовым полем. После этого вам нужно только создать экземпляр своего настраиваемого класса, и тогда все готово. Что-то вроде этого:
class MyCustmUITextField: UITextField {
override init(frame: CGRect) {
super.init(frame: frame)
self.layer.cornerRadius = 5
self.layer.borderColor = UIColor.black
self.font = UIFont.systemFont(ofSize: 20)
self.adjustsFontSizeToFitWidth = true
// then add whatever styles you wish
}
}
Оттуда все, что вам нужно, это создать новый экземпляр MyCustomUITextField
Вы можете добавить borderStyle как .oundedRect и использовать белый фон. Что-то вроде этого:
class MyCustmUITextField: UITextField {
override init(frame: CGRect) {
super.init(frame: frame)
self.borderStyle = .roundedRect
self.backgroundColor = .white
}
}
Это должен быть принятый ответ
Когда вы создаете UITextField с помощью раскадровки, он автоматически добавляется в
viewсо свойствами, которые вы установили в инспекторе атрибутов. Если вы создаете его в коде, вам также необходимо добавить его стиль из кода.