根据设备旋转更新变量 - Swift UI

问题描述

我发现并使用了一些代码,它会根据设备大小和旋转返回一个变量 true。然而,这些变量在设备旋转时不会更新,文本也不会改变。我想我需要使用一个 observable 对象,但不确定我将如何转换这个扩展?这是我在下面使用的代码

内容视图()

    struct ContentView3: View,SizeClassadjustable {
    
    @Environment(\.verticalSizeClass) var _verticalSizeClass
    @Environment(\.horizontalSizeClass) var _horizontalSizeClass
    var verticalSizeClass: UserInterfaceSizeClass? { _verticalSizeClass }
    var horizontalSizeClass: UserInterfaceSizeClass? { _horizontalSizeClass }
    
    var body: some View {
        if(self.isPadLandscape){
            Text("iPad Landscape")
        }else if(self.isPadPortrait){
            Text("iPad Portrait")
        }else if(self.isPortrait){
            Text("iPhone Portrait")
        }else if(self.isLandscape){
            Text("iPhone Landscape")
        }
    }
}

扩展:

protocol SizeClassadjustable {
    var verticalSizeClass: UserInterfaceSizeClass? { get }
    var horizontalSizeClass: UserInterfaceSizeClass? { get }
}
extension SizeClassadjustable {
    
    var isPad: Bool {
        return horizontalSizeClass == .regular && verticalSizeClass == .regular
    }
    var isPadLandscape: Bool {
        isPad && UIDevice.current.orientation.isLandscape
    }
    var isPadPortrait: Bool {
        isPad && UIDevice.current.orientation.isPortrait
    }
    var isPadOrLandscapeMax: Bool {
        horizontalSizeClass == .regular
    }
    var isLandscapeMax: Bool {
        horizontalSizeClass == .regular && verticalSizeClass == .compact
    }
    var isLandscape: Bool {
        verticalSizeClass == .compact
    }
    var isPortrait: Bool {
        verticalSizeClass == .regular
    }
}

解决方法

检查设备是否处于纵向或横向模式,如下所示:

let screen = UIScreen.main.bounds

if UIDevice.current.userInterfaceIdiom == .phone{ //Phone

    if screen.width < screen.height { //Portrait
    } else { //Landscape
    }

} else { //iPad

    if screen.width < screen.height { //Portrait
    } else { //Landscape
    }

}

然后在适当的范围内执行您的操作。
记得导入UIKit使用这个方法。