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

Posted

技术标签:

【中文标题】基于设备旋转更新变量 - Swift UI【英文标题】:Update variables based on device rotation - Swift UI 【发布时间】:2021-01-20 13:57:31 【问题描述】:

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

内容视图()

    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
    

【问题讨论】:

这能回答你的问题吗? SwiftUI Repaint View Components on Device Rotation 【参考方案1】:

检查设备是纵向还是横向模式,如下所示:

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

【讨论】:

以上是关于基于设备旋转更新变量 - Swift UI的主要内容,如果未能解决你的问题,请参考以下文章

基于设备传感器覆盖旋转锁定设置旋转

Swift:如何在设备旋转后刷新UICollectionView布局

基于尺寸元素的设备旋转期间的动画更改将在旋转完成后进行

在 App Delegate 级别基于设备强制定向和禁用旋转?

UIButton (w/image) 在应用基于旋转的 CGAffineTransform 后对设备方向做出奇怪的反应

基于旋转更新约束(X,Y,W,H)时出错?