如何全局检测 swift 文件之外的设备活动方向变化?

Posted

技术标签:

【中文标题】如何全局检测 swift 文件之外的设备活动方向变化?【英文标题】:How to globally detect device active orientation changes outside of a swift-file? 【发布时间】:2018-12-29 03:54:08 【问题描述】:

我无法弄清楚如何在计算器视图控制器中更新圆角半径(请参阅本文末尾链接中的图像)。我正在使用 viewWillLayoutSubviews() 设置角半径,到目前为止它运行良好。但是,我注意到,如果我从计算器视图控制器屏幕过渡,旋转设备,然后导航回计算器视图控制器屏幕,角半径仍然基于之前的方向屏幕。我尝试在 viewDidAppear() 中调用 viewWillLayoutSubviews(),但是在正确设置按钮角半径之前存在明显的延迟。

如何判断设备方向是否在库或其他视图控制器中发生变化?导航回计算器屏幕时,我需要能够加载圆形按钮。感谢您抽出宝贵的时间,感谢您提供的任何意见。感谢您的宝贵时间!

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

【问题讨论】:

【参考方案1】:

您可以在 viewdidLoad 中添加以下代码以检查设备方向

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

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

- (void) orientationChanged:(NSNotification *)note  

【讨论】:

【参考方案2】:

将此代码添加到您的应用委托。因此,您知道设备是全局处于横向还是纵向模式。然后你可以使用 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



【讨论】:

我收到以下错误:“使用未声明的类型'UNUserNotificationCenterDelegate'” 现在就来看看吧!谢谢! 好的。已在设备上对其进行了测试以检查其是否有效。如果对您有用,请标记为正确。

以上是关于如何全局检测 swift 文件之外的设备活动方向变化?的主要内容,如果未能解决你的问题,请参考以下文章

当活动方向被锁定时检测设备方向

锁定活动方向时检测设备方向

如何在 Swift 中测量 iOS 设备上的抖动量?

即使设备已锁定方向,如何进行方向检测

如何在 Swift 中以编程方式更改设备方向?

如何在 Flutter 中检测设备运动方向?