2011-12-14 6 views
9

Come si può fare in modo che un cerchio animi il ridimensionamento mantenendo la posizione centrale del cerchio nello stesso punto. Questo codice fa muovere il centro del cerchio verso il basso e verso destra, sembra come il suo limite nell'angolo superiore e sinistro del fotogramma.Animare una scala su un cerchio per mantenere il centro Posizione

Questo livello è come si può vedere una maschera su un altro livello.

CGMutablePathRef path = CGPathCreateMutable(); 
CGPathAddEllipseInRect(path, nil, CGRectMake(400, 400, 1000, 1000)); 

CAShapeLayer *shapeLayer = [[CAShapeLayer alloc] init]; 
[shapeLayer setPath:path]; 
[shapeLayer setFrame:[glView frame]]; 
[shapeLayer setFillColor:[[UIColor blackColor] CGColor]]; 

[[glView layer] setMask:shapeLayer]; 

CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"transform.scale"]; 
animation.fromValue = [NSValue valueWithCATransform3D:CATransform3DMakeScale(0.0, 0.0, 0)]; 
animation.toValue = [NSValue valueWithCATransform3D:CATransform3DMakeScale(1.0, 1.0, 1.0)]; 
animation.repeatCount = 1; 
animation.removedOnCompletion = NO; 
animation.fillMode = kCAFillModeForwards; 
animation.duration = 3; 
[shapeLayer addAnimation:animation forKey:@"transform.scale"]; 

risposta

6

Uno strato viene scalato attorno al suo punto di ancoraggio , che di default è il centro del telaio del livello. Questo è spiegato in Core Animation Programming Guide - Specifying a Layer's Geometry.

Il tuo problema è che il centro del tuo cerchio non si trova nello stesso punto del punto di ancoraggio del tuo livello.

Quindi un modo per risolvere il problema è quello di spostare shapeLayer.anchorPoint ad essere lo stesso centro del cerchio, in questo modo:

CGRect circleFrame = CGRectMake(400, 400, 1000, 1000); 
CGPoint circleAnchor = CGPointMake(CGRectGetMidX(circleFrame)/CGRectGetMaxX(circleFrame), 
    CGRectGetMidY(circleFrame)/CGRectGetMaxY(circleFrame)); 
UIBezierPath *path = [UIBezierPath bezierPathWithOvalInRect:circleFrame]; 

CAShapeLayer *shapeLayer = [CAShapeLayer layer]; 
shapeLayer.path = path.CGPath; 
shapeLayer.anchorPoint = circleAnchor; 
shapeLayer.frame = glView.frame; 
shapeLayer.fillColor = [UIColor blackColor].CGColor; 

glView.layer.mask = shapeLayer; 
// and then your animation code 

Si desidera impostare il punto di ancoraggio prima di impostare il frame, perché l'impostazione del punto di ancoraggio dopo aver impostato la cornice cambierà la cornice.

+4

Ho provato con diversi punti di ancoraggio, ma ancora non ci sono cambiamenti. Si anima sempre nell'angolo sinistro. – Tariq

+0

Rob Mayoff è corretto. Nota come calcola il punto di ancoraggio nello spazio di coordinate unitario, dividendo il centro del fotogramma per il suo massimo in ogni dimensione. Quindi il punto di ancoraggio deve essere un valore compreso tra 0,0 e 1,0. – erikprice

+0

Voglio aggiungere, che nella maggior parte dei casi non si desidera modificare 'anchorPoint' come qui. Hai solo bisogno di impostare la cornice corretta. Ad esempio: vuoi creare una forma con il percorso e ridimensionarla. Prima crea una forma in rect che abbia origine 'x: 0, y: 0'. Quindi, dopo aver impostato questo percorso sul tuo 'CAShapeLayer', devi impaginare il tuo layer impostando il frame. Ad esempio, imposta il fotogramma come necessario, come in questa domanda 'CGRectMake (400, 400, 1000, 1000)'. Ora il tuo ridimensionamento sarà dal punto x, y = 400 + 1000/2 = 900 –

1

Questi sono ipotesi, non in grado di provare me al momentaneamente telaio di

  • Set shapeLayer a GLview di bounds, non frame come dovrebbe essere nel sistema di coordinate della vista a cui appartiene, non la superview.
  • Imposta shapeLayer's anchorPoint su 0.5,0.5 - questo è il valore predefinito per un CALayer (ovvero il centro del livello) ma da ciò che stai descrivendo non è il caso per il tuo livello forma - a meno che la cosa dei frame/bound non stia causando il problema.
Problemi correlati