1

私はCALayerを持っており、このCALayerのサブレイヤーとして、解像度276x183の画像を含むimageLayerを追加しました。

メイン ビューに UIPanGestureRecognizer を追加し、次のように CALayer の座標を計算しました。

- (void)panned:(UIPanGestureRecognizer *)sender{

        subLayer.frame=CGRectMake([sender locationInView:self.view].x-138, [sender locationInView:self.view].y-92, 276, 183);

}

viedDidLoadで私は持っています:

subLayer.backgroundColor=[UIColor whiteColor].CGColor;
subLayer.frame=CGRectMake(22, 33, 276, 183);

imageLayer.contents=(id)[UIImage imageNamed:@"A.jpg"].CGImage;
imageLayer.frame=subLayer.bounds;
imageLayer.masksToBounds=YES;
imageLayer.cornerRadius=15.0;

subLayer.shadowColor=[UIColor blackColor].CGColor;
subLayer.cornerRadius=15.0;
subLayer.shadowOpacity=0.8;
subLayer.shadowOffset=CGSizeMake(0, 3);
[subLayer addSublayer:imageLayer];
[self.view.layer addSublayer:subLayer];

必要な出力が得られますが、シミュレーターでは少し遅くなります。デバイスでまだテストしていません。私の質問は - 画像を含む CALayer を移動してもよろしいですか??

4

2 に答える 2

2

はい、画像を含む CALayer を移動しても問題ありません。

パン操作で画像を移動するだけの場合は、全体を更新するのではなくframe、レイヤーのpositionプロパティを更新する必要があります。このように:

- (void)panned:(UIPanGestureRecognizer *)sender {
    subLayer.position=CGPointMake([sender locationInView:self.view].x, [sender locationInView:self.view].y);
}
于 2012-09-04T15:36:30.950 に答える
1

2つのこと:

まず、シミュレーターのパフォーマンスに基づいて結論を出すことはできません。シミュレーターには、デバイスよりも桁違いに速いものもあれば、大幅に遅いものもあります。アニメーションは特に混合バッグです。

パフォーマンスが重要な作業を行っている場合は、早い段階で頻繁にデバイスでテストしてください。

第二に、ジェスチャ認識エンジンを使用してレイヤーをアニメーション化することはできますが、それは非常に回りくどい方法です。ジェスチャ認識機能はビューで動作するように設計されており、認識機能をサブレイヤーではなくサブビューに結び付ける方がはるかに簡単でクリーンです。

レイヤーを使用する際に発生する大きな問題の 1 つは、ヒット テストです。画像を手放し、さらにドラッグしようとすると、含まれているビューにジェスチャがあり、ジェスチャ座標を取得し、レイヤーでヒット テストを行う必要があります。うーん。

Apple の touches サンプル アプリのジェスチャ ベース バージョンを見てみましょう。ジェスチャーを使用して UIView オブジェクトを画面上できれいに移動する方法を示します。

カスタム レイヤー コンテンツを含むビューを作成し、それをドラッグできることに注意してください。

于 2012-09-06T12:15:40.417 に答える