Swift 4 - ошибка моментального снимка с пользовательским UIView - PullRequest
0 голосов
/ 19 ноября 2018

В моем проекте я создал подкласс UIView, который в основном является контейнером для UITextField.Все работает нормально, за исключением того, что я получаю странное сообщение об ошибке в своей консоли, когда я выбираю текстовое поле на экране, и я не знаю, как сделать, чтобы оно исчезло:

[Снимок] Снимокпредставление (0x119d2d240, _UIReplicantView), которое не было обработано хотя бы один раз, требует afterScreenUpdates: YES.

Я пытался поместить некоторые view.layoutIfNeeded() в некоторые моменты, но сообщение остается.Вот мой код:

import UIKit

class BTShimmerTextField: BTShimmerView {

    let nestedTextField = UITextField()

    var didPressReturn: (() -> ())? = nil

    var placeholder: String? {
        get {
            return nestedTextField.placeholder
        }
        set {
            nestedTextField.placeholder = newValue
        }
    }

    var darkColor: UIColor? {
        get {
            return darkView.backgroundColor
        }
        set {
            darkView.backgroundColor = newValue
        }
    }

    var lightColor: UIColor? {
        get {
            return lightView.backgroundColor
        }
        set {
            lightView.backgroundColor = newValue
        }
    }

    var isSecureTextEntry: Bool {
        get {
            return nestedTextField.isSecureTextEntry
        }
        set {
            nestedTextField.isSecureTextEntry = newValue
        }
    }

    var autocorrectionType: UITextAutocorrectionType {
        get {
            return nestedTextField.autocorrectionType
        }
        set {
            nestedTextField.autocorrectionType = newValue
        }
    }

    override init(){
        super.init()
        setupTextField()
    }

    override init(frame: CGRect) {
        super.init(frame: frame)
        setupTextField()
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        setupTextField()
    }

    fileprivate func setupTextField(){

        nestedTextField.backgroundColor = UIColor.white // UIColor(named: "BTDark")
        nestedTextField.textAlignment = .center
        nestedTextField.tintColor = UIColor(named: "BTDark")
        nestedTextField.font = UIFont(name: "Metropolis-Regular", size: 16)
        nestedTextField.keyboardAppearance = .dark
        nestedTextField.delegate = self

        self.addSubview(nestedTextField)

        nestedTextField.anchor(top: self.topAnchor, leading: self.leadingAnchor, trailing: self.trailingAnchor, bottom: self.bottomAnchor, padding: UIEdgeInsets(top: 2, left: 2, bottom: 2, right: 2))

    }

    @discardableResult
    override func becomeFirstResponder() -> Bool {
        return nestedTextField.becomeFirstResponder()
    }

}

extension BTShimmerTextField: UITextFieldDelegate {
    func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        if textField == nestedTextField {
            nestedTextField.resignFirstResponder()
            if let didPressReturn = didPressReturn { didPressReturn() } 
            return false
        }
        return true
    }
}

Примечание: BTShimmerView также является подклассом UIView, в котором я установил 2 UIView с 2 различными фонами, с CAGradientLayer, чтобы сделать некоторыеэффект отражения.

Вот как я могу добавить его к своему виду:

import UIKit

class LoginViewController: UIViewController {

    override var prefersStatusBarHidden: Bool {
        return true
    }


    var loginView = BTShimmerTextField()
    var passwordView = BTShimmerTextField()

    override func viewDidLoad() {
        super.viewDidLoad()
        view.backgroundColor = UIColor(named: "BTDark")
        setupLoginViews()

    }


    fileprivate func setupLoginViews(){

        loginView.darkColor = UIColor(named: "BTDarkGold")
        loginView.lightColor = UIColor(named: "BTGold")
        loginView.placeholder = "Identifiant"
        loginView.didPressReturn = { self.passwordView.becomeFirstResponder() }
        loginView.autocorrectionType = .no
        view.addSubview(loginView)

        loginView.translatesAutoresizingMaskIntoConstraints = false
        loginView.heightAnchor.constraint(equalToConstant: 30).isActive = true
        loginView.widthAnchor.constraint(equalTo: view.widthAnchor, multiplier: 0.7).isActive = true
        loginView.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
        loginView.centerYAnchor.constraint(equalTo: view.centerYAnchor, constant: -25).isActive = true


        passwordView.darkColor = UIColor(named: "BTDarkGold")
        passwordView.lightColor = UIColor(named: "BTGold")
        passwordView.placeholder = "Mot de passe"
        passwordView.isSecureTextEntry = true
        passwordView.autocorrectionType = .no
        view.addSubview(passwordView)

        passwordView.translatesAutoresizingMaskIntoConstraints = false
        passwordView.heightAnchor.constraint(equalToConstant: 30).isActive = true
        passwordView.widthAnchor.constraint(equalTo: view.widthAnchor, multiplier: 0.7).isActive = true
        passwordView.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
        passwordView.centerYAnchor.constraint(equalTo: view.centerYAnchor, constant: 25).isActive = true


    }

}

Кто-нибудь знает, как я могу устранить эту ошибку?Эта ошибка действительно проблематична?

1 Ответ

0 голосов
/ 19 ноября 2018

Нашел решение. Мне пришлось установить свои ограничения, переопределив метод updateConstraints, учитывая, что это подкласс, например:

[...]
// Constraints
override func updateConstraints() {
    if(shouldSetupConstraints) {
        setupTextFieldConstraints()
    }
    super.updateConstraints()
}

fileprivate func setupTextFieldConstraints(){
     nestedTextField.anchor(top: self.topAnchor, leading: self.leadingAnchor, trailing: self.trailingAnchor, bottom: self.bottomAnchor, padding: UIEdgeInsets(top: 2, left: 2, bottom: 2, right: 2))
}
[...]
...