2017-08-27 83 views
0

我在CALayer中有一個圖像(使用CALayers內容屬性)。 CALayer具有可用於縮放和旋轉的transform屬性。當CALayer仍然存在時,我可以毫無困難地使用這種轉換。但是,當我嘗試拖動CALayer(使用mouseDragged:(NSEvent *)theEvent),然後它全部崩潰(當我拖動時圖像變平坦)。如何拖動旋轉和縮放的CALayer?

-(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]; 
    ... 
} 

在層

-(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; 
} 

的問題是,我使用的CALayer的幀動態地改變的CALayer的位置,因爲我拖動,但是當旋轉角度不爲零,則該幀是不再平行於x和y軸。解決這個問題的最好方法是什麼?

+0

顯示mousedragged中的代碼。 – GeneCode

回答

0

一種方法是爲每個增量移動重新生成變換。

-(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); 
} 

我不知道這是否是最有效的方法,但它確實有效。