在 Xcode 11 游乐场中使用 SwiftUI

Posted

技术标签:

【中文标题】在 Xcode 11 游乐场中使用 SwiftUI【英文标题】:Using SwiftUI in Xcode 11 playground 【发布时间】:2019-06-26 02:33:49 【问题描述】:

我知道如何在常规应用项目中使用 Xcode 11 中的 SwiftUI,但我想知道是否有办法在 Playground 中使用它,即使我不能使用实时编辑器?

【问题讨论】:

【参考方案1】:

当然,这很容易:

import PlaygroundSupport

PlaygroundPage.current.liveView = UIHostingController(rootView: PlaygroundRootView())

public struct PlaygroundRootView: View 
    public init() 

    public var body: some View 
        Text("Hello World!")
    

在此处查看更多信息: https://github.com/attoPascal/SwiftUI-Tutorial-Playground

【讨论】:

【参考方案2】:

在 macOS Mojave 上,除了使用 PlaygroundPage.current.liveView 之外,您还可以将 SwiftUI 视图绘制成图像。这样,您就可以在 Playground 中拥有多个“实时视图”。

查看这篇文章:https://ericasadun.com/2019/06/20/swiftui-render-your-mojave-swiftui-views-on-the-fly/

示例代码托管在这里 https://gist.github.com/erica/fb5005f625207e108836175ff201d8f2

renderedImage 实用程序代码(Erica Sadun 拥有版权!)

import PlaygroundSupport
import SwiftUI
extension UIView 
  var renderedImage: UIImage 
    let image = UIGraphicsImageRenderer(size: self.bounds.size).image  context in
      UIColor.lightGray.set(); UIRectFill(bounds)
      context.cgContext.setAlpha(0.75)
      self.layer.render(in: context.cgContext)
    
    return image
  

extension View 
  var renderedImage: UIImage 
    let window = UIWindow(frame: CGRect(origin: .zero, size: CGSize(width: 320, height: 160)))
    let hosting = UIHostingController(rootView: self)
    hosting.view.frame = window.frame
    window.rootViewController = hosting
    window.makeKey()
    return hosting.view.renderedImage
  

【讨论】:

以上是关于在 Xcode 11 游乐场中使用 SwiftUI的主要内容,如果未能解决你的问题,请参考以下文章

在 SwiftUI 游乐场中使用多个文件

在 xcode 中将资源添加到游乐场

Xcode:有啥方法可以刷新/重新运行游乐场?

Xcode 11 PDF 图像资产“保留矢量数据”在 SwiftUI 中不起作用?

Xcode 11 未在 SwiftUI 中显示对象库

Xcode 11 - SwiftUI 预览暗模式 [重复]