两个独立的 UIView 旋转
Two Separate UIView Rotations
我的 UIViewController
中有两个 UIViews
。我想要一个旋转而另一个被锁定。基本上,一个 UIView 可以在纵向和横向之间切换,而另一个固定在 "Portrait" 模式。
起初我尝试使用 shouldAutorotate
,但后来我意识到这适用于属于 UIViewController
的所有内容。然后我尝试使用两个 UIViewController
s(顺便说一句,这对旋转问题非常有效)但是我在一个视图控制器中进行了 AVCaptureSession
,我不想连接相机输入并每次都初始化会话。
有什么方法可以让一个旋转而另一个锁定?
谢谢!
我想你可以用 shouldAutorotate
来完成。当设备改变方向时,您的两个视图都会旋转,然后使用如下所示的变换手动旋转具有初始位置的固定视图,
myView.transform = CGAffineTransformMakeRotation(M_PI_2);
您可以像下面这样使用委托来执行手动轮换
- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
{
// do something before rotation
}
或
- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation
{
// do something after rotation
}
更新:
参考this answer禁用动画!
希望这会有所帮助:)
好吧,我花了整整一个半月才弄明白,但这是我的解决方案:
很难在每次设备旋转时都考虑所有单独的 UIViews
旋转,所以我回到了两个 UIViewControllers
方法。
这一次,我决定将 UINavigationController
作为根视图控制器,然后对它进行子class 编辑。我在我的界面 class 中设置了一个 NSNumber
变量来说明用户可能拥有的 2 个或更多视图控制器。但是,在我的例子中,我只会真正在 0 和 1 之间切换。此外,我覆盖了 shouldAutoRotate
和 supportedInterfaceOrientations
以根据 NSNumber
变量具有不同的属性。
在进一步解释之前,我将post我的代码...
这是我的界面class:
@interface MasterNavigationController : UINavigationController
@property (strong, nonatomic) NSNumber *num;
@end
和我的实现 class:
#import "MasterNavigationController.h"
@implementation MasterNavigationController
- (BOOL)shouldAutorotate {
if ([_num isEqualToNumber:[NSNumber numberWithInt:0]]) return NO;
return YES;
}
- (UIInterfaceOrientationMask)supportedInterfaceOrientations {
if ([_num isEqualToNumber:[NSNumber numberWithInt:0]]) return UIInterfaceOrientationMaskPortrait;
return [[self topViewController] supportedInterfaceOrientations];;
}
@end
每当我处于我不想旋转的 UIViewController
时,NSNumber
变量将被设置为 0。因此,导航控制器将能够判断它是否应该旋转自动旋转与否。然后当导航控制器推送下一个可以旋转的视图控制器时,我将 NSNumber
变量设置为 1 并且导航控制器能够知道它应该自动旋转。
这很棒,因为每当它推回到非旋转视图控制器时,它就知道重新定位自己而不会搞砸。
希望这可以帮助遇到此问题的其他人!!!我花了很长时间才弄明白。
我的 UIViewController
中有两个 UIViews
。我想要一个旋转而另一个被锁定。基本上,一个 UIView 可以在纵向和横向之间切换,而另一个固定在 "Portrait" 模式。
起初我尝试使用 shouldAutorotate
,但后来我意识到这适用于属于 UIViewController
的所有内容。然后我尝试使用两个 UIViewController
s(顺便说一句,这对旋转问题非常有效)但是我在一个视图控制器中进行了 AVCaptureSession
,我不想连接相机输入并每次都初始化会话。
有什么方法可以让一个旋转而另一个锁定?
谢谢!
我想你可以用 shouldAutorotate
来完成。当设备改变方向时,您的两个视图都会旋转,然后使用如下所示的变换手动旋转具有初始位置的固定视图,
myView.transform = CGAffineTransformMakeRotation(M_PI_2);
您可以像下面这样使用委托来执行手动轮换
- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
{
// do something before rotation
}
或
- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation
{
// do something after rotation
}
更新:
参考this answer禁用动画! 希望这会有所帮助:)
好吧,我花了整整一个半月才弄明白,但这是我的解决方案:
很难在每次设备旋转时都考虑所有单独的 UIViews
旋转,所以我回到了两个 UIViewControllers
方法。
这一次,我决定将 UINavigationController
作为根视图控制器,然后对它进行子class 编辑。我在我的界面 class 中设置了一个 NSNumber
变量来说明用户可能拥有的 2 个或更多视图控制器。但是,在我的例子中,我只会真正在 0 和 1 之间切换。此外,我覆盖了 shouldAutoRotate
和 supportedInterfaceOrientations
以根据 NSNumber
变量具有不同的属性。
在进一步解释之前,我将post我的代码...
这是我的界面class:
@interface MasterNavigationController : UINavigationController
@property (strong, nonatomic) NSNumber *num;
@end
和我的实现 class:
#import "MasterNavigationController.h"
@implementation MasterNavigationController
- (BOOL)shouldAutorotate {
if ([_num isEqualToNumber:[NSNumber numberWithInt:0]]) return NO;
return YES;
}
- (UIInterfaceOrientationMask)supportedInterfaceOrientations {
if ([_num isEqualToNumber:[NSNumber numberWithInt:0]]) return UIInterfaceOrientationMaskPortrait;
return [[self topViewController] supportedInterfaceOrientations];;
}
@end
每当我处于我不想旋转的 UIViewController
时,NSNumber
变量将被设置为 0。因此,导航控制器将能够判断它是否应该旋转自动旋转与否。然后当导航控制器推送下一个可以旋转的视图控制器时,我将 NSNumber
变量设置为 1 并且导航控制器能够知道它应该自动旋转。
这很棒,因为每当它推回到非旋转视图控制器时,它就知道重新定位自己而不会搞砸。
希望这可以帮助遇到此问题的其他人!!!我花了很长时间才弄明白。