Search code examples
swiftsnapkit

Updating bottom constraint with SnapKit and Swift 4


Here is my code. I am using KeyboardHelper library for managing keyboard states and getting keyboard height, and also SnapKit. I have a text field that triggers keyboard. When a keyboard is visible I want to raise blue box above keyboard bounds, so it's visible. So far I failed to do so. Can you please help me with my code?

private var keyboardHelper : KeyboardHelper?
let box = UIView()

override func viewDidLoad() {
    super.viewDidLoad()
    keyboardHelper = KeyboardHelper(delegate: self)

    guard let superview = self.view else {
        return
    }

    box.backgroundColor = UIColor.blue
    superview.addSubview(box)

    box.snp.makeConstraints { make in
        make.bottom.equalTo(superview.snp.bottom).offset(-16)
        make.width.equalTo(200)
        make.centerX.equalTo(superview)
        make.height.equalTo(100)
    }
}

func keyboardWillAppear(_ info: KeyboardAppearanceInfo) {
    UIView.animate(withDuration: TimeInterval(info.animationDuration), delay: 0, options: info.animationOptions, animations: {
        self.box.snp.updateConstraints({ make in
            make.bottom.equalTo(info.endFrame.size.height).offset(10)
        })
        self.box.layoutIfNeeded()
    }, completion: nil)
}

Solution

  • According to SnapKit docs:

    if you are only updating the constant value of the constraint you can use the method snp.updateConstraints

    You need to use snp.remakeConstraints in your case. Furthermore, you should probably call layoutIfNeeded on superview.

    Optionally you could get rid of changing constraints and just animate proper transforms on show:

    box.transform = CGAffineTransform(translationX: 0.0, y: neededTranslation)
    

    on hide:

    box.transform = .identity