chausovSurfStudio / TextFieldsCatalog

This is catalog of various input field with great opportunities for validation and formatting.
MIT License
25 stars 8 forks source link

использование programmatically а не через storyboards #75

Closed somerepository closed 3 years ago

chausovSurfStudio commented 4 years ago

добрый вечер! рад помочь, но требуется больше вводных данных, из названия - не совсем понятно, о чем идет речь)

somerepository commented 4 years ago

Добрый, (Я нуб , так что извиняюсь если что то не понимаю) Есть LogIn viewcontroller написанный полностью программно с двумя textfields:

Screenshot 2020-04-28 at 21 30 45

часть кода :

class LoginController: UIViewController {  

    private lazy var emailTextField: UITextField = {
        let tf = UITextField()
        tf.setBottomBorder()
        tf.setLeftPaddingPoints(15)
        tf.setRightPaddingPoints(15)
        tf.textColor = .black
        tf.autocorrectionType = .no
        tf.autocapitalizationType = .none
        tf.keyboardType = .emailAddress
        tf.attributedPlaceholder = NSAttributedString(string:"Email", attributes:[NSAttributedString.Key.foregroundColor: UIColor.systemGray])
        tf.font = UIFont(name: "Font", size: 16)
        tf.delegate = self
        tf.addTarget(self, action: #selector(handleTextInputChange), for: .editingChanged)
        return tf
    }()

override func viewDidLoad() {
        super.viewDidLoad()
        let bounds = UIScreen.main.bounds
        let height = bounds.size.height
        navigationController?.isNavigationBarHidden = true
        view.backgroundColor = UIColor.rgb(red: 250, green: 250, blue: 250)
        view.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(handleTapOnView)))

        view.addSubview(dontHaveAccountButton)
        dontHaveAccountButton.anchor(left: view.safeAreaLayoutGuide.leftAnchor, bottom: view.safeAreaLayoutGuide.bottomAnchor, right: view.safeAreaLayoutGuide.rightAnchor, height: height/8)

        view.addSubview(logoContainerView)
                       logoContainerView.anchor(top: view.safeAreaLayoutGuide.topAnchor, paddingTop: 150, width: 100, height: 100)
             logoContainerView.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true

        view.addSubview(ForgotPasswordButton)
               ForgotPasswordButton.anchor(left: view.safeAreaLayoutGuide.leftAnchor, bottom: view.safeAreaLayoutGuide.bottomAnchor, right: view.safeAreaLayoutGuide.rightAnchor, height: height/8)

        setupInputFields()

    }

    private func setupInputFields() {
        let stackView = UIStackView(arrangedSubviews: [emailTextField, passwordTextField, loginButton, ForgotPasswordButton])
        let bounds = UIScreen.main.bounds
        let height = bounds.size.height
        stackView.axis = .vertical
        stackView.spacing = 20
        stackView.distribution = .fillEqually
        view.addSubview(stackView)
        stackView.anchor(top: view.safeAreaLayoutGuide.topAnchor, left: view.safeAreaLayoutGuide.leftAnchor, right: view.safeAreaLayoutGuide.rightAnchor, paddingTop: height/3, paddingLeft: 40, paddingRight: 40, height: 240)
    }

как мне сделать чтобы emailTextField стал BorderedTextField вместо обычного UITextField

chausovSurfStudio commented 4 years ago

Я вас понял, смотрите что могу предложить)

К сожалению, но программно без .xib файла на данный момент не получится реализовать своего наследника от UnderlinedTextField. На меня уже коллеги ругались, тоже так хотели, но что поделать - я приверженец .xib файлов, так что изначально такой возможности, чтобы без них обойтись - не заложил(

На самом деле очень интересный кейс) Он простой - и своей простотой он все мои концепции рушит. Задумка либы была в том, чтобы максимально сложные и мудрёные кейсы решать, а в таких простых - можно, безусловно, сделать, но... как по воробьям из пушки получается)

Что могу предложить, чтобы ваш кейс решить.

Первый путь длинный и довольно сложный - заюзать данную либу. В помощь есть краткая заметка о том, как сделать свое собственное поле ввода на основе UnderlinedTextField, https://github.com/chausovSurfStudio/TextFieldsCatalog/blob/master/Docs/Configuration.md#Создание-собственного-поля-ввода. Чтобы сделать его как нативный bordered - можно посмотреть Example проект, а именно реализацию BoxTextField (там потребуется захендлить замыкание, которое вызывается при смене состояния - по этому состоянию можно будет менять цвет границы у поля ввода, в общем, в Example проекте это есть :) ). Но это в случае, если реально по дизайну надо менять цвет границы в зависимости от состояния, если нет - можно опустить этот пункт. Еще интересный вопрос с плейсхолдером - плейсхолдер в данной либе можно по параметрам и дизайну сделать аналогичный нативному, как у вас на скриншоте, но только в последних обновлениях (сейчас на стадии проверки/мержа, в ветке pseudo-placeholder, там же обновленная документация) Но в любом случае - пока без .xib файла не обойтись.

Второй путь - зависит от того, какие еще кейсы и состояния есть в вашем дизайне у поля ввода. Если вы хотели заюзать данную либу чисто для кейса проверки email при снятии фокуса - то можно обойтись более простыми путем, а именно:

chausovSurfStudio commented 3 years ago

За отсутствием активности закрывается