两个独立的 UIView 旋转

Two Separate UIView Rotations

我的 UIViewController 中有两个 UIViews。我想要一个旋转而另一个被锁定。基本上,一个 UIView 可以在纵向和横向之间切换,而另一个固定在 "Portrait" 模式。

起初我尝试使用 shouldAutorotate,但后来我意识到这适用于属于 UIViewController 的所有内容。然后我尝试使用两个 UIViewControllers(顺便说一句,这对旋转问题非常有效)但是我在一个视图控制器中进行了 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 之间切换。此外,我覆盖了 shouldAutoRotatesupportedInterfaceOrientations 以根据 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 并且导航控制器能够知道它应该自动旋转。 这很棒,因为每当它推回到非旋转视图控制器时,它就知道重新定位自己而不会搞砸。

希望这可以帮助遇到此问题的其他人!!!我花了很长时间才弄明白。