2017-02-09 6 views
1

私は画面の上部に四角形を表示し、底部に達するまで実行して消えます。これは、新しいUIViewをViewControllerのビューに追加してから、アニメーションが完了した後、サブビュー配列から削除します。このすべてにいくつかの美しさを加えたいと思って、作成の瞬間にCGAffineTransformを使ってランダムな回転を適用します。UIViewのアニメーション作成時に不思議な効果

ここで好奇心をそそるのは、彼らが動いているとき、彼らはランダムに拡大縮小されているということです!私はそれが回転に関連している必要があることを知っています。私がそれを適用しないと、すべての四角形がスケーリングせずに完全に移動するので、しかし、私はそれを適用すると起こるので...

何が起こっているのか教えてください...なぜスケーリングがスケーリングですか?

これはコードです:

import UIKit 

class ViewController: UIViewController { 

    var timer: Timer! 

    override func viewDidLoad() { 
     timer = Timer.scheduledTimer(
      timeInterval: 1, 
      target: self, 
      selector: #selector(createView), 
      userInfo: nil, 
      repeats: true 
     ) 
    } 

    @objc private func createView() { 
     let v = UIView(frame: CGRect(
      x: self.view.bounds.width/2 - 50, 
      y: -100, 
      width: 100, 
      height: 100 
     )) 
     v.backgroundColor = UIColor.red 
     v.transform = CGAffineTransform(
      rotationAngle: CGFloat(Double(arc4random_uniform(360)) * M_PI/180) 
     ) 
     self.view.addSubview(v) 

     UIView.animate(withDuration: 5, delay: 0, options: [.curveLinear], animations: { 
      v.frame.origin.y = self.view.bounds.height 
     }, completion: { 
      _ in 
      v.removeFromSuperview() 
     }) 

     print(self.view.subviews.count) 
    } 

} 

答えて

3

アニメーションクラブの最初のルールは、あなたがそれを変換しています変更した際に、ビューのフレームを操作していないです。

ビューの変換がID変換でない場合、フレームは未定義であり、フレームを変更しようとすると未定義の動作になります。あなたがその未定義の振る舞いを経験しているように聞こえます。

フレームではなくビューの中心プロパティを操作するコードをリファクタリングするか、トランスフォームを使用してオフセットを適用する必要がありますが、回転によってオフセットの基準フレームが変更されるため、トリッキーです。

ビューのcenterプロパティを調整することをお勧めします。

+0

これは完璧に機能しました!どうもありがとうございます! –

+0

心配はいりません。ビューのフレームを見るときに奇妙な結果が得られたり、フレームを変更すると奇妙な結果が生じるたびに、非恒等変換をチェックします。私はこのルールを忘れてしまって、何が間違っているのか把握しようと、頭を掻き回す時間を無駄にしました。 –

関連する問題