我是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
}
崩溃:
我正在尝试通过设计UIView实现以下输出
请让我知道如何将UIView添加为SCNNode的分散内容。
答案 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
}