旋转UIImage指向由计算出的角度定义的正确方向

时间:2014-03-14 20:04:46

标签: objective-c animation uiview rotation uiimage

我在UIImage中有一个卡通人物,作为子视图添加到我的主UIView中。我将图像的中心坐标与随机生成的CGPoint一起使用,并使用trig来找到角色需要旋转以指向正确方向的角度。我在一个块中使用UIView动画。第一部分执行旋转,然后第一部分完成移动到新位置,然后内部块的完成再次调用动画循环。这个旋转/移动序列一直持续到用户停止 - 基本上,角色在屏幕上不断移动。

它似乎适用于第一个旋转/移动序列,但随后它开始面对错误的方式。我已经看过这些角度了,它们似乎正在计算正确(我得到逆向逆时针方向),所以我想知道是否有一些关于如何转换到新位置及其相关的新坐标有效吗?我尝试使用块,没有块,更改为图层和使用CGAffine函数,但这应该非常简单,并且很容易使用UIView动画。

简而言之,我很难过,需要一些正确方向的帮助或指示。我可能遗漏了一些显而易见的东西,请原谅我,如果是这样,但我已经在这里待了两个星期了,所以我有点不能看见树林里的树林' !!

相关代码:我添加了字符(theBug),这是一个自定义类(它是UIImageView的子类):

if (!doesContain){
    NSLog(@"adding bug for first time");
    //doesContain=YES; //set this at the end of the method after first call to animateLoop
    [self.theBug setTranslatesAutoresizingMaskIntoConstraints:YES];
    self.theBug=[[BugView alloc] initWithImage:[UIImage imageNamed:@"newbug1.png"]];
    self.theBug.tag=3; //to identiry this in clearBoard
    self.theBug.frame=CGRectMake(100, 100, 30, 30);
    [self.gameView addSubview:self.theBug];
    self.gameView.autoresizingMask=UIViewAutoresizingNone;
    self.theBug.autoresizingMask=UIViewAutoresizingNone;
}

我做动画:

//Random x&y points
CGFloat x=(CGFloat) (arc4random() % (int) self.gameView.frame.size.width);
CGFloat y = (CGFloat) (arc4random() % (int) self.gameView.frame.size.height);

//create the random point to move the bug to
CGPoint rotateToLocation= CGPointMake(x, y);

//Store the bug's current location - This might not be the best way to represent this after rotation
CGPoint bugLocation = CGPointMake(self.theBug.frame.origin.x, self.theBug.frame.origin.y);

//Calculate the angle to rotate
float angleToRotate = atan2f(self.theBug.transform.tx-rotateToLocation.x,   self.theBug.transform.ty - rotateToLocation.y);
if (self.theBug.transform.tx <x)
    angleToRotate*=-1;


double delayInSeconds = 1;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC));
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
[UIView animateWithDuration:4
                      delay:0
                    options:UIViewAnimationOptionCurveLinear 
                 animations:^{
                     self.theBug.transform = CGAffineTransformRotate(self.theBug.transform, angleToRotate);
                 } completion:^(BOOL finished) {
                     [UIView animateWithDuration:4
                                           delay:0.0
                                         options:UIViewAnimationOptionCurveLinear
                                      animations:^{
                                          self.theBug.center = rotateToLocation;
                                      } completion:^(BOOL finished) {
                                          [self animationLoop:@"bug" finished:[NSNumber numberWithInt:0] context:nil];
                                      }];

    }];

});

1 个答案:

答案 0 :(得分:0)

答案很简单!我的计算是正确的,问题是我的起始图像定向不正确。我将原始图像旋转到正确的位置,一切正常。