CAShapeLayer缓慢的用户交互

时间:2011-02-15 23:33:32

标签: uikit core-animation quartz-graphics cgpath cashapelayer

我有一个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); 
    currentPoint = activePoint;

}

谢谢!

2 个答案:

答案 0 :(得分: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等属性可能会影响性能。

答案 1 :(得分:3)

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

虽然光栅化你的形状可以让你更快地移动形状,但你可能想要在为图层的路径或大小设置动画时暂时禁用光栅化。