iPhone:如何向左或向右旋转UIImageview?

时间:2010-02-04 11:01:30

标签: objective-c iphone-sdk-3.0 core-animation uiimageview

我想以下列方式旋转UIImageView:如果我按住图像视图并将手指向左移动,则图像视图应向右旋转(反之亦然。)

以下是链接Balance

2 个答案:

答案 0 :(得分:1)

去年,我摆弄了这个。事实证明它比我想象的要复杂得多。 IIRC,这个小班做了你想要的。它是一个UIButtonSubclass,它显示图像并响应点击和拖动。请注意,这只是暂存代码。它不进行任何内存管理,清理等。

#import <UIKit/UIKit.h>
#import "BackgroundImageButton.h"
#import "WiggleImageView.h"

@interface StickerButton : UIButton {
    //ivars used to control selection animaiton
    CGAffineTransform startTransform;
    BOOL currentlyAnimating;
    BOOL shouldAnimate; 
    //ivars to handle touches and control events
    BOOL wasDrag;
    BOOL wasTouchDown;
  WiggleImageView * imgView;
}
//ivars used to control selection animaiton
@property CGAffineTransform startTransform;
@property(nonatomic, retain)  WiggleImageView *imgView;
@property BOOL currentlyAnimating;
@property BOOL shouldAnimate;
//ivars to handle touches and control events
@property BOOL wasDrag;
@property BOOL wasTouchDown;


#pragma mark Initialization
-(id) initWithImage:(UIImage *)anImage atCenterPoint:(CGPoint) centerPoint;

#pragma mark Selection Animation Methods
-(void) animateSelection;
-(void) animationDidStop:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context;

#pragma mark Self Touch Methods  //not as dirty as it sounds.
-(void) touchDragSelf:(id)sender withEvent:(UIEvent *) theEvent;
-(void) touchDownSelf:(id)sender withEvent:(UIEvent *) theEvent;
-(void) touchUpSelf:(id)sender withEvent:(UIEvent *) theEvent;

#pragma mark Graphic Edit Methods
-(void) rotateRight;
-(void) rotateLeft;
-(void) scaleUp;
-(void) scaleDown;
-(void) select;
-(void) deselect;
-(void) translateMoveByX:(CGFloat) dx andY:(CGFloat) dy; //used by self to account for translated coordinates
-(void) frameMoveByX:(CGFloat) dx andY:(CGFloat) dy; //used by external to move frame in superview    
@end

#import "StickerButton.h"

@implementation StickerButton
@synthesize startTransform;
@synthesize currentlyAnimating;
@synthesize shouldAnimate;
@synthesize wasDrag;
@synthesize wasTouchDown;
@synthesize imgView;


#pragma mark Initialization
- (id)initWithFrame:(CGRect)frame {
    if (self = [super initWithFrame:frame]) {
        startTransform=self.transform;
        currentlyAnimating=NO;
        shouldAnimate=NO;
        wasDrag=NO;
        wasTouchDown=NO;
        self.adjustsImageWhenDisabled=NO;
        self.adjustsImageWhenHighlighted=NO;
        self.showsTouchWhenHighlighted=NO;
        [self addTarget:self action:@selector(touchDownSelf:withEvent:) forControlEvents:UIControlEventTouchDown];
        [self addTarget:self action:@selector(touchDragSelf:withEvent:) forControlEvents:UIControlEventTouchDragInside];
        [self addTarget:self action:@selector(touchUpSelf:withEvent:) forControlEvents:UIControlEventTouchUpInside];
    }
    return self;
}

-(id) initWithImage:(UIImage *)anImage atCenterPoint:(CGPoint) centerPoint{
    CGFloat xOrigin,yOrigin;
    xOrigin=centerPoint.x-(anImage.size.width/2);
    yOrigin=centerPoint.y-(anImage.size.height/2);
    [self initWithFrame:CGRectMake(xOrigin, yOrigin, anImage.size.width, anImage.size.height)];
    WiggleImageView *w=[[WiggleImageView alloc] initWithFrame:self.bounds];
    imgView=w;
    imgView.image=anImage;
    [self addSubview:imgView];
    return self;
}//------------------------------------initWithImage:atCenterPoint:------------------------------------



#pragma mark Selection Animation Methods
-(void) animateSelectedThrob{
    if (!currentlyAnimating) {
        NSLog(@"animating");
        currentlyAnimating=YES;
        //startTransform=self.transform; //this has to be saved to prevent some kind of rounding error from gradually rotating the view
        [UIView beginAnimations:@"selectionAnimation" context:nil];
        [UIView setAnimationDelegate:self];
        [UIView setAnimationDuration:0.1];
        [UIView setAnimationRepeatCount:1];
        [UIView setAnimationRepeatAutoreverses:YES];
        self.transform=CGAffineTransformScale(self.transform, 1.1, 1.1);
        [UIView commitAnimations];
    } 
}//-------------------------------------(void) animateSelectedThrob------------------------------------


-(void) animateSelection{
    if (!currentlyAnimating) {
        //NSLog(@"animating");
        currentlyAnimating=YES;
        startTransform=self.transform; //this has to be saved to prevent some kind of rounding error from gradually rotating the view
        [UIView beginAnimations:@"selectionAnimation" context:nil];
        [UIView setAnimationDelegate:self];
        [UIView setAnimationDuration:0.1];
        [UIView setAnimationRepeatCount:2];
        [UIView setAnimationRepeatAutoreverses:YES];
        self.transform=CGAffineTransformRotate(self.transform, (2 * M_PI / 180) );
        [UIView commitAnimations];
    } 

}//-------------------------------------(void) animateSelection------------------------------------

-(void) animationDidStop:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context{
    self.transform=startTransform;
    currentlyAnimating=NO;
    if (shouldAnimate) {

        [self animateSelection];
    }   
}//------------------------------------animationDidStop:finished:context:------------------------------------

#pragma mark Self Touch Methods

-(void) touchDownSelf:(id)sender withEvent:(UIEvent *) theEvent{
    NSLog(@"touchDownSelf");
    wasTouchDown=YES;
    shouldAnimate=NO;
}//------------------------------------touchDownSelf:withEvent:------------------------------------

-(void) touchDragSelf:(id)sender withEvent:(UIEvent *) theEvent{
    NSLog(@"touchDragSelf");
    if ([[theEvent touchesForView:self] count]==1) {
        UITouch *t=[[theEvent touchesForView:self] anyObject];
        CGPoint l,p;
        l=[t locationInView:self];
        p=[t previousLocationInView:self];
        [self translateMoveByX:(l.x-p.x) andY:(l.y-p.y)];
        wasDrag=YES;        
    }

}//------------------------------------touchDragSelf:withEvent:------------------------------------

-(void) touchUpSelf:(id)sender withEvent:(UIEvent *) theEvent{
    NSLog(@"touchUpSelf");
//  if (!wasDrag && wasTouchDown) {
//      [self select];
//  }
    if (wasTouchDown) {
        [self select];
    }
    wasDrag=NO;
    wasTouchDown=NO;
}//------------------------------------touchUpSelf:withEvent:------------------------------------

#pragma mark Graphic Edit Methods 
-(void) rotateRight{
    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationDuration:0.1];
    [UIView setAnimationBeginsFromCurrentState:YES];
    self.transform=CGAffineTransformRotate(self.transform, (M_PI / 180) );
    [UIView commitAnimations];  
}//-------------------------------------(void) rotateRight------------------------------------

-(void) rotateLeft{
    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationDuration:0.1];
    [UIView setAnimationBeginsFromCurrentState:YES];
    self.transform=CGAffineTransformRotate(self.transform, (-1*M_PI / 180) );
    [UIView commitAnimations];
}//-------------------------------------(void) rotateLeft------------------------------------

-(void) scaleUp{
    //todo add variable to track total scale so it doesn't get to big and cause problems
    shouldAnimate=NO;
    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationDuration:0.1];
    [UIView setAnimationBeginsFromCurrentState:YES];
    self.transform=CGAffineTransformScale(self.transform, 1.1, 1.1);
    [UIView commitAnimations];
    startTransform=self.transform;
}//-------------------------------------(void) scaleUp------------------------------------

-(void) scaleDown{
    //todo add variable to track total scale so it doesn't get to small and cause problems
    shouldAnimate=NO;
    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationDuration:0.1];
    [UIView setAnimationBeginsFromCurrentState:YES];
    self.transform=CGAffineTransformScale(self.transform, 0.9, 0.9);
    [UIView commitAnimations];
    startTransform=self.transform;
}//-------------------------------------(void) scaleDown------------------------------------

-(void) select{ 
    [self animateSelectedThrob];
    imgView.shouldWiggle=YES;
}
//-------------------------------------(void) select------------------------------------

-(void) deselect{
    imgView.shouldWiggle=NO;
}

-(void) translateMoveByX:(CGFloat) dx andY:(CGFloat) dy{ //necessary for all points that orignate within the transformed view
    NSLog(@"dx=%f,dy=%f",dx,dy);
    shouldAnimate=NO;
    self.transform=CGAffineTransformTranslate(self.transform, dx,dy);
    startTransform=self.transform;
}//------------------------------------translateMoveByX:andY:------------------------------------

-(void) frameMoveByX:(CGFloat) dx andY:(CGFloat) dy{ //necessary for all points that originate outside the transformed view

    self.frame=CGRectMake(self.frame.origin.x+dx, self.frame.origin.y+dy, self.frame.size.width, self.frame.size.height);
}//------------------------------------frameMoveByX:andY:------------------------------------
- (void)drawRect:(CGRect)rect {
    // Drawing code
}

- (void)dealloc {
    [super dealloc];
}

@end

答案 1 :(得分:0)

您可以在控制器中使用ivar来跟踪拖动的开始。当您收到“降落”事件时,请保存起点。当您“触摸移动”事件时,计算从当前点到保存点的距离。两者之间的欧几里德距离可以给你旋转(标志告诉你旋转的方向)。适当缩放旋转(即,可能是视图宽度的一半相当于180度),并设置图像变换的旋转。