xcode 在ios9.1中使用什么来代替UISscreen.mainScreen().applicationFrame?

xiozqbni  于 2022-12-19  发布在  iOS
关注(0)|答案(6)|浏览(128)

这可能是一个简单的问题,但因为我是一个初学者,它是最好的问.
正如标题所说,我应该使用什么来代替UIScreen.mainScreen().applicationFrame,因为它在9.0中被弃用。
如果可能的话,这将是伟大的,如果你能提供一个样本或例子,因为我发现苹果文件困难。
目前我使用下面的代码,但我希望改变它的新版本。我很乐意听到你!

let sizeRect = UIScreen.mainScreen().applicationFrame
  let posX = arc4random_uniform(UInt32(sizeRect.size.width))
  let posY = arc4random_uniform(UInt32(sizeRect.size.height))
  Enemy.position = CGPoint(x: CGFloat(posX), y: CGFloat(posY))
mbjcgjjk

mbjcgjjk1#

用途

let rect1 = UIScreen.mainScreen().bounds // Returns CGRect
let rect2 = UIScreen.mainScreen().bounds.size // Returns CGSize

斯威夫特3+:

let rect1 = UIScreen.main.bounds // Returns CGRect
let rect2 = UIScreen.main.bounds.size // Returns CGSize
cbjzeqam

cbjzeqam2#

我知道UIScreen.mainScreen().bounds是推荐的替代方案;然而,它并不完全等同于UIScreen.mainScreen().applicationFrame,特别是当你的应用程序没有占据整个屏幕时,这种情况发生在某些iPad上的分割视图和滑动功能上。
在这种情况下,这是一个很好的选择:UIApplication.sharedApplication.keyWindow.frame。(当然keyWindow必须可用,也就是说,您确实调用了makeKeyAndVisible

72qzrwbm

72qzrwbm3#

从swift 3开始你现在需要这样使用它。

let SCREEN_WIDTH = UIScreen.main.bounds.size.width
let SCREEN_HEIGHT = UIScreen.main.bounds.size.height
ruoxqz4g

ruoxqz4g4#

适用于:

let width = UIScreen.mainScreen().bounds.width

以及:

let height = UIScreen.mainScreen().bounds.height
q8l4jmvw

q8l4jmvw5#

斯威夫特3+:

let width = UIScreen.main.bounds.width
let height = UIScreen.main.bounds.height
50few1ms

50few1ms6#

不幸的是,UIScreen.mainUIScreen.mainScreen()自iOS 16以来均已弃用。
Apple不鼓励使用此符号。请使用通过上下文找到的UISscreen示例。例如,通过管理包含视图的窗口的窗口场景上的screen属性引用显示视图的屏幕。
像往常一样,苹果的文档很擅长告诉你什么不该做,但很少给予你什么该做的例子。所以经过一些搜索和测试,我想出了自己的解决方案。
我创建了一个带有静态函数的helper类,它允许我访问当前场景,并从那里访问窗口和屏幕。
此解决方案仅适用于iOS等单窗口应用程序,对于iPad和macOS应用程序还需要做一些额外的工作。
我的解决方案来自this thread中的响应组合,两个答案都在主应用程序条目中创建了一个UIWindow?变量。

第一个Response

@main
struct DemoApp: App {
    
    var window: UIWindow? {
        guard let scene = UIApplication.shared.connectedScenes.first,
              let windowSceneDelegate = scene.delegate as? UIWindowSceneDelegate,
              let window = windowSceneDelegate.window else {
            return nil
        }
        return window
    }

    [...]
}

第二个

@main
struct TestApp: App {

    var window: UIWindow? {
        guard let scene = UIApplication.shared.connectedScenes.first,
              let windowScene = scene as? UIWindowScene else {
            return nil
        }
    
        return .init(windowScene: windowScene)
    }
}

我不赞成第二个响应,因为它从UIWindowScene创建了一个新的UIWindow,您可以从UIWindowScene访问一个窗口数组。
我对这个解决方案的第一次尝试是创建一个帮助器和一些便利函数,然后将它们公开到View上。

助手

struct Application {
    public static var scene: UIScene? {
        guard let scene = UIApplication.shared.connectedScenes.first else {
            return nil
        }

        return scene
    }

    public static var window: UIWindow? {
        
        guard let scene = self.scene,
              let delegate = scene.delegate as? UIWindowSceneDelegate,
              let window = delegate.window else {
            return nil
        }
        
        return window
    }

    public static var screen: UIScreen? {
        guard let window = self.window else {
            return nil
        }

        return window.screen
    }
}

我选择从委托访问UIScene,而不是将UIScene强制转换为UIWindowScene,因为根据Apple的documentation for UIScene,它是:
对象,表示应用程序使用者界面的一个执行严修。
阅读苹果的documentation for UIWindowScene让我相信通过代理获得它是更可靠的方法。我很好奇在info.plist中使用UISceneConfiguration条目是否更好?

分机号

extension View {
    var scene: UIScene? {
        return Application.scene
    }
    
    var window: UIWindow? {
        return Application.window
    }
    
    var screen: UIScreen? {
        return Application.screen
    }
}

我不是一个经验丰富的Swift开发人员,所以我相信有一个更好的解决方案。我想知道什么是更好的解决方案?看起来UIScreen.main是一个非常常见的对象,建立一个新的使用模式将是伟大的。

相关问题