我有一个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; }
谢谢!
答案 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
上设置shouldRasterize
到CAShapeLayer
,特别是如果它通常以相同的比例绘制。如果您的应用在高DPI设备上运行,您可能还需要设置rasterizationScale
以匹配图层的contentsScale
。
虽然光栅化你的形状可以让你更快地移动形状,但你可能想要在为图层的路径或大小设置动画时暂时禁用光栅化。