如何在iOS中沿着圆圈移动视图控制器

时间:2012-11-15 12:38:45

标签: ios view controller geometry

我是新的iOS开发人员。我想在2个视图控制器之间创建过渡动画

我该怎么办?

这是我的代码:

int newScreenDegrees = _screenDegrees - 90;
[UIView transitionWithView:self.containerView
                  duration:0.65f
                   options:UIViewAnimationOptionCurveEaseInOut
                animations:^{
                    for(int i = 0; i < [self.screens count]; i++)
                    {
                        UIViewController *_screen = [self.screens objectAtIndex:i];

                        int curDeg = newScreenDegrees + i * SPACE_PER_SCREEN;
                        float curRad = convertDegreesToRadians(curDeg);

                        float newX = COORDINATES_CENTER_OF_CIRCLE_X + (CIRCLE_RADIUS * cos(curRad)) - (_screen.view.frame.size.width / 2) - 280;
                        float newY = COORDINATES_CENTER_OF_CIRCLE_Y + (CIRCLE_RADIUS * sin(curRad)) - (_screen.view.frame.size.height / 2);
                        // transform view
                        _screen.view.transform = transformMakeRotateTranslate(convertDegreesToRadians(curDeg + 90), newX, newY);

                    }
                }
                completion:^(BOOL finished){
                    _screenDegrees = newScreenDegrees;

                    // TODO: init content of current view and clear other views

                }];
_screenDegrees = newScreenDegrees;

问题是:视图沿着一条直线而不是圆圈移动。

由于

这里是图片:http://i.stack.imgur.com/xVQb3.jpg

1 个答案:

答案 0 :(得分:1)

您需要有多个循环并单独移动视图。打破你移动的圆圈到足够小的部分,看起来就像是以圆形方式移动视图。

for(int i = 0; i < [self.screens count]; i++)
{                
    UIViewController *_screen = [self.screens objectAtIndex:i];
    int newScreenDegrees = i*90;
    int numSegs=30; //break into little chunks
    int segSize=3;//3 degrees
    for (int m=1;m<=numSegs;m++)
    {
         [UIView transitionWithView:self.containerView
              duration:0.65f
               options:UIViewAnimationOptionCurveEaseInOut
            animations:^{

                    int curDeg = newScreenDegrees+m*segSize;
                    float curRad = convertDegreesToRadians(curDeg);

                    float newX = COORDINATES_CENTER_OF_CIRCLE_X + (CIRCLE_RADIUS * cos(curRad)) - (_screen.view.frame.size.width / 2) - 280;
                    float newY = COORDINATES_CENTER_OF_CIRCLE_Y + (CIRCLE_RADIUS * sin(curRad)) - (_screen.view.frame.size.height / 2);
                    _screen.view.transform = transformMakeRotateTranslate(convertDegreesToRadians(curDeg), newX, newY);


            }
            completion:^(BOOL finished){
                _screenDegrees = newScreenDegrees;

                // TODO: init content of current view and clear other views

            }];
     }
}