2011-06-06 66 views
1

我在旋轉同一圖像後試圖移動時出現問題。當我在旋轉圖像之前嘗試移動圖像時,我的代碼工作正常。旋轉圖像後,當我嘗試移動旋轉後的圖像時,圖像未沿着我拖動的方向移動。誰能幫我。 在此先感謝。我正在使用的代碼旋轉後移動圖像表現不正確

#import "myDraggableImage.h" 
#import <CoreGraphics/CoreGraphics.h> 
#import <QuartzCore/CoreAnimation.h> 



@implementation myDraggableImage 



- (void) touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event 
{ 




    [[self superview] bringSubviewToFront:self]; 
    CGPoint pt = [[touches anyObject] locationInView:self]; 
    startLocation = pt; 

    UIRotationGestureRecognizer *rotationRecognizer = [[UIRotationGestureRecognizer alloc] initWithTarget:self action:@selector(rotate:)]; 
    [rotationRecognizer setDelegate:self]; 
    [self addGestureRecognizer:rotationRecognizer]; 
    [rotationRecognizer release]; 

    UIPinchGestureRecognizer *pinchRecognizer = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(scale:)]; 
    [pinchRecognizer setDelegate:self]; 
    [self addGestureRecognizer:pinchRecognizer]; 
    [pinchRecognizer release]; 

    UIPanGestureRecognizer *panRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(move:)]; 
    [panRecognizer setMinimumNumberOfTouches:1]; 
    [panRecognizer setMaximumNumberOfTouches:1]; 
    [panRecognizer setDelegate:self]; 
    [self addGestureRecognizer:panRecognizer]; 
    [panRecognizer release]; 

    CGRect frame = [self frame]; 
    printf("\n the x co ordinte of the frame is :%f",frame.origin.x); 
    printf("\n the y co ordinte of the frame is :%f",frame.origin.y); 
    printf("\n the widht co ordinte of the frame is :%f",frame.size.width); 
    printf("\n the height co ordinte of the frame is :%f",frame.size.height); 


} 


-(void)rotate:(id)sender 
{ 

    if([(UIRotationGestureRecognizer*)sender state] == UIGestureRecognizerStateEnded) 
    { 

     lastRotation = 0.0; 
     return; 
    } 

    CGFloat rotation = 0.0 - (lastRotation - [(UIRotationGestureRecognizer*)sender rotation]); 

    CGAffineTransform currentTransform = [(UIPinchGestureRecognizer*)sender view].transform; 
    CGAffineTransform newTransform = CGAffineTransformRotate(currentTransform,rotation); 

    [[(UIRotationGestureRecognizer*)sender view] setTransform:newTransform]; 

    lastRotation = [(UIRotationGestureRecognizer*)sender rotation]; 
    CGRect frame = [self frame]; 



} 


-(void)scale:(id)sender 
{ 
    if([(UIPinchGestureRecognizer*)sender state] == UIGestureRecognizerStateEnded) 
    { 

     lastScale = 1.0; 
     return; 
    } 

    CGFloat scale = 1.0 - (lastScale - [(UIPinchGestureRecognizer*)sender scale]); 

    CGAffineTransform currentTransform = [(UIPinchGestureRecognizer*)sender view].transform; 
    CGAffineTransform newTransform = CGAffineTransformScale(currentTransform, scale, scale); 

    [[(UIPinchGestureRecognizer*)sender view] setTransform:newTransform]; 

    lastScale = [(UIPinchGestureRecognizer*)sender scale]; 
} 

-(void)move:(id)sender 

{ 

    [[[(UITapGestureRecognizer*)sender view] layer] removeAllAnimations]; 

    CGAffineTransform currentTransform = [(UIPinchGestureRecognizer*)sender view].transform; 
    CGPoint translatedPoint = [(UIPanGestureRecognizer*)sender translationInView:self]; 
    if([(UIPanGestureRecognizer*)sender state] == UIGestureRecognizerStateBegan) 

{ 
     firstX = [[sender view] center].x; 
     firstY = [[sender view] center].y; 
    } 

    translatedPoint = CGPointMake(firstX+translatedPoint.x, firstY+translatedPoint.y); 

    [[sender view] setCenter:translatedPoint]; 

    if([(UIPanGestureRecognizer*)sender state] == UIGestureRecognizerStateEnded) 
    { 

     CGFloat finalX = translatedPoint.x ;//+ (.15*[(UIPanGestureRecognizer*)sender velocityInView:self].x); 
     CGFloat finalY = translatedPoint.y ;//+ (.15*[(UIPanGestureRecognizer*)sender velocityInView:self].y); 


     if(finalX < 0) 
     { 

      finalX = 0; 
     } 

     else if(finalX > 460) 
     { 

      finalX = 440; 
     } 

     if(finalY < 40) 
     { 

      finalY = 40; 

     } 

     else if(finalY > 300) 
     { 
      finalY = 300; 
     } 


     [UIView beginAnimations:nil context:NULL]; 
     [UIView setAnimationDuration:.35]; 
     [UIView setAnimationCurve:UIViewAnimationCurveEaseIn]; 
     [[sender view] setCenter:CGPointMake(finalX, finalY)]; 
     [UIView commitAnimations]; 
    } 
} 




- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer 
{ 

    return ![gestureRecognizer isKindOfClass:[UIPanGestureRecognizer class]]; 
} 


-(void)dealloc 
{ 

    [super dealloc]; 
} 

@end 

回答

1

touchesBegan:withEvent:是一個錯誤的地方設置你的手勢,因爲它每次都會增加一個新的手勢用戶。至於翻譯功能,很難指責錯誤。這裏的一些過程似乎過頭了。雖然我還沒有實現動畫部分(爲了讓它進入,對吧?),看看this sample project。它可以幫助你開始正確的方向。

+0

非常感謝你,這對我來說工作非常好。是否有可能在框架中移動對象意味着,我只想在有限的框架中移動對象(例如:frame = CGRectMake(100,100,200,200)。srry像這樣問) – praveena 2011-06-06 07:57:47

+0

框架不可靠,中心不干你可以嘗試使用'(self.transform.tx + self.center.x,self.transform.ty + self.center.y)'將它保存在一個特定的框架中。 – 2011-06-06 08:31:11