4

我有一个 CAShapeLayer,它必须完成一个简单的任务,即在用户手指的引导下在屏幕上移动。

问题是移动太慢了。该层确实移动,但有一个滞后,感觉很慢。

我有另一个测试应用程序,其中 UIImage 被移动并且完全没有滞后并且图像立即移动。

我能做些什么来克服这个问题?

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{  

    currentPoint = [[touches anyObject] locationInView:self];

}



- (void) touchesMoved:(NSSet*)touches withEvent:(UIEvent*)event
{


    CGPoint activePoint = [[touches anyObject] 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);
    当前点 = 活动点;

}

谢谢!

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

尝试将 设置shouldRasterizeYESCAShapeLayer特别是如果它通常以相同的比例绘制。如果您的应用程序在高 DPI 设备上运行,您可能还需要设置rasterizationScale以匹配图层的contentsScale.

虽然栅格化您的形状可以更快地移动形状,但您可能希望在为图层的路径或大小设置动画时暂时禁用栅格化。

于 2011-02-16T16:59:55.370 回答