【问题标题】:how to move a view controller along a circle in iOS如何在 iOS 中沿圆圈移动视图控制器
【发布时间】:2012-11-15 12:38:45
【问题描述】:

我是新的 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

【问题讨论】:

  • 我可以将锚点从 btm 左侧缓慢移动到 btm 右侧吗?嗯

标签: ios view controller geometry


【解决方案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

            }];
     }
}

【讨论】:

  • sr!但它仍然对我不起作用,我想我会使用计时器。这是我选择的最后一个案例。无论如何感谢您回答我的问题:D
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多