2017-02-21 6 views
0

制約を使用して別のビューの上でuiviewを回転しようとしています。ここに私が実装したものがあります制約を使用したビューの回転 - Swift

mediaContainer.addSubview(overlayView) 
keepBottomLeft() 
overlayView.layoutIfNeeded() 

func keepBottomLeft(overlayView: UIView) { 
    NSLayoutConstraint(item: overlayView, attribute:.width, relatedBy:.equal,toItem: mediaContainer, attribute:.width, multiplier: 0.8, constant: 0).isActive = true 
    NSLayoutConstraint(item: overlayView, attribute:.leading, relatedBy:.equal, toItem: mediaContainer, attribute:.leading, multiplier: 1, constant: 0).isActive = true 
    NSLayoutConstraint(item: overlayView, attribute:.height, relatedBy:.equal,toItem: nil, attribute:.notAnAttribute, multiplier: 1.0, constant: 26).isActive = true 
    NSLayoutConstraint(item: overlayView, attribute:.bottom, relatedBy:.equal, toItem: mediaContainer, attribute:.bottom, multiplier: 1, constant: 0).isActive = true 
    overlayView.transform = CGAffineTransform(rotationAngle: CGFloat(-M_PI_2)) 
} 

アンカーポイントを使用する必要がありますか?これは私が達成しようとしていることですか?

From View A

To View B

私は何を取得することは

で誰かが正しい方向に私を指すことができますか?

+0

あなたが実際にあなたのビューは、あなたの第二の画像にあなたの最初の画像から連続的に回転しますか? (したがって、それは、2番目の画像のように垂直になるまで、斜めに傾きます) –

+0

ここで回転をアニメーション化していません。 IBActionの新しい位置に移動するだけです。 –

+0

ビューの内容を90°回転させるか、高さと幅を入れ替えてアンカーポイントを調整しますか? –

答えて

1

アンカーポイントは黄色のビューの中央にあります。デフォルト。 layer.anchorPoint = CGPoint(x:0、y:1)で左下に移動するかどうかを指定します[アンカーは、ポイントではなくユニット座標の形式になっています。あなたはまだx =高さの余分な翻訳が必要です。

また、トランスフォームを連結し、回転させたい点に中心を移動し、回転を行い、翻訳を逆にすることもできます(これは実際には3次元変換で行う典型的な方法です)。

更新日: ここは遊び場です。変換を適用する逆の順序で行列を連結することに注意してください。あなたが変換を分解し、それぞれが何をするか見ることができるように私はここにアニメーションを持っている:

  • 回しビューを(この変換の最後である)

    1. 移動ビューを原点(0,0)に90時計回りの度合い
    2. ビューを現在の幅の半分だけ上に移動し、スーパービューの下端に移動します。

      import PlaygroundSupport 
      import UIKit 
      class V: UIViewController { 
          var overlayView = UIView() 
          override func viewDidLoad() { 
           super.viewDidLoad() 
           overlayView.translatesAutoresizingMaskIntoConstraints = false 
           view.addSubview(overlayView) 
           overlayView.backgroundColor = .yellow 
           overlayView.heightAnchor.constraint(equalToConstant: 26).isActive = true 
           overlayView.widthAnchor.constraint(equalTo: view.widthAnchor, multiplier: 0.8).isActive = true 
           overlayView.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true 
           overlayView.leadingAnchor.constraint(equalTo: view.leadingAnchor).isActive = true 
          } 
          override func viewDidAppear(_ animated: Bool) { 
           UIView.animate(withDuration: 1) { 
            let center = self.overlayView.center 
            let size = self.overlayView.bounds.size 
            self.overlayView.transform = 
             CGAffineTransform(translationX: self.view.bounds.size.height - size.width/2, y: -size.height/2) 
             .concatenating(CGAffineTransform(rotationAngle: CGFloat.pi/2) 
             .concatenating(CGAffineTransform(translationX: -center.x, y: -center.y))) 
           } 
          } 
      } 
      
      let v = V() 
      v.view.frame = CGRect(x: 0, y: 0, width: 200, height: 200) 
      PlaygroundPage.current.liveView = v 
      
  • +0

    制約を追加した後: 私はこの 'overlayView.layer.anchorPoint = CGPoint(x:0、y:1)を試しました。 overlayView.transform = CGAffineTransform(translationX:overlayView.frame.size.height、y:0) overlayView.transform = CGAffineTransform(rotationAngle:CGFloat(-M_PI_2)) '。これは、オーバーレイビューを上に持ちますが、左端には近づかないようにします。ここに何もないのですか? –

    +0

    あなたは行列を連結しなければなりません(すなわちそれらを掛け合わせる)。 https://developer.apple.com/reference/coregraphics/cgaffinetransform/1455996-concatenating –

    +0

    私もこれを試しました: 'overlayView.transform = CGAffineTransform(translationX:overlayView.frame.size.height、y:0).concatenating( CGAffineTransform(rotationAngle:CGFloat(-M_PI_2))) 'これは私がhttp://imgur.com/a/8dPpCを取得するものです –

    関連する問題