\n not working in Sklabel SpriteKit

前端 未结 4 2278
滥情空心
滥情空心 2021-02-20 10:53

I have been using the following code in my game. The Problem is that i am unable to make multi-line label in spritekit as i was able to do using CCLabelTTF...... Can Somebody he

相关标签:
4条回答
  • 2021-02-20 11:25

    You can use NSLayoutManager to line-break the string to match a desired width, as hinted by this question.

    Note that NSLayoutManager is available on iOS beginning with iOS 7.

    0 讨论(0)
  • 2021-02-20 11:36

    It appears that SKLabelNode only supports one line of text at a time. I can't find it in the SpriteKit documentation or anywhere else official, but it's mentioned on the 47th slide of this WWDC presentation. You'll have to use UILabel instead, which you can see explained here.

    0 讨论(0)
  • 2021-02-20 11:36

    I had the same problem. I created a drop-in replacement for SKLabelNode called DSMultilineLabelNode that supports word wrap, line breaks, etc. The underlying implementation draws the string into a graphics context and then applies that to a texture on an SKSpriteNode.

    It's available on GitHub at:

    https://github.com/downrightsimple/DSMultilineLabelNode

    0 讨论(0)
  • 2021-02-20 11:42

    Like a lot of others I also needed a fix to this problem. My approach was a lot simpler than Chris' solution. I have made a subclass of SKLabelNode called NORLabelNode.

    It's available at GitHub and there is also a cocoapod available.

    It simply creates a set of SKLabelNodes and use these as subnodes. If you want to implement something similar yourself the main gist is this method:

    - (NSArray *)labelNodesFromText:(NSString *)text{
        NSArray *substrings    = [text componentsSeparatedByString:@"\n"];
        NSMutableArray *labelNodes    = [[NSMutableArray alloc] initWithCapacity:[substrings count]];
    
        NSUInteger labelNumber    = 0;
        for (NSString *substring in substrings) {
            SKLabelNode *labelNode    = [SKLabelNode labelNodeWithFontNamed:self.fontName];
            labelNode.text    = substring;
            labelNode.fontColor    = self.fontColor;
            labelNode.fontSize    = self.fontSize;
            labelNode.horizontalAlignmentMode    = self.horizontalAlignmentMode;
            labelNode.verticalAlignmentMode    = self.verticalAlignmentMode;
            CGFloat y    = self.position.y - (labelNumber * self.fontSize * self.lineSpacing);
            labelNode.position    = CGPointMake(self.position.x, y);
            labelNumber++;
            [labelNodes addObject:labelNode];
        }
    
        return [labelNodes copy];
    }
    

    The above is somewhat simplified as the labels also inherit most of the other properties from their parent.

    The linespacing can be altered through a CGFloat property. Apart from this is works just like an ordinary SKLabelNode and you can change text, color, font, fontSize etc. on the fly whenever you feel like.

    0 讨论(0)
提交回复
热议问题