动画过渡在横向方向上无法正常工作

时间:2011-01-16 19:39:41

标签: iphone objective-c animation uiview transition

我的应用仅支持横向右侧方向。

我正在尝试转换到视图控制器的视图,但是当它执行过渡动画(例如卷曲)时,视图旋转90度(因此,模拟器仍处于横向右方向,但是视图显示旋转90度)。转换完成后,它将旋转到正确的方向。我的代码如下。

- (IBAction)buttonTouched
{
    MyViewController *aViewController = [[MyViewController alloc] initWithNibName:NSStringFromClass([MyViewController class]) bundle:nil];

    [UIView transitionFromView:self.view 
                        toView:aViewController.view 
                      duration:2 
                       options:UIViewAnimationOptionTransitionCurlUp 
                    completion:NULL];
}

看起来好像视图没有获得“方向已更改”通知,因此它以纵向显示,然后在动画结束后更改为横向。我已经在IB中进行了设置,所以它都是在风景中布局的。

编辑:我也尝试将视图控制器添加到自己的IB文件并转换到该视图(想想可能在初始化和转换之间过于接近)但是同样的事情发生了。

1 个答案:

答案 0 :(得分:16)

嗯,主要原因是self.view(目前“知道”你在景观中)正在被一个没有这些信息的新视图所取代。因此,我们只想将aViewController.view作为self.view的子视图(假设aViewController是不透明的)。啊,你说,但后来我失去了transitionFromView的漂亮动画。好吧,试试这个好看:

[UIView transitionWithView:self.view
                  duration:2 
                   options:UIViewAnimationOptionTransitionCurlUp
                animations:^{
                    [self.view addSubview:aViewController.view];
                } 
                completion:NULL];

如果出于某种原因对你不起作用,另一种方法是“教”aViewController.view,它实际上是一个横向视图:

#define DEGREES_TO_RADIANS(__ANGLE__) ((__ANGLE__) / 180.0 * M_PI)
-(void)setNewViewToLandscape:(UIView*)viewObject {
     //assumes self.view is landscape and viewObject is portrait
     [viewObject setCenter:CGPointMake( self.view.frame.size.width/2,self.view.frame.size.height/2)];
     CGAffineTransform cgCTM = CGAffineTransformMakeRotation(DEGREES_TO_RADIANS(90));
     viewObject.transform = cgCTM;
     viewObject.bounds = CGRectMake(0, 0, self.view.bounds.size.width, self.view.bounds.size.height);
}

 MyViewController *aViewController = [[MyViewController alloc] initWithNibName:NSStringFromClass([MyViewController class]) bundle:nil];
[self setNewViewToLandscape:aViewController.view];

[UIView transitionFromView:self.view 
                    toView:aViewController.view 
                  duration:2 
                   options:UIViewAnimationOptionTransitionCurlUp 
                completion:NULL];

另一个小问题是你的aViewController正在泄漏,所以你应该把它作为父viewController的保留属性。

相关问题