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