web-dev-qa-db-ja.com

UIScrollView contentOffsetプロパティをそのレイヤーを介してアニメーション化できますか?

CGPathRefを使用してUIScrollViewをズームおよびスクロールしたい。そのため、UIScrollViewのレイヤープロパティをアニメーション化する必要があると思いますか?しかし、UIViewアニメーションを実行し、そのcontentOffsetプロパティとzoomScaleを設定するのと同等になるようにアニメーション化するプロパティはどれですか?

これらはCALayerのプロパティではありません。

私がこれにどのようにアプローチするかについてのアイデアはありますか?繰り返しますが、スクロールビューを特定のcontentOffsetとzoomScaleに移動したいだけですが、必ずしもポイントAからポイントBに直線的に移動する必要はなく、ズームAからズームBにそれぞれ移動します。

CGPathRefを使用してCAKeyFrameAnimationを考えていましたが、アニメーション化するプロパティがわかりません。

24
horseshoe7

boundsプロパティをアニメーション化する必要があります。実際、それはcontentOffsetプロパティが舞台裏で使用するものです。

例:

CGRect bounds = scrollView.bounds;

CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"bounds"];
animation.duration = 1.0;
animation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];

animation.fromValue = [NSValue valueWithCGRect:bounds];

bounds.Origin.x += 200;

animation.toValue = [NSValue valueWithCGRect:bounds];

[scrollView.layer addAnimation:animation forKey:@"bounds"];

scrollView.bounds = bounds;

興味があれば、私がこの情報を取得するために使用した方法は次のとおりです。

[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:0.5];

[scrollView setContentOffset:CGPointMake(200, 0) animated:NO];

[UIView commitAnimations];

NSLog(@"%@",scrollView);

NSLog呼び出しは次のように出力します。

<UIScrollView: 0x860ba20; frame = (-65.5 0; 451 367); clipsToBounds = YES; autoresize = W+RM+TM+H; animations = { bounds=<CABasicAnimation: 0xec1e7c0>; }; layer = <CALayer: 0x860bbc0>; contentOffset: {246, 0}>

animationsスニペットは、アクティブなすべてのアニメーションを一覧表示します。この場合は{ bounds=<CABasicAnimation: 0xec1e7c0>; }

お役に立てれば。

55
pt2ph8

Swift 4.2

この例は、pt2ph8のobj-c回答に基づいています。

https://stackoverflow.com/a/8741283/6113158

var scrollView = UIScrollView()

func animateScrollView(duration: Double, to newBounds: CGRect) {
    let animation = CABasicAnimation(keyPath: "bounds")
    animation.duration = duration
    animation.fromValue = scrollView.bounds
    animation.toValue = newBounds

    animation.timingFunction = CAMediaTimingFunction(name: CAMediaTimingFunctionName.easeOut)

    scrollView.layer.add(animation, forKey: nil)

    scrollView.bounds = newBounds
}
0
alex02rt

CALayerの移動は、(できれば)その.positionプロパティを設定することによって行われます-またはおそらくanchorPoint(そのドキュメントを参照してください: http://developer.Apple.com/library/ios/#documentation/GraphicsImaging/ Reference/CALayer_class/Introduction/Introduction.html )。

...しかし、UIScrollViewを使用している場合は、CALayerをいじりたくないと思います。プレーンなCoreAnimationsをScrollViewに適用してみましたか?

(問題は、UIScrollViewがCALayerの上に実装されているため、今日動作するようにハックできたとしても、将来のiOSバージョンで機能しなくなる可能性が非常に高いです。可能であれば、その特定のクラスのCALayerを避けたいと思います)

0
Adam