UIView:旋转+移动

Posted

技术标签:

【中文标题】UIView:旋转+移动【英文标题】:UIView: rotation + movement 【发布时间】:2011-05-12 05:13:30 【问题描述】:

我正在尝试移动和旋转 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/

【问题讨论】:

你想同时移动和旋转吗???还是单独? 同时。在 NStimer 调用的方法中,每个刻度都会更新运动 为什么不能使用Core Animation?它使这变得简单。 我需要根据物理模型对图像进行动画处理。在我的例子中,使用力向量、重力等来计算每个刻度的 x 和 y 远比生成贝塞尔曲线和时间框架以适应模型要容易得多。 【参考方案1】:

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

当您对视图应用旋转时,它会围绕 (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 不为零,则使用变换进行旋转,并通过设置视图的中心来完成平移。

【讨论】:

【参考方案2】:

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

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

希望这会奏效

【讨论】:

感谢您的提示,但不幸的是它不起作用:(我得到了完全相同的结果【参考方案3】:

你好朋友请使用这个步骤。在您的 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;
 

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

【讨论】:

嗨,感谢您的代码,但这是我已经在做的事情。让旋转已经生效,我的问题是让它与动画一起工作。【参考方案4】:

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

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:旋转+移动的主要内容,如果未能解决你的问题,请参考以下文章

旋转放置和移动视图 (UIView)

同时旋转和移动 UIView 并设置其中心点

调整旋转 UIView 的子视图大小

旋转的 UIView 变得无响应

Swift + Autolayout:旋转 UILabel,保持在 UIView 旁边

使用 CABasicAnimation 旋转的 UIButton 不会移动初始触摸坐标