2017-08-27 2 views
0

Ich habe ein Bild in einem CALayer (mit der CALayers contents -Eigenschaft). Ein CALayer verfügt über eine Transformationseigenschaft, die zum Skalieren und Drehen verwendet werden kann. Ich kann diese Transformation ohne Schwierigkeit verwenden, wenn der CALayer still ist.Wie wird ein CALayer gezogen und gedreht?

Aber wenn ich versuche, den CALayer zu ziehen (mit mouseDragged: (NSEvent *) theEvent), dann alles fällt auseinander (das Bild wird flacher, wenn ich ziehe).

-(void)mouseDragged:(NSEvent *)theEvent { 
    CGPoint loc = [self convertPoint:theEvent.locationInWindow fromView:nil]; 
    CGPoint deltaLoc = ccpSub(loc, downLoc); // subtract two points 
    CGPoint newPos = ccpAdd(startPos, deltaLoc); // adds two points 
    [layer changePosition:newPos]; 
    ... 
} 

In der Schicht

-(void)changePosition:(CGPoint)newPos { 
    //prevent unintended animation actions 
    self.actions = @{@"position": [NSNull null]}; 

    CGSize size = self.frame.size; 
    CGRect newRect = CGRectMake(newPos.x, newPos.y, size.width, size.height); 
    self.frame = newRect; 
} 

Das Problem ist, dass ich CALayer-Rahmen, um dynamisch zu ändern, um die Position des CALayer verwenden, wie I ziehen, aber wenn der Drehwinkel nicht Null ist, dann ist der Rahmen nicht mehr parallel zur x- und y-Achse. Was ist der beste Weg, um dieses Problem zu beheben?

+0

zeigen Sie den Code in mousedragged. – GeneCode

Antwort

0

Eine Möglichkeit besteht darin, Transformationen für jede inkrementelle Bewegung zu regenerieren.

-(void)mouseDragged:(CGPoint)deltaLoc start:(CGPoint)startPos { 
    CGPoint newPos = ccpAdd(startPos, deltaLoc); 
    [self changePosition:newPos]; 
} 

-(void)changePosition:(CGPoint)newPos { 
    //prevent unintended animation actions 
    self.actions = @{@"position": [NSNull null]}; 

    double angle = [[self valueForKeyPath: @"transform.rotation"] doubleValue]; 
    double scaleX = [[self valueForKeyPath: @"transform.scale.x"] doubleValue]; 
    double scaleY = [[self valueForKeyPath: @"transform.scale.y"] doubleValue]; 

    self.transform = CATransform3DIdentity; 

    CGSize size = self.frame.size; 
    CGRect newRect = CGRectMake(newPos.x, newPos.y, size.width, size.height); 
    self.frame = newRect; 

    [self applyTransformRotation:angle scale:ccp(scaleX, scaleY)]; 
} 

-(void)applyTransformRotation:(double)angle scale:(CGPoint)scale { 
    self.transform = CATransform3DMakeRotation(angle, 0, 0, 1); 
    self.transform = CATransform3DScale(self.transform, scale.x, scale.y, 1); 
} 

Ich weiß nicht, ob dies der effizienteste Weg ist, es zu tun, aber es funktioniert definitiv.

Verwandte Themen