2017-08-27 12 views
0

私はCALayerに画像を持っています(CALayersのcontentsプロパティを使用しています)。 CALayerには、スケールと回転に使用できる変換プロパティがあります。 CALayerが静止しているときに、私は難なくその変換を使うことができます。回転して拡大縮小したCALayerをドラッグするにはどうすればいいですか?

しかし、CALayer(mouseDragged:(NSEvent *)theEventを使用して)をドラッグしようとすると、すべてが離れてしまいます(イメージがドラッグされるとフラットになります)。

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

の問題IドラッグとしてIが動的のCALayerの位置を変更するのCALayerのフレームを使用することであるが、回転角度がゼロでない場合、その後のフレームでありますもはやx軸とy軸に平行ではありません。この問題を解決する最良の方法は何ですか?

+0

mousedraggedでコードを表示します。 – GeneCode

答えて

0

これを行う1つの方法は、インクリメンタルムーブメントごとにトランスフォームを再生成することです。

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

これが最も効率的な方法であるかどうかわかりませんが、間違いなく動作します。

関連する問題