基于设备旋转更新变量- Swift UI



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

ContentView ()

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来使用这个方法。

最新更新