好吧,这看起来应该相对简单,但我一直在谷歌搜索大部分时间,似乎无法找到我需要的东西。
我有一个视图控制器,它有几个不同的部分:背景视图,标题视图和几个按钮。现在,我希望标题和按钮正确自动旋转(当我从shouldAutorotateToInterfaceOrientation返回YES时,它们会这样做),但在任何情况下都不应该旋转背景视图。有没有正确的方法来做到这一点?
答案 0 :(得分:5)
如果您不希望临时旋转背景视图,然后将背景更改为具有正确的方向,则需要关闭视图的自动旋转。没有两种方式。
您需要自己处理按钮的旋转。您可以制作一个漂亮的布局或者将它们放在例如Scrollview上,然后调整它。
无论哪种方式,你都需要添加一个观察者来自己旋转它,
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didRotate:)
name:UIDeviceOrientationDidChangeNotification object:nil];
在didRotate中你可以调整大小,如果你愿意,可以使用漂亮的动画过渡。
- (void) didRotate:(NSNotification *)notification {
int ori=1;
UIDeviceOrientation currOri = [[UIDevice currentDevice] orientation];
if ((currOri == UIDeviceOrientationLandscapeLeft) || (currOri == UIDeviceOrientationLandscapeRight)) ori=0;
}
希望对你进行排序。如果导航栏或状态栏导致View隐藏在顶部栏下方,则有一些方法可以解决这个问题。
答案 1 :(得分:2)
还有另外一项我想过的工作......
您可以使用:
bgView.transform = CGAffineTransformMakeRotate(angle);
您应该根据方向计算角度(可以是M_PI / 2,M_PI或3 * M_PI / 2)......
您可以在- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
中使用此功能,并使用动画包装它,该动画将为屏幕方向动画设置精确的持续时间:
- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
// Decide what will be the angle...
// Make the animation
[UIView beginAnimations:@"orientationChange" context:nil];
[UIView setAnimationDuration: duration];
bgView.transform = CGAffineTransformMakeRotate(angle);
[UIView commitAnimations];
}
请注意,由于顶栏...
,视图的大小可能会更改另请注意,我自己从未尝试过......
答案 2 :(得分:2)
有一种“正确”的方式:允许框架旋转界面(另一方面,当弹出另一个视图控制器时你会遇到问题)但是覆盖视图的动画。
我有一个全屏视图,其中包含我不想旋转的所有内容,称为_fixedView。在故事板中,我确保所有自动调整(“大小检查器”中的红色箭头)都已关闭,因此视图将始终位于屏幕的中心。
然后在我的视图控制器中,我有这个覆盖:
-(void) willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
[UIView animateWithDuration:duration
animations:^{
if (toInterfaceOrientation == UIInterfaceOrientationLandscapeLeft) {
_fixedView.transform = CGAffineTransformMakeRotation(M_PI_2);
} else if (toInterfaceOrientation == UIInterfaceOrientationLandscapeRight) {
_fixedView.transform = CGAffineTransformMakeRotation(-M_PI_2);
} else if (toInterfaceOrientation == UIInterfaceOrientationPortraitUpsideDown) {
_fixedView.transform = CGAffineTransformMakeRotation(M_PI);
} else {
_fixedView.transform = CGAffineTransformIdentity;
}}];
}
这样_fixedView中的所有内容都是完全修复的(对于描述性名称,这是怎么回事?呃?)状态栏和我的工具栏正常旋转。
答案 3 :(得分:1)
我不知道'正确'的方式,但解决方法是在两个方向创建背景视图,只需更改背景视图。但是很好的问题 - 将有兴趣看看人们提出什么作为解决方案。