4

私は CAShapeLayer を持っており、ユーザーの指に導かれて画面上を移動するという単純なタスクを実行する必要があります。

問題は、動きが遅すぎることです。レイヤーは動きますが、ラグがあり遅く感じます。

UIImage が移動される別のテスト アプリがあり、遅延がまったくなく、画像が即座に移動します。

これを克服するにはどうすればよいですか?

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)イベント
{  

    currentPoint = [[任意のオブジェクトに触れる] locationInView:self];

}



- (void) touchesMoved:(NSSet*)touches withEvent:(UIEvent*)イベント
{


    CGPoint activePoint = [[任意のオブジェクトに触れる] locationInView:self];
    CGPoint newPoint = CGPointMake(activePoint.x - currentPoint.x,activePoint.y - currentPoint.y);
    curLayer.position = CGPointMake(shapeLayer.position.x+newPoint.x,shapeLayer.position.y+newPoint.y);
    currentPoint = activePoint;

}

ありがとう!

4

2 に答える 2

15

レイヤーに位置を設定すると (デフォルトでアクションが無効になっている UIView のルート レイヤーではない場合)、暗黙的に新しい位置にアニメーション化され、0.25 秒かかることに注意してください。よりスムーズにしたい場合は、次のようにレイヤーでのアクションを一時的に無効にします。

- (void) touchesMoved:(NSSet*)touches withEvent:(UIEvent*)event
{
  CGPoint activePoint = [[touches anyObject] locationInView:self];
  CGPoint newPoint = CGPointMake(activePoint.x - 
                              currentPoint.x,activePoint.y - currentPoint.y);

  [CATransaction begin];
  [CATransaction setDisableActions:YES];
  curLayer.position = CGPointMake(shapeLayer.position.x + 
                             newPoint.x, shapeLayer.position.y + newPoint.y);
  [CATransaction commit];
  currentPoint = activePoint;
}

これにより、アニメーション化するのではなく、新しい位置にジャンプする必要があります。それでも問題が解決しない場合は、レイヤーの初期化コードを調べて、レイヤーのプロパティとディメンションを確認してください。たとえば、cornerRadius などのプロパティは、パフォーマンスに影響を与える可能性があります。

于 2011-02-16T18:11:17.403 に答える
3

特に通常同じ縮尺で描画される場合は、 で に設定shouldRasterizeしてみてYESください。CAShapeLayerアプリが高 DPI デバイスで実行される場合はrasterizationScale、レイヤーのcontentsScale.

シェイプをラスタライズするとシェイプの移動が速くなりますが、レイヤーのパスまたはサイズをアニメートしている間は、一時的にラスタライズを無効にすることをお勧めします。

于 2011-02-16T16:59:55.370 に答える