我试图获取一个在视图出现时增加其比例的视图(使用下面的loadResultsView()
函数),但是每当我运行此视图时,都不会发生动画。该视图最终以动画块中定义的结果状态结束。我尝试使用框架值而不是视图上的约束,并且发生了同样的事情。为什么会这样?
class ResultsModalViewController: UIViewController {
let resultsView: ResultsView = {
let nibArray = Bundle.main.loadNibNamed("ResultsView", owner: self, options: nil)
let resultsView = nibArray?.first as! ResultsView
resultsView.restaurant = YelpSearchController.shared.pickRandomRestaurant()
resultsView.translatesAutoresizingMaskIntoConstraints = false
resultsView.layer.cornerRadius = 5
return resultsView
}()
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = UIColor(red: 1, green: 1, blue: 1, alpha: 0.30)
let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(bgViewTapped))
view.addGestureRecognizer(tapGestureRecognizer)
loadResultsView()
}
func loadResultsView() {
self.view.addSubview(resultsView)
self.resultsView.transform = CGAffineTransform(scaleX: 0.5, y: 0.5)
UIView.animate(withDuration: 5, delay: 0, usingSpringWithDamping: 0.5, initialSpringVelocity: 1, options: .curveEaseOut, animations: {
self.resultsView.transform = CGAffineTransform.identity
})
NSLayoutConstraint.activate([
resultsView.centerXAnchor.constraint(equalTo: self.view.centerXAnchor),
resultsView.centerYAnchor.constraint(equalTo: self.view.centerYAnchor),
resultsView.widthAnchor.constraint(equalToConstant: 300)
])
}
@objc func bgViewTapped() {
dismiss(animated: true, completion: nil)
}
}
答案 0 :(得分:0)
首先,您需要添加高度限制
resultsView.heightAnchor.constraint(equalToConstant: 300)
然后在其中动画
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = UIColor(red: 1, green: 1, blue: 1, alpha: 0.30)
let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(bgViewTapped))
view.addGestureRecognizer(tapGestureRecognizer)
setupResultsView()
}
override func viewDidAppear(_ animated:Bool) {
super.viewDidAppear(animated)
animateResultsView()
}
func setupResultsView() {
self.view.addSubview(resultsView)
NSLayoutConstraint.activate([
resultsView.centerXAnchor.constraint(equalTo: self.view.centerXAnchor),
resultsView.centerYAnchor.constraint(equalTo: self.view.centerYAnchor),
resultsView.widthAnchor.constraint(equalToConstant: 300),
resultsView.heightAnchor.constraint(equalToConstant: 300)
])
}
func animateResultsView() {
self.resultsView.transform = CGAffineTransform(scaleX: 0.5, y: 0.5)
UIView.animate(withDuration: 5, delay: 0, usingSpringWithDamping: 0.5, initialSpringVelocity: 1, options: .curveEaseOut, animations: {
self.resultsView.transform = CGAffineTransform.identity
})
}
答案 1 :(得分:0)
此问题通过将loadResultsView()
而不是viewWillAppear()
放入viewDidLoad()
方法来解决。感谢@Koen指出在视图出现之前已调用viewDidLoad()
。
class ResultsModalViewController: UIViewController {
let resultsView: ResultsView = {
let nibArray = Bundle.main.loadNibNamed("ResultsView", owner: self, options: nil)
let resultsView = nibArray?.first as! ResultsView
resultsView.restaurant = YelpSearchController.shared.pickRandomRestaurant()
resultsView.translatesAutoresizingMaskIntoConstraints = false
resultsView.layer.cornerRadius = 5
return resultsView
}()
override func viewDidLoad() {
super.viewDidLoad()
let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(bgViewTapped))
view.addGestureRecognizer(tapGestureRecognizer)
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
view.backgroundColor = UIColor(red: 1, green: 1, blue: 1, alpha: 0.30)
loadResultsView()
}
func loadResultsView() {
self.view.addSubview(resultsView)
self.resultsView.transform = CGAffineTransform(scaleX: 0.5, y: 0.5)
UIView.animate(withDuration: 1, delay: 0, usingSpringWithDamping: 0.5, initialSpringVelocity: 1, options: .curveEaseOut, animations: {
self.resultsView.transform = CGAffineTransform.identity
})
NSLayoutConstraint.activate([
resultsView.centerXAnchor.constraint(equalTo: self.view.centerXAnchor),
resultsView.centerYAnchor.constraint(equalTo: self.view.centerYAnchor),
resultsView.widthAnchor.constraint(equalToConstant: 300)
])
}
@objc func bgViewTapped() {
dismiss(animated: true, completion: nil)
}
}