4

私は現在、SwiftUI に基づいてウィジェットのみのアプリケーションを作成しています。これにより、ユーザーは時間、日付などのある種の情報を表示できます。アプリケーションを機能させるために、アプリ ビューでウィジェットのプレビューを作成したいと思います。ユーザーが設定できるようにします。

今のところ、すべてがうまく機能しています。アプリケーションでウィジェットを選択し、ウィジェットも更新されるように設定できます。ただし、問題に直面しています。いくつかの調査の結果、使用しているデバイスに応じてウィジェットのサイズを取得できる方法が見つからないようです。

使用してみましUIScreen.main.bounds.sizeたが、ウィジェットのサイズとデバイスのサイズの縦横比が一致しません。

私がやりたいことは、ウィジェットのプレビューを、デバイスが実際に使用しているウィジェットのサイズに合わせることです。(つまり、使用しているデバイスに応じてウィジェットのサイズを取得します)

動的に行うソリューションはありますか、それともデバイスごとにビューを作成する必要がありますか? 前もって感謝します。

4

4 に答える 4

0

迅速な UI を使用している場合は、Geometry Reader を使用するか、Environment プロパティ ラッパーを使用して、.systemSmall、Medium、Large の 3 つのサイズと比較できます。

@Environment(\.widgetFamily) var widgetFamily

于 2022-02-26T17:37:19.733 に答える
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 に答える