gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 20:53:20 26 4
gpt4 key购买 nike

我正在尝试为我的应用程序制作 Logo (UILabel) 从中间到顶部的动画。我尝试的是更新约束,但它似乎不起作用。问题是动画,即 Logo ,从原点 (0,0) 而不是 View 的中间到顶部。必要的代码( Controller 及其继承的类):

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)
})
}
}

最佳答案

在界面中并执行初始布局之前,您无法为 View 设置动画。因此,您调用 self.animateTitleLabel() 的方式太早了(在 init 中)。

viewDidAppear 中调用它。当然,您必须使用 Bool 标志属性来确保您不会在viewDidAppear 运行时每次 调用它,只有第一次 调用它。

(可能需要在 viewDidLayoutSubviews 中调用它;您必须进行试验。)

关于ios - 使用 SnapKit 时无法正确设置动画,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55007330/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com