将自定义UIView添加到Scenekit的节点

时间:2019-06-10 07:07:30

标签: ios swift sprite-kit uikit scenekit

我是Scenekit开发的初学者,我试图将UIView添加为SCNPlane节点的分散内容,但出现一些奇怪的崩溃。

代码:

   override func viewDidLoad() {
        super.viewDidLoad()
        let scene = SCNScene()
        let plane = SCNPlane(width: 0.1, height: 0.1)
        plane.firstMaterial?.diffuse.contents = getCustomView()
        let planeNode = SCNNode(geometry: plane)
        planeNode.position = SCNVector3(0, 0, 0)
        scene.rootNode.addChildNode(planeNode)
        sceneView.scene = scene
    }

    func getCustomView() -> UIView {
        let view = UIView()
        view.backgroundColor = .red
        return view
    }

崩溃:

enter image description here

我正在尝试通过设计UIView实现以下输出

enter image description here

enter image description here

请让我知道如何将UIView添加为SCNNode的分散内容。

2 个答案:

答案 0 :(得分:2)

使用此扩展从 UIView 获取图像表示

public extension UIView {
 @available(iOS 10.0, *)
 var image: UIImage {
    let renderer = UIGraphicsImageRenderer(bounds: bounds)
    return renderer.image { rendererContext in
        layer.render(in: rendererContext.cgContext)
    }
  }
}

并在您的自定义视图上调用它,如下所示:

getCustomView().image

最后在您的 SCNNode 的平面上,如下所示:

plane.firstMaterial?.diffuse.contents = getCustomView().image

答案 1 :(得分:0)

您在这里混入乐高积木和K'Nex。

我们去看文档,看看什么是SCNMaterial的有效分散内容:

  

您可以使用以下任一方法为此属性设置一个值   类型:

     

一种颜色(NSColor / UIColor或CGColor),为   材料的表面

     

一个数字(NSNumber),用于指定一个统一的标量值   材料的表面(用于基于物理的特性,例如   金属感)

     

图像(NSImage / UIImage或CGImage),指定要使用的纹理   映射到材料的表面

     

指定图像文件位置的NSString或NSURL对象

     

视频播放器(AVPlayer)或实时视频捕获预览   (AVCaptureDevice,仅在iOS中)

     

核心动画层(CALayer)

     

纹理(SKTexture,MDLTexture,MTLTexture或GLKTextureInfo)

     

SpriteKit场景(SKScene)

     

一种特殊格式的图像或六个图像的数组,指定了   立方体贴图的面孔

     

当检查从文件加载的场景元素时,此值为   始终是(NSColor或UIColor类的)颜色对象,   根据平台)或图像对象(属于NSImage或UIImage)   类,具体取决于平台)。因此,您可以使用类型   内省(Objective-C中的isKind(of :)方法,或者is   运算符或Swift中的let-as匹配)来确定   实质财产的内容。   https://developer.apple.com/documentation/scenekit/scnmaterialproperty/1395372-contents

让我们看看什么是UIView:

  

UIView类:UIResponder
  类UIResponder:NSObject
  https://developer.apple.com/documentation/uikit/uiview
  https://developer.apple.com/documentation/uikit/uiresponder

如您所见,UIView不是有效类型。

但是,UIView确实包含一个CALayer

  

https://developer.apple.com/documentation/uikit/uiview/1622436-layer

因此,您应该能够使用它从视图中获得所需的内容:

func getCustomViewLayer() -> CALayer {
    let view = UIView()
    view.backgroundColor = .red
    return view.layer
}