我的应用仅支持横向右侧方向。
我正在尝试转换到视图控制器的视图,但是当它执行过渡动画(例如卷曲)时,视图旋转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文件并转换到该视图(想想可能在初始化和转换之间过于接近)但是同样的事情发生了。
答案 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的保留属性。