首页 > 解决方案 > UITextField 自定义清除按钮在 layoutIfNeeded 上跳转

问题描述

gif

我有一个用于文本字段的自定义清除按钮。layoutIfNeeded如果我在键盘显示功能中使用,此按钮会从左向右跳转。它仅在我第一次编辑文本字段时发生,在后续编辑时不会发生。我如何解决它?我需要layoutIfNeeded流畅的动画。

class MyViewController: UIViewController {
    @IBOutlet weak var emailField: CustomTextField!

    @objc func handleKeyboardNotification(_ notification: Notification) {

        // calculate height etc....

        UIView.animate(withDuration: 0.5, animations: { () -> Void in
            self.view.layoutIfNeeded() // This causes clear button to jump
        })

    }
}

class CustomTextField: UITextField {

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

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

    override func awakeFromNib() {
        super.awakeFromNib()
        self.initialize()

        self.translatesAutoresizingMaskIntoConstraints = false

        // other code
    }

    func initialize() {
        self.text = ""
        self.setPlaceHolderTextFontAndColour(text: self.placeholder!, font: UIFont.body, colour: .lightGray)

        let clearButton = UIButton(frame: CGRect(x: 0, y: 0, width: 32, height: 32))
        clearButton.setImage(UIImage.clearButton, for: [])

        self.rightView = clearButton
        clearButton.addTarget(self, action: #selector(self.clearClicked(sender: )), for: .touchUpInside)

        self.clearButtonMode = .never
        self.rightViewMode = .whileEditing
    }
}

标签: iosswiftuitextfield

解决方案


也可以在你的课堂上尝试CustomTextField(如果你不需要其他动画)

override func layoutSubviews() {
    UIView.performWithoutAnimation {
        super.layoutSubviews()
    }
}

推荐阅读