Establezca CALayer como contenido difuso de SCNMaterial

He estado buscando en todo el Internet durante los últimos días sin éxito. Lamentablemente, la documentation de Apple sobre este problema específico es vaga y no hay ningún código de muestra disponible (al less eso es lo que descubrí). Lo que parece ser el problema que puedes preguntar …

Estoy tratando de configurar la capa de una uiview como el contenido del material que se utiliza para representar la pantalla de un model de iPhone (Yep, trippy: P). La cartografía UV de la pantalla del iPhone se establece de 0 a 1 para que no haya problemas en la asignación de la textura / capa a los texts.

Entonces, en lugar de hacer que esta capa aparezca en el iPhone, igual que la image de la izquierda, en cambio, obtengo esta renderizada en el iPhone como la image derecha

Renderizado correcto Renderizado incorrecto

introduzca la descripción de la imagen aquí

También tenga en count que cuando establezco un punto de interrupción y depuro el nodo real del iPhone y lo veo en Xcode, se muestra una representación completamente diferente y la capa se resuelve a medias cuando sigo ejecutando:

Error extraño

Ahora bien … ¿Cómo soluciono este problema? Intenté jugar con la matriz de transformación de contenidos del difuso, pero nada se soluciona. También he intentado cambiar el tamaño de UIView a 256×256 (ya que el UV parece ser 256×256 como se muestra en la licuadora, el package de modelado 3d), pero eso no soluciona nada.

Aquí está el código de la capa:

UIView *screen = [[UIView alloc] initWithFrame:self.view.bounds]; screen.backgroundColor = [UIColor networkingColor]; UIView *temp = [[UIView alloc] initWithFrame:CGRectMake(0, 0, screen.bounds.size.width, 60)]; temp.backgroundColor = [UIColor colorWithRed:0 green:(112.f/255.f) blue:(235.f/255.f) alpha:1]; UILabel *label = [[UILabel alloc] initWithFrame:CGRectInset(temp.bounds, 40, 0)]; label.frame = CGRectOffset(label.frame, 40, 0); label.textColor = [UIColor colorWithRed:0 green:(48.f/255.f) blue:(84.f/255.f) alpha:1]; label.text = @"Select Track"; label.font = [UIFont fontWithName:@"HelveticaNeue-Light" size:30]; label.minimumScaleFactor = 0.001; label.adjustsFontSizeToFitWidth = YES; label.lineBreakMode = NSLineBreakByClipping; [temp addSubview:label]; UIView *separator = [[UIView alloc] initWithFrame:CGRectMake(0, temp.bounds.size.height - 2, temp.bounds.size.width, 2)]; separator.backgroundColor = [UIColor colorWithRed:0 green:(48.f/255.f) blue:(84.f/255.f) alpha:1]; [temp addSubview:separator]; [screen addSubview:temp]; screen.layer.contentsGravity = kCAGravityCenter; 

Editar
Lo que es incluso más extraño es que si capturo un UIImage de la vista usando:

 - (UIImage *) imageWithView:(UIView *)view { UIGraphicsBeginImageContextWithOptions(view.bounds.size, view.opaque, 0.0); [view.layer renderInContext:UIGraphicsGetCurrentContext()]; UIImage * img = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return img; } 

y usar eso como contenido de la difusa … ¡todo funciona perfectamente bien! Es realmente extraño y frustrante ya que el tamaño de la image es exactamente el mismo que el de la uiview …


Editar 2

Terminé usando una image de la vista como la textura, lo que hace que las cosas sean mucho más estáticas de lo que necesitaba. No estableceré esto como la respuesta porque todavía estaré esperando una solución correcta a este problema, incluso si en un largo time. Por lo tanto, si tiene una respuesta y este tema se ha abierto durante mucho time, por favor, bump si puede. La documentation en esta sección es tan pobre.

Los documentos de SceneKit sugieren con bastante fuerza que, aunque hay casos en los que puede utilizar CALayers animados como contenido de material, eso no incluye UIView capas de UIView :

SceneKit no puede usar una capa que ya se muestra en otro lugar (por ejemplo, la capa de respaldo de un object UIView ).

Eso sugiere que si quieres crear contenido animado para tu material, estarás mejor con Core Animation usado por completo solo o SpriteKit.