UIView:旋转+运动

时间:2011-05-12 05:13:30

标签: iphone uiview

我正在尝试移动和旋转UIImageView。我没有使用Core Animation,也没有使用它。

顺便说一下,动画的核心部分如下:

CGRect r = self.frame;
r.origin.y -= self.gravity + spring;
r.origin.x -= 1;
self.rotation -= 0.015;
self.transform = CGAffineTransformMakeRotation(rotation);
self.frame = r;

它几乎可以工作。我确实移动了它或者它旋转,但当我尝试移动旋转它时,它会完全扭曲变形。

我试图移动然后旋转而反之亦然。我也尝试了内容模式的各种值,没有运气。有什么帮助吗?

修改

有用的教程:http://www.permadi.com/blog/2009/05/iphone-sdk-bouncing-and-rotating-ball-example/

4 个答案:

答案 0 :(得分:2)

如果没有您所看到的图片,很难确定会发生什么,但以下内容可能会有用:

将旋转应用于视图时,它会将其旋转(0,0),因此您需要确保设置视图的边界,以便(0,0)是您想要旋转中心的位置。假设您正在旋转的图像是100x200图像,并且您想围绕图像的中心旋转,那么您需要说self.bounds = CGMakeRect(-50, -100, 100, 200);如果您不这样做,它将围绕它的左上角旋转进行排序螺旋状。

哦,使用self.center设置视图的位置似乎比使用self.frame时更加可预测。

这是一些可能使其更容易理解的演示代码。在这种情况下,执行动画的代码是视图控制器,但您应该明白这一点:

#define USE_SELF_CENTER 0

- (void)viewDidLoad {
    [super viewDidLoad];
    self.rotation = 0.0f;
    self.translation = CGPointMake(self.view.bounds.size.width/2.0f, 0.0);

    ObjectView* ov = [[ObjectView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 100.0f, 100.0f)];
#if USE_SELF_CENTER==1
    ov.center = self.translation;
#else
    ov.transform = CGAffineTransformMakeTranslation(self.translation.x, self.translation.y);
#endif
    // adjust bounds for center of rotation
    ov.bounds = CGRectMake(-50.0f, -50.0f, 100.0f, 100.0f);
    [self.view addSubview:ov];
    self.objectView = ov;
    [ov release];

    NSTimer *aTimer = [NSTimer timerWithTimeInterval:0.5 target:self selector:@selector(nextFrame)
                                            userInfo:nil repeats:YES];
    self.timer = aTimer;
    [aTimer  release];
    [[NSRunLoop mainRunLoop] addTimer:self.timer forMode:NSRunLoopCommonModes];
}



- (void)nextFrame
{
    NSLog(@"nextFrame");
    self.rotation += (5.0 / 180.0f * M_PI);
    self.translation = CGPointMake(self.translation.x, self.translation.y + 2.0);

#if USE_SELF_CENTER==1
    CGAffineTransform t = CGAffineTransformMakeRotation(self.rotation);
    self.objectView.center = self.translation;
    self.objectView.transform = t;
#else
    CGAffineTransform rot = CGAffineTransformMakeRotation(self.rotation);
    CGAffineTransform txy = CGAffineTransformMakeTranslation(self.translation.x, self.translation.y);
    CGAffineTransform t = CGAffineTransformConcat(rot, txy);
    self.objectView.transform = t;
#endif
}

该代码演示了两种实现您想要的方法。如果USE_SELF_CENTER为零,则所有动画都通过变换完成。如果USE_SELF_CENTER非零,则使用变换进行旋转,并通过设置视图的中心来完成平移。

答案 1 :(得分:1)

使用这样的东西,这个想法结合了转换,即

CGAffineTransform transforms = CGAffineTransformConcat(CGAffineTransformMakeTranslation(-1, -(self.gravity + spring)),CGAffineTransformMakeRotation(rotation));
self.transform = transforms;

希望这会奏效

答案 2 :(得分:0)

Hello Friend请使用此步骤。在您的XIB上,使用UIImageView并设置Image并设置其IBOutlet。

在.h文件中

 int theta;
 NSTimer *tmrAnimation;
 IBOutlet UIImageView *imgViewLoader;

在.m文件中

 - (void)viewDidLoad 
 {
     [super viewDidLoad];    
     theta = 0;
     tmrAnimation = [NSTimer scheduledTimerWithTimeInterval:0.01 target:self selector:@selector(animationImageViewLoader) userInfo:nil repeats:YES];
 }

在.m文件中添加此功能。

 -(void)animationImageViewLoader
 {
     CGFloat angle = theta * (PI / 100);
     CGAffineTransform transform = CGAffineTransformMakeRotation(angle);
     theta = (theta + 1) % 200;
     imgViewLoader.transform = transform;
 }

此代码仅对图像旋转有帮助....

答案 3 :(得分:0)

以下代码帮助我实现了翻译(垂直移动)和旋转。

CGAffineTransform transform = CGAffineTransformMakeTranslation(0, -200); transform = CGAffineTransformRotate(transform, M_PI);

[UIView transitionWithView:self
                  duration:0.5
                   options:UIViewAnimationOptionAllowAnimatedContent<br>
                animations:^{
                    [view setTransform:transform];
                }
                    completion:^(BOOL finished){
                }];

[UIView transitionWithView:self duration:0.5 options:UIViewAnimationOptionAllowAnimatedContent<br> animations:^{ [view setTransform:transform]; } completion:^(BOOL finished){ }]; 希望这会帮助别人......