NSLayoutConstraint incorrect after CGAffineTransform

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • NSLayoutConstraint incorrect after CGAffineTransform

    Hi,
    mein code sieht bisher so aus:

    Quellcode

    1. UIView.animate(withDuration: 0.35, delay: 0, usingSpringWithDamping: 1, initialSpringVelocity: 1, options: UIViewAnimationOptions.curveEaseOut, animations: {
    2. let transform:CGFloat = 0.4
    3. self.lockIcon.transform = CGAffineTransform(scaleX: transform, y: transform)
    4. self.lockIcon.layer.anchorPoint = CGPoint(x: 0.5, y: 1)
    5. self.view.layoutIfNeeded()
    6. }, completion: nil)

    mein passcodeTextfield besitzt diesen constraint:

    Quellcode

    1. NSLayoutConstraint(item: passcodeTextfield, attribute: .top, relatedBy: .equal, toItem: lockIcon, attribute: .bottom, multiplier: 1, constant: 30)
    Mein Problem ist nun, dass nach dem transform der Abstand zwischen lockIcon und passcodeTextfield nicht mehr stimmt, obwohl self.view.layoutIfNeeded() dafür sorgen soll, dass die Constraints wieder passen.
    Mein passcodeTextfield müsste sich doch durch den Constraint auch mit nach oben verschieben?

    Was mache ich falsch ?

    Vielen Dank schonmal !
  • mufu schrieb:

    Was mache ich falsch ?
    Dein lockIcon wird eine Constraint für die Höhe haben. Diese wird durch deine Animation nicht verändert. Ich habe mal versucht das in einem Playground nachzustellen. So könnte das gehen, was du versuchst:

    Quellcode

    1. import UIKit
    2. import PlaygroundSupport
    3. class TestController: UIViewController {
    4. let orangeView = UIView()
    5. let greenView = UIView()
    6. var heightConstraint: NSLayoutConstraint?
    7. override func loadView() {
    8. let view = UIView()
    9. view.addSubview(orangeView)
    10. orangeView.translatesAutoresizingMaskIntoConstraints = false
    11. orangeView.backgroundColor = UIColor.orange
    12. orangeView.widthAnchor.constraint(equalToConstant: 100).isActive = true
    13. heightConstraint = orangeView.heightAnchor.constraint(equalToConstant: 100)
    14. heightConstraint?.isActive = true
    15. view.addSubview(greenView)
    16. greenView.translatesAutoresizingMaskIntoConstraints = false
    17. greenView.backgroundColor = UIColor.green
    18. greenView.widthAnchor.constraint(equalToConstant: 100).isActive = true
    19. greenView.heightAnchor.constraint(equalToConstant: 100).isActive = true
    20. orangeView.topAnchor.constraint(equalTo: view.topAnchor, constant: 20).isActive = true
    21. orangeView.leftAnchor.constraint(equalTo: view.leftAnchor, constant: 20).isActive = true
    22. greenView.topAnchor.constraint(equalTo: orangeView.bottomAnchor, constant: 20).isActive = true
    23. greenView.leftAnchor.constraint(equalTo: view.leftAnchor, constant: 20).isActive = true
    24. self.view = view
    25. }
    26. func animateIconView() {
    27. self.heightConstraint?.constant *= 0.5
    28. UIView.animate(withDuration: 0.35, delay: 2.0, usingSpringWithDamping: 1.0, initialSpringVelocity: 1.0, options: .curveEaseOut, animations: {
    29. self.orangeView.transform = CGAffineTransform(scaleX: 0.5, y: 1.0)
    30. self.view.layoutIfNeeded()
    31. }, completion: nil)
    32. }
    33. }
    34. let controller = TestController()
    35. PlaygroundPage.current.liveView = controller
    36. controller.view.layoutIfNeeded()
    37. controller.animateIconView()
    Alles anzeigen