如何全局检测swift文件外部的设备活动方向更改?

时间:2018-12-29 03:54:09

标签: swift orientation rounded-corners cornerradius

我在弄清楚如何更新计算器视图控制器中的拐角半径时遇到了麻烦(请参阅本文结尾处的链接中的图像)。我正在使用viewWillLayoutSubviews()设置拐角半径,到目前为止,它一直工作得很好。但是,我注意到,如果我离开计算器视图控制器屏幕,旋转设备,然后导航回到计算器视图控制器屏幕,则拐角半径仍然基于先前的方向屏幕。我曾试过在viewDidAppear()内调用viewWillLayoutSubviews(),但是在正确设置按钮角半径之前有明显的延迟。

如何知道在设备库或其他视图控制器中时设备方向是否发生了变化?导航回计算器屏幕时,我需要能够加载圆形按钮。谢谢您的宝贵时间,我很感谢大家提供的所有信息。谢谢您的时间!

Screenshots of my current application from loading screen to the point of the corner radius not being updated correctly

2 个答案:

答案 0 :(得分:1)

您可以在viewdidLoad中这样做,在下面添加代码以检查设备方向

[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
[[NSNotificationCenter defaultCenter]
 addObserver:self selector:@selector(orientationChanged:)
 name:UIDeviceOrientationDidChangeNotification
 object:[UIDevice currentDevice]];

现在每次在到达时检查设备方向并根据下面的代码重新加载视图

- (void) orientationChanged:(NSNotification *)note { }

答案 1 :(得分:0)

将此代码添加到您的应用程序委托中。因此,您知道设备在全局上是横向还是纵向。然后,您可以使用Viewwill来更改半径。

import UIKit


@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

var window: UIWindow?

var didRotate: (Notification) -> Void = { notification in
    switch UIDevice.current.orientation {
    case .landscapeLeft, .landscapeRight:
        print("landscape")
    case .portrait, .portraitUpsideDown:
        print("Portrait")
    default:
        print("other")
    }
}



func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    // Override point for customization after application launch.

    NotificationCenter.default.addObserver(forName: UIDevice.orientationDidChangeNotification,
                                           object: nil,
                                           queue: .main,
                                           using: didRotate)


    return true
}

}