NSAttributedString不适用于SCNText

时间:2015-09-16 14:05:44

标签: ios nsattributedstring scenekit

我想在SceneKit场景中显示一些文字,其中字符具有不同的颜色。 documentation of SCNText州:

  

当您从属性字符串创建文本几何体时,SceneKit会根据字符串中的属性设置文本样式,并且SCNText对象的属性确定字符串中没有样式属性的部分的默认样式。

我试过了,但它没有用。 SCNText似乎忽略了我的字符串的属性。我检查了我的NSAttributedString的内容是否正确并将其添加到UILabel中,并按预期显示。

为什么3D文字没有着色?

这是一个小型测试应用程序(来自Single View Application模板)和屏幕截图:

Screenshot of test application

#import "ViewController.h"

#import <SceneKit/SceneKit.h>

@interface ViewController ()

@end

@implementation ViewController

- (void) viewDidLoad
{
    [super viewDidLoad];

    NSAttributedString* str = [ViewController makeSomeText];

    [self addSceneViewWithText: str];
    [self addLabelWithText: str];
}

+ (NSMutableAttributedString*) makeSomeText
{
    NSDictionary* redAttr   = @{NSForegroundColorAttributeName : [UIColor redColor]};
    NSDictionary* greenAttr = @{NSForegroundColorAttributeName : [UIColor greenColor]};
    NSDictionary* blueAttr  = @{NSForegroundColorAttributeName : [UIColor blueColor]};

    NSAttributedString* redStr   = [[NSAttributedString alloc] initWithString: @"red"   attributes: redAttr];
    NSAttributedString* greenStr = [[NSAttributedString alloc] initWithString: @"green" attributes: greenAttr];
    NSAttributedString* blueStr  = [[NSAttributedString alloc] initWithString: @"blue"  attributes: blueAttr];

    NSMutableAttributedString* str = [[NSMutableAttributedString alloc] init];
    [str appendAttributedString: redStr];
    [str appendAttributedString: greenStr];
    [str appendAttributedString: blueStr];

    return str;
}

- (void) addSceneViewWithText: (NSAttributedString*) string
{
    SCNView* view = [[SCNView alloc] initWithFrame: self.view.bounds];
    view.scene = [SCNScene scene];
    view.backgroundColor = [UIColor grayColor];
    view.autoenablesDefaultLighting = true;
    view.allowsCameraControl = true;
    SCNNode* root = view.scene.rootNode;
    [self.view addSubview: view];

    SCNNode* cameraNode = [SCNNode node];
    cameraNode.camera = [SCNCamera camera];
    cameraNode.camera.automaticallyAdjustsZRange = true;
    [root addChildNode: cameraNode];

    SCNText* text = [SCNText textWithString: string extrusionDepth: 3];
    // text.firstMaterial.diffuse.contents = [UIColor yellowColor];
    SCNNode* textNode = [SCNNode nodeWithGeometry: text];
    textNode.rotation = SCNVector4Make (1, 0, 0, 0.5f);
    [root addChildNode: textNode];

    SCNVector3 text_center;
    float dummy;
    [text getBoundingSphereCenter: &text_center radius: &dummy];
    textNode.position = SCNVector3Make (-text_center.x, -text_center.y, -150);
}

- (void) addLabelWithText: (NSAttributedString*) string
{
    CGRect bounds = self.view.bounds;
    UILabel* label = [[UILabel alloc] initWithFrame: CGRectMake (0, 50, bounds.size.width, 50)];
    label.attributedText = string;
    label.textAlignment = NSTextAlignmentCenter;
    [self.view addSubview: label];
}

- (void) didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
}

@end

1 个答案:

答案 0 :(得分:3)

直接回答您的问题:&#34;为什么3D文字没有着色?&#34;

颜色可能不被视为&#34; style&#34;因为他们正在使用文档中的单词。它可能也是一个错误的用词,因为它描述了文字的质量,这些文字在它曾经使用过的每一个地方都会被弯曲和扭曲。

他们的意思很可能就是说重量,对齐,下划线,删除线,字距调整和引导......这种性质的东西都是由SceneKit解释的。但只有反复试验才能确定哪些有效,哪些无效。

Apple应该提供一个表格,其中包含SceneKit识别和使用的文本属性/质量列表。

&#34; style&#34;的唯一用途我可以在Core Text和NSAttributedString文档中找到这些文档,建议这些框架考虑每个段落对这些类型的质量进行分组,这在思考SceneKit文本时也几乎没有帮助。

编辑:关于3D和材料的其他内容,以防这对您来说是新闻:

&#39;材料&#39;在3D中,用3D创建颜色的印象,对光的反射,反射和材料的其他质量,并且需要创建和应用。它并不像说&#34;使objectABC为红色&#34;就像二维思维一样。

单个文本对象(用3D表示,而不是你如何看待Cocoa中的这些东西)可能无法通过SceneKit中的不同材质和/或材质ID自动制作。材质ID是在3ds Max等大多数人创建几何体和材质的东西中,不同材质应用于单个对象的不同部分的方式。

不幸的是,SceneKit并没有遵循这个惯例,而是使用&#39;元素&#39;作为几何对象的一部分,每个对象都是索引的一部分,该索引对应于提供该几何的任何材料。

您可以在此处详细了解:

https://developer.apple.com/library/ios/documentation/SceneKit/Reference/SCNGeometry_Class/index.html#//apple_ref/doc/uid/TP40012000-CLSCHSCNGeometry-SW15

因此,要获得您正在寻找的东西,可能需要制作3个文本对象并为每个文本对象提供您想要的颜色的独特材料,或打破3个字对象分为3个元素,然后猜测如何在每个元素上获得正确的材料。

编辑:忽略上段的最后一部分。你需要制作3个文本对象才能获得你想要的外观。 Scene Kit中的材质分布的元素功能保留在文本对象上,因此您无法将单词级别的文本分解为不同的元素。

来自docs:

  

文本几何体可能包含一个,三个或五个几何元素:

     
      
  • 如果其extrusionDepth属性为0.0,则文本几何具有一个   元素对应于其一个可见侧。

  •   
  • 如果其拉伸深度大于零且其chamferRadius   property是0.0,文本几何有三个元素,对应   到它的正面,背面和挤压边。

  •   
  • 如果挤出深度和倒角半径都大于零,则为   文本几何有五个元素,对应于它的正面,背面,   挤压边,前倒角和后倒角。

  •