【问题标题】:CAShapeLayer Slow User InteractionCAShapeLayer 缓慢的用户交互
【发布时间】:2023-07-16 21:30:01
【问题描述】:

我有一个 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);
    当前点 = 活动点;

}

谢谢!

【问题讨论】:

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


    【解决方案1】:

    请记住,当您在层上设置位置时(假设它不是默认禁用操作的 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 等属性会影响性能。

    【讨论】:

    • 几个月来我一直在努力解决这个问题。谢谢!
    【解决方案2】:

    尝试在您的CAShapeLayer 上将shouldRasterize 设置为YES,尤其是在通常以相同比例绘制的情况下。如果您的应用在高 DPI 设备上运行,您可能还需要设置 rasterizationScale 以匹配图层的 contentsScale

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

    【讨论】:

      最近更新 更多