Добавить пользовательский UIView к узлу Scenekit - PullRequest
0 голосов
/ 10 июня 2019

Я новичок в разработке 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.

1 Ответ

0 голосов
/ 10 июня 2019

Вы смешиваете Legos и K'Nex здесь.

Давайте перейдем к документации и посмотрим, что является допустимым диффузным контентом для SCNMaterial:

Вы можете установить значение для этого свойства, используя любой из следующих Типы:

Цвет (NSColor / UIColor или CGColor), определяющий однородный цвет для поверхность материала

Число (NSNumber), указывающее равномерное скалярное значение для поверхность материала (полезна для физических свойств, таких как metalness) * +1010 *

Изображение (NSImage / UIImage или CGImage) с указанием текстуры, которая будет нанесено на карту по поверхности материала

Объект NSString или NSURL, указывающий местоположение файла изображения

Видеоплеер (AVPlayer) или предварительный просмотр захвата видео (AVCaptureDevice, только в iOS)

Базовый слой анимации (CALayer)

Текстура (SKTexture, MDLTexture, MTLTexture или GLKTextureInfo)

Сцена SpriteKit (SKScene)

Специально отформатированное изображение или массив из шести изображений с указанием грани кубической карты

Когда вы проверяете элементы сцены, загруженной из файла, это значение всегда либо цветной объект (класса NSColor или UIColor, в соответствии с платформой) или объект изображения (из NSImage или UIImage класс, в зависимости от платформы). Поэтому вы можете использовать тип Самоанализ (метод isKind (of :) в Objective-C или оператор или дай как сопоставление в Swift), чтобы определить тип материальная собственность. 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
}
...