如何设置相机视图旋转(不使用不推荐使用的代码)

Posted

技术标签:

【中文标题】如何设置相机视图旋转(不使用不推荐使用的代码)【英文标题】:How to set Camera View rotation (without using deprecated code) 【发布时间】:2018-09-29 17:13:13 【问题描述】:

基本上,如何做到这一点:

    - (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration

    [[(AVCaptureVideoPreviewLayer *)[[self previewView] layer] connection] setVideoOrientation:(AVCaptureVideoOrientation)toInterfaceOrientation];

不使用已弃用的代码 (willRotateToInterfaceOrientation)

我的应用需要 ios 9,所以只要新代码向后兼容那么远,我就不需要保留上面的代码。 Apple 建议使用viewWillTransitionToSize:withTransitionCoordinator:,但我不知道如何。

编辑:

我试过了(正如@Matt 建议的那样)

- (void)viewDidLoad

[super viewDidLoad];
override func viewDidLoad() 
    super.viewDidLoad()
    NotificationCenter.default.addObserver(
                                           forName: UIApplication.willChangeStatusBarOrientationNotification,
                                           object: nil, queue: nil)  n in
        // this is where you respond
        if let userInfo = n.userInfo 
            // use the userInfo to find out what the new orientation is...
        
    


但它会抛出 Use of undeclared identifier 'override' 错误,因为它在 swift 中。

【问题讨论】:

@matt 谢谢你的帮助。 另一方面,既然你用的是这门古老的语言,你可以用我的古书来弄清楚:apeth.com/iOSBook/ch11.html#_receiving_a_built_in_notification 【参考方案1】:

除非你想将 objc 与 swift 混合,否则你需要将 matt 的代码转换为 objc,例如如下:

- (void)viewDidLoad 
    [super viewDidLoad];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleDeviceOrientationChange) name:UIApplicationWillChangeStatusBarOrientationNotification object:nil];


-(void)handleDeviceOrientationChange:(NSNotification *)notification 
    NSDictionary *userInfo = notification.userInfo;
    // Your code

【讨论】:

感谢您的回复。我不是想混合语言。看起来不错——我需要移除观察者吗?或者,有没有办法在不使用观察者的情况下做到这一点?再次感谢。【参考方案2】:

根据 Apple DTS,此代码的作用相同(我自己也确认过)

- (void) viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator

    [super viewWillTransitionToSize:size withTransitionCoordinator:coordinator];

    UIDeviceOrientation deviceOrientation = [UIDevice currentDevice].orientation;

    if (UIDeviceOrientationIsPortrait(deviceOrientation) || UIDeviceOrientationIsLandscape(deviceOrientation)) 
        [[(AVCaptureVideoPreviewLayer *)[[self previewView] layer] connection] setVideoOrientation:(AVCaptureVideoOrientation)deviceOrientation];
    

【讨论】:

以上是关于如何设置相机视图旋转(不使用不推荐使用的代码)的主要内容,如果未能解决你的问题,请参考以下文章

旋转相机时显示黑色三角形的视图

如何设置相机捕获请求的旋转?

在 Scenekit 中移动相机

如何在surfaceview中将Android相机更改为人像?

如何旋转图像视图而不滞后?

如何设置相机视图以填充其父视图