2

のメイン ビューの中心に移動したいビューがありViewControllerます。を使用してこれを行いたいですUIView.animateWithDuration。メソッドの完了ブロックで、2 番目のビューを追加したいと考えています。

ViewController私のクラスのコードの下。ストーリーボードでビューをセットアップし、アウトレット経由で接続しました

import UIKit

class ViewController: UIViewController {

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.



}


override func viewDidAppear(animated: Bool) {
        animation()
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}


@IBOutlet weak var card: UIView!



func animation() {
    print("viewCenter  \(self.view.center)")
    print("cardCenter 1 \(self.card.center)")

    UIView.animateWithDuration(1.0,
        delay: 2.0,
        options: UIViewAnimationOptions.CurveLinear,
        animations: { () -> Void in
            self.card.center = self.view.center
            print("number of constraints on card: \(self.card.constraints.count)")
        },
        completion: { finished in
            print("cardCenter 2 \(self.card.center)")

                let rect = CGRect(x: 200, y: 300, width: 50, height: 50)
                let tempView = UIView(frame: rect)
                tempView.backgroundColor = UIColor.blueColor()
                self.view.addSubview(tempView)

                self.view.layoutIfNeeded()

             print("cardCenter 3 \(self.card.center)")
        })
}

}

完了が実行される瞬間まで、アニメーションは正常に機能します。最初のビューは、アニメーションの前の最初の場所に表示されます。ただし、コンソールでは、ビューの中心の印刷された座標はメイン ビューの中心と一致します

コンソール出力

ビューセンター (160.0、284.0)  
カードセンター 1 (140.0、92.0)  
カードセンター 2 (160.0、284.0)  
カードセンター 3 (160.0、284.0)  

完了ブロックに UIView を追加するときのこの動作を説明できる人はいますか?

編集

Chris のコメントに基づいて、制約card
self.view.layoutIfNeeded()完了にいくつかのログを追加しました。コンソール出力にビューの初期座標が表示されるようになりました

新しいコンソール出力

viewCenter (160.0, 284.0)
cardCenter 1 (140.0, 92.0)
カードの制約数: 0
cardCenter 2 (160.0, 284.0)
cardCenter 3 (140.0, 92.0)

4

1 に答える 1

1

Interface Builder に制約がある場合は、制約を削除してからcard再試行してください。期待どおりに機能することがわかります。

制約のあるビューをアニメーション化するときは、まず制約定数を更新してから、アニメーション ブロック内で を呼び出しますself.view.layoutIfNeeded()。例で見たように、プロパティを直接アニメーション化すると、予期しない結果が生じます。

于 2015-09-29T20:34:27.683 に答える