Стандартный стиль UITextField программно

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

Стандартный стиль UITextField программно

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

kkiermasz 16.08.2018 10:20
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
1
939
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Что-то вроде этого:

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 17.08.2018 07:24

Привет @hoan, да, ты можешь это сделать! Другие предложенные людьми ответы позволяют сделать это легко. Я обновлю свой, чтобы показать вам, как

Anters Bear 17.08.2018 09:02

@hoan, вы даже читали мой ответ, который был опубликован до того, как этот ответ был отредактирован, чтобы скопировать мой ответ и сказать то же самое, плюс многое другое?

Rakesha Shastri 19.08.2018 12:43

@RakeshaShastri Я сделал, и ваше объяснение подкласса было отличным. Я думаю, что вопрос, который я задал в комментариях, был неправильно понят. Я не хотел знать, как создать подкласс UITextField, потому что вы это уже объяснили. Я хотел знать, есть ли способ просто получить стиль по умолчанию, предоставленный Apple, без, самостоятельно создав любой код стиля. Потому что при использовании раскадровки вам также не нужно стилизовать UITextField, чтобы получить стиль по умолчанию.

hoan 19.08.2018 16:32

@hoan, что, вероятно, связано с тем, что при создании текстового поля в раскадровке устанавливается явная установка. И как этот ответ отвечает на ваш вопрос?

Rakesha Shastri 19.08.2018 16:35

@RakeshaShastri, мой первоначальный вопрос был о том, как получить / воссоздать стиль по умолчанию для UITextField, который предоставил @AntersBear.

hoan 19.08.2018 16:42

@hoan Понятно. Теперь я понимаю. Вам нужны были точные параметры, которые воспроизводили бы эффект, создаваемый раскадровкой? Я бы снял свой голос против, если ответ был немного отредактирован снова, потому что я не могу проголосовать снова, пока он не будет отредактирован. Виноватсожалею

Rakesha Shastri 19.08.2018 16:56

Вы можете создать подкласс из 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
    } 
}

Это должен быть принятый ответ

Bigair 07.02.2021 12:44

Другие вопросы по теме