代码之家  ›  专栏  ›  技术社区  ›  aleksy.t

使用SnapKit时无法正确设置动画

  •  0
  • aleksy.t  · 技术社区  · 5 年前

    我正在尝试为我的应用程序制作一个徽标(UILabel)的动画,从中间到顶部。我试图更新约束,但似乎不起作用。问题是动画,即徽标,从原点(0,0)开始,而不是从视图的中间到顶部。必要的代码(控制器及其继承的类):

    import UIKit
    import SnapKit
    
    class EntryController: LatroController {
    
        static let spacingFromTheTop: CGFloat = 150
        var latroLabelCenterYConstraint: Constraint?
    
        override init() {
            super.init()
            self.animateTitleLabel()
        }
    
        required init?(coder aDecoder: NSCoder) {
            super.init(coder: aDecoder)
        }
    
        override func initTitleLabel() {
            self.latroLabel = UILabel()
            self.latroLabel?.text = General.latro.rawValue
            self.latroLabel?.textAlignment = .center
            self.latroLabel?.font = UIFont (name: General.latroFont.rawValue, size: EntryController.fontSize)
            self.latroLabel?.textColor = .white
            self.latroLabel?.contentMode = .center
            self.view.addSubview(self.latroLabel!)
    
            self.latroLabel?.snp.makeConstraints({ (make) in
                make.width.equalTo(EntryController.latroWidth)
                make.height.equalTo(EntryController.latroHeight)
                make.centerX.equalTo(self.view.center.x)
                self.latroLabelCenterYConstraint = make.centerY.equalTo(self.view.center.y).constraint
            })
        }
    
        func animateTitleLabel() {
            UIView.animate(withDuration: 1.5) {
                self.latroLabel?.snp.updateConstraints { (make) in
                    make.centerY.equalTo(200)
                }
                self.view.layoutIfNeeded()
            }
        }
    }
    

    import UIKit
    import SnapKit
    
    class LatroController: UIViewController {
    
    static let latroWidth: CGFloat = 288
    static let latroHeight: CGFloat = 98
    static let btnWidth: CGFloat = 288
    static let btnHeight: CGFloat = 70
    static let txtFieldWidth: CGFloat = 288
    static let txtFieldHeight: CGFloat = 50
    static let fontSize: CGFloat = 70
    static let bottomOffset: CGFloat = 100
    static let buttonOffset: CGFloat = 20
    static let logoOffset: CGFloat = 50
    
    var latroLabel: UILabel?
    var signUpBtn: UIButton?
    var logInBtn: UIButton?
    var titleLabelYConstraint: NSLayoutConstraint?
    var usernameTxtField: UITextField?
    
    init() {
        super.init(nibName: nil, bundle: nil)
        self.view.backgroundColor = UIColor(named: General.orange.rawValue)
        self.initTitleLabel()
    }
    
    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }
    
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        self.navigationController?.setNavigationBarHidden(true, animated: false)
    }
    
    override func viewDidDisappear(_ animated: Bool) {
        super.viewDidDisappear(animated)
        self.navigationController?.setNavigationBarHidden(false, animated: true)
    }
    
    func initTitleLabel() {
        self.latroLabel = UILabel()
        self.latroLabel?.text = General.latro.rawValue
        self.latroLabel?.textAlignment = .center
        self.latroLabel?.font = UIFont (name: General.latroFont.rawValue, size: EntryController.fontSize)
        self.latroLabel?.textColor = .white
        self.latroLabel?.contentMode = .center
        self.view.addSubview(self.latroLabel!)
    
        self.latroLabel?.snp.makeConstraints({ (make) in
            make.width.equalTo(LatroController.latroWidth)
            make.height.equalTo(LatroController.latroHeight)
            let safeAreaLayoutHeight = self.view.safeAreaLayoutGuide.layoutFrame.height
            print(safeAreaLayoutHeight)
            make.top.equalTo(self.view).offset(150)
            make.centerX.equalTo(self.view.center.x)
        })
    }
    }
    
    0 回复  |  直到 4 年前
        1
  •  2
  •   matt    5 年前

    只有在视图位于界面中并执行了初始布局后,才能设置视图的动画。你就是这样打电话来的 self.animateTitleLabel() init ).

    viewDidAppear . 当然,您必须使用Bool flag属性来确保不调用它 每一个 视图显示 跑步,只有 第一 时间。

    viewDidLayoutSubviews 相反,你必须进行实验。)

        2
  •  1
  •   aleksy.t    5 年前

    self.view.updateLayoutIfNeeded() 
    

    设置约束后!