CALayer Cambiar tamaño es lento

Estoy teniendo algunos problemas de performance con algún código que he escrito para cambiar el tamaño de un CALayer usando el tacto. Funciona bien pero la animation está lejos de ser lo suficientemente ágil y se queda atrás de la location táctil.

CGPoint startPoint; CALayer *select; - (CGRect)rectPoint:(CGPoint)p1 toPoint:(CGPoint)p2 { CGFloat x, y, w, h; if (p1.x < p2.x) { x = p1.x; w = p2.x - p1.x; } else { x = p2.x; w = p1.x - p2.x; } if (p1.y < p2.y) { y = p1.y; h = p2.y - p1.y; } else { y = p2.y; h = p1.y - p2.y; } return CGRectMake(x, y, w, h); } - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { UITouch *t1 = [[[event allTouches]allObjects]objectAtIndex:0]; CGPoint loc = [t1 locationInView:self]; startPoint = loc; lastPoint = CGPointMake(loc.x + 5, loc.y + 5); select = [CALayer layer]; select.backgroundColor = [[UIColor blackColor]CGColor]; select.frame = CGRectMake(startPoint.x, startPoint.y, 5, 5); [self.layer addSublayer:select]; } - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { UITouch *t1 = [[[event allTouches]allObjects]objectAtIndex:0]; CGPoint loc = [t1 locationInView:self]; select.bounds = [self rectPoint:startPoint toPoint:loc]; } 

¿Hay una forma mejor de lograr esto?

El retraso se debe a que está cambiando la propiedad de bounds de la capa, que es una propiedad animable.

Con CALayers (la CA significa animation del núcleo …) cualquier cambio a una propiedad animable estará animado por defecto. Esto se llama animation implícita. La animation pnetworkingeterminada toma 0.25 segundos, por lo que si la actualiza con frecuencia, por ejemplo durante el procesamiento de los toques, esto se sumrá y provocará un retraso visible.

Para evitar esto, debe declarar una transacción de animation, desactivar las animaciones implícitas y luego cambiar las properties:

 [CATransaction begin]; [CATransaction setDisableActions:YES]; layer.bounds = whatever; [CATransaction commit];