2017-06-26 2 views
0

私はスケールと変換しようとしています、と私はこれをアニメーション化するUILabelを持っています。私はこれをブロックのtransformに設定しています。アニメーションが終了するとCGAffineTransformがそれを動かすところ、それは正確に残るように、私は.identityにビューのtransform背中を設定し、そのフレームを更新したいと思います。擬似コード:、その終了時にIDに戻って変換し、そのフレームを保存する設定?

func animateMovement(label: UILabel, 
        newWidth: CGFloat, 
        newHeight: CGFloat, 
        newOriginX: CGFloat, 
        newOriginY: CGFloat) 
{   
    UIView.animate(withDuration: duration, animations: { 
     label.transform = ??? // Something that moves it to the new location and new size 
    }) { 
     label.frame = ??? // The final frame from the above animation 
     label.transform = CGAffineTransform.identity 
    } 
} 

私は単にアニメーションブロックに新しいフレームを割り当てない理由として:私は、フレームを変更するアニメーション化する場合は不可能であるアニメーション、合わせて拡張するラベル内のテキストを持っています変換の代わりに。

私は(ラベルが間違っているの起源を持っている)、アニメーションの後に、それが正しい場所ではないので、私が言うことができ、スペースの問題を抱えている座標。ここで

答えて

2

は私が思いついた答えです。これにより、アニメーションの期間を通して内容が拡大縮小され、終了時にオブジェクトがアイデンティティに変換されるようにリセットされます。

static func changeFrame(label: UILabel, 
         toOriginX newOriginX: CGFloat, 
         toOriginY newOriginY: CGFloat, 
         toWidth newWidth: CGFloat, 
         toHeight newHeight: CGFloat, 
         duration: TimeInterval) 
{ 
    let oldFrame = label.frame 
    let newFrame = CGRect(x: newOriginX, y: newOriginY, width: newWidth, height: newHeight) 

    let translation = CGAffineTransform(translationX: newFrame.midX - oldFrame.midX, 
             y: newFrame.midY - oldFrame.midY) 
    let scaling = CGAffineTransform(scaleX: newFrame.width/oldFrame.width, 
            y: newFrame.height/oldFrame.height) 

    let transform = scaling.concatenating(translation) 

    UIView.animate(withDuration: duration, animations: { 
     label.transform = transform 
    }) { _ in 
     label.transform = .identity 
     label.frame = newFrame 
    } 
} 
+0

良い仕事!;おめでとう –

関連する問題