4

我目前正在制作一个基于 SwiftUI 的仅小部件应用程序,它允许用户显示某些类型的信息,如时间、日期等。为了使我的应用程序正常运行,我还想在应用程序视图中预览小部件允许用户设置它。

现在一切正常,我可以在我的应用程序中选择一个小部件并进行设置,以便小部件也更新。但是,我遇到了一个问题,经过一些研究,我似乎找不到一种方法可以让您根据所使用的设备获取小部件的大小。

我尝试使用UIScreen.main.bounds.size,但小部件尺寸和设备尺寸之间的纵横比不一样。

我想做的是让我的小部件预览适应设备实际使用的小部件尺寸。(换句话说,根据您使用的设备检索小部件大小)

是否有任何解决方案可以动态执行,或者我是否需要为每个设备创建视图?提前致谢。

4

4 回答 4

11

您可以将 UIScreen.main.bounds.size 映射到 Apple 文档中的小部件尺寸: https ://developer.apple.com/design/human-interface-guidelines/widgets/overview/design/小部件的尺寸

小部件的示例:

switch UIScreen.main.bounds.size {
    case CGSize(width: 428, height: 926):   return 170
    case CGSize(width: 414, height: 896):   return 169
    case CGSize(width: 414, height: 736):   return 159
    case CGSize(width: 390, height: 844):   return 158
    case CGSize(width: 375, height: 812):   return 155
    case CGSize(width: 375, height: 667):   return 148
    case CGSize(width: 360, height: 780):   return 155
    case CGSize(width: 320, height: 568):   return 141
    default:                                return 155
    }
于 2020-10-03T14:29:08.890 回答
2

您可以使用displaySizeTimelineProviderContext获取当前 Widget 的大小。

func getTimeline(in context: Context, completion: @escaping (Timeline<Item>) -> Void) {
    print(context.displaySize)
    ...
}

您可以在 Widget Provider 中找到它。

于 2021-05-05T13:53:12.827 回答
0

如果你愿意,我添加了更多尺寸。

获得您可以使用的家庭价值:@SwiftUI.Environment(\.widgetFamily) var family从您的视图内部

    func widgetHeight(forFamily family:WidgetFamily) -> CGSize {
    // better to use getTimeline func context.displaySize before this one.
    
    switch family {
    case .systemSmall:
        switch UIScreen.main.bounds.size {
        case CGSize(width: 428, height: 926):   return CGSize(width:170, height: 170)
        case CGSize(width: 414, height: 896):   return CGSize(width:169, height: 169)
        case CGSize(width: 414, height: 736):   return CGSize(width:159, height: 159)
        case CGSize(width: 390, height: 844):   return CGSize(width:158, height: 158)
        case CGSize(width: 375, height: 812):   return CGSize(width:155, height: 155)
        case CGSize(width: 375, height: 667):   return CGSize(width:148, height: 148)
        case CGSize(width: 360, height: 780):   return CGSize(width:155, height: 155)
        case CGSize(width: 320, height: 568):   return CGSize(width:141, height: 141)
        default:                                return CGSize(width:155, height: 155)
        }
    case .systemMedium:
        switch UIScreen.main.bounds.size {
        case CGSize(width: 428, height: 926):   return CGSize(width:364, height: 170)
        case CGSize(width: 414, height: 896):   return CGSize(width:360, height: 169)
        case CGSize(width: 414, height: 736):   return CGSize(width:348, height: 159)
        case CGSize(width: 390, height: 844):   return CGSize(width:338, height: 158)
        case CGSize(width: 375, height: 812):   return CGSize(width:329, height: 155)
        case CGSize(width: 375, height: 667):   return CGSize(width:321, height: 148)
        case CGSize(width: 360, height: 780):   return CGSize(width:329, height: 155)
        case CGSize(width: 320, height: 568):   return CGSize(width:292, height: 141)
        default:                                return CGSize(width:329, height: 155)
        }
    case .systemLarge:
        switch UIScreen.main.bounds.size {
        case CGSize(width: 428, height: 926):   return CGSize(width:364, height: 382)
        case CGSize(width: 414, height: 896):   return CGSize(width:360, height: 379)
        case CGSize(width: 414, height: 736):   return CGSize(width:348, height: 357)
        case CGSize(width: 390, height: 844):   return CGSize(width:338, height: 354)
        case CGSize(width: 375, height: 812):   return CGSize(width:329, height: 345)
        case CGSize(width: 375, height: 667):   return CGSize(width:321, height: 324)
        case CGSize(width: 360, height: 780):   return CGSize(width:329, height: 345)
        case CGSize(width: 320, height: 568):   return CGSize(width:292, height: 311)
        default:                                return CGSize(width:329, height: 345)
        }
        
    default:                                return CGSize(width:329, height: 345)
    }
}
于 2022-02-09T19:24:29.617 回答
0

如果您使用的是 swift UI,您可以使用 Geometry Reader 或像这样使用 Environment 属性包装器,您可以将其与 .systemSmall、Medium、Large 三种尺寸进行比较

@Environment(\.widgetFamily) var widgetFamily

于 2022-02-26T17:37:19.733 回答