CGAffineTransform无法在动画块内进行动画处理

时间:2018-07-08 21:33:37

标签: ios swift uiviewanimation cgaffinetransform

我试图获取一个在视图出现时增加其比例的视图(使用下面的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)
    }

}

2 个答案:

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

}