CAShapeLayer Медленное взаимодействие с пользователем - PullRequest
4 голосов
/ 16 февраля 2011

У меня есть 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 ]

15 голосов
/ 16 февраля 2011

Имейте в виду, что когда вы устанавливаете позицию на слое (при условии, что это не корневой слой 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, например, могут влиять на производительность.

3 голосов
/ 16 февраля 2011

Попробуйте установить shouldRasterize на YES на вашем CAShapeLayer, особенно если оно обычно рисуется в том же масштабе. Если ваше приложение работает на устройствах с высоким разрешением, вам также может потребоваться установить rasterizationScale для соответствия contentsScale.

Хотя растеризация вашей фигуры может ускорить ее перемещение, вы, вероятно, захотите временно отключить растеризацию, пока вы анимируете путь или размер слоя.

...