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
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.
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.
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
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.