简体   繁体   English

在 SwiftUI 中同时打开多个预览

[英]Open multiple previews at the same time in SwiftUI

I know we can open multiple previews of different screens at the same time in SwiftUI .我知道我们可以在SwiftUI中同时打开不同屏幕的多个预览。 Can anyone help me with the steps to achieve that?任何人都可以帮助我实现这一目标的步骤吗?

You can provide devices by their name to preview multiple devices at the same time.您可以按名称提供设备以同时预览多个设备。 For example to preview "iPhone SE" and "iPhone XS Max" you can do like below:例如,要预览“iPhone SE”和“iPhone XS Max”,您可以执行以下操作:

#if DEBUG
struct ContentView_Previews: PreviewProvider {
     static var previews: some View {
          ForEach(["iPhone SE", "iPhone XS Max"], id: \.self) { deviceName in
               ContentView()
                    .previewDevice(PreviewDevice(rawValue: deviceName))
                    .previewDisplayName(deviceName)
          }
     }
}
#endif

The list of supported devices:支持的设备列表:

@available(iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, *)
extension View {

    /// Overrides the device for a preview.
    ///
    /// If `nil` (default), Xcode will automatically pick an appropriate device
    /// based on your target.
    ///
    /// The following values are supported:
    ///
    ///     "Mac"
    ///     "iPhone 7"
    ///     "iPhone 7 Plus"
    ///     "iPhone 8"
    ///     "iPhone 8 Plus"
    ///     "iPhone SE"
    ///     "iPhone X"
    ///     "iPhone Xs"
    ///     "iPhone Xs Max"
    ///     "iPhone Xʀ"
    ///     "iPad mini 4"
    ///     "iPad Air 2"
    ///     "iPad Pro (9.7-inch)"
    ///     "iPad Pro (12.9-inch)"
    ///     "iPad (5th generation)"
    ///     "iPad Pro (12.9-inch) (2nd generation)"
    ///     "iPad Pro (10.5-inch)"
    ///     "iPad (6th generation)"
    ///     "iPad Pro (11-inch)"
    ///     "iPad Pro (12.9-inch) (3rd generation)"
    ///     "iPad mini (5th generation)"
    ///     "iPad Air (3rd generation)"
    ///     "Apple TV"
    ///     "Apple TV 4K"
    ///     "Apple TV 4K (at 1080p)"
    ///     "Apple Watch Series 2 - 38mm"
    ///     "Apple Watch Series 2 - 42mm"
    ///     "Apple Watch Series 3 - 38mm"
    ///     "Apple Watch Series 3 - 42mm"
    ///     "Apple Watch Series 4 - 40mm"
    ///     "Apple Watch Series 4 - 44mm"
    public func previewDevice(_ value: PreviewDevice?) -> Self.Modified<_TraitWritingModifier<PreviewDevice?>>

    /// Overrides the size of the container for the preview.
    ///
    /// Default is `.device`.
    public func previewLayout(_ value: PreviewLayout) -> Self.Modified<_TraitWritingModifier<PreviewLayout>>

    /// Provides a user visible name shown in the editor.
    ///
    /// Default is `nil`.
    public func previewDisplayName(_ value: String?) -> Self.Modified<_TraitWritingModifier<String?>>
}

I created a GitHub Gist to facilitate this.我创建了一个GitHub Gist来促进这一点。

Basically created a enum of devices to preview somewhere (I prefer a Constants file):基本上创建了一个设备枚举以在某处预览(我更喜欢常量文件):

enum MyDeviceNames: String, CaseIterable {
    case iPhoneX = "iPhone X"
    case iPhoneXs = "iPhone Xs"
    case iPhoneXsMax = "iPhone Xs Max"

    static var all: [String] {
        return MyDeviceNames.allCases.map { $0.rawValue }
    }
}

Then use it like this:然后像这样使用它:

struct SampleView_Previews_MyDevices: PreviewProvider {
    static var previews: some View {
        ForEach(MyDeviceNames.all, id: \.self) { devicesName in
            SampleView()
                .previewDevice(PreviewDevice(rawValue: devicesName))
                .previewDisplayName(devicesName)
        }
    }
}

I would like to approach this way我想以这种方式接近

enum Devices: String {
    case iphone7 = "iPhone 7"
    case iphone12 = "iPhone 12"

}

extension View {
    
    func previewDevice(device: Devices) -> some View {
        previewDevice(PreviewDevice(rawValue: device.rawValue))
            .previewDisplayName(device.rawValue)
    }
    
    func previewDevices(devices: [Devices]) -> some View {
        ForEach(devices, id: \.self) { device in
            previewDevice(device: device)
        }
    }
}


My question is: can we preview different iOS version, like iOS 14 and 15?

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM