旋转后移动图像的行为不正确

时间:2011-06-06 06:33:31

标签: objective-c cocoa-touch ios uiimage

当我在旋转相同图像后尝试移动时,我遇到了问题。当我试图在旋转图像之前移动图像时,我的代码工作正常。旋转图像后,当我尝试移动旋转的图像时,图像不会沿着我拖动的方向移动。谁能帮我。 提前致谢。我正在使用代码

#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 个答案:

答案 0 :(得分:1)

touchesBegan:withEvent:是设置手势的错误位置,因为每次用户都会添加新手势。至于翻译功能,很难指出什么是错的。这里的一些过程似乎过头了。虽然我没有实现动画部分(将其带入,对吗?),请查看this sample project。它可以帮助您开始朝着正确的方向发展。