gpt4 book ai didi

ios - SKLabelNode 多行

转载 作者:行者123 更新时间:2023-11-29 10:27:38 25 4
gpt4 key购买 nike

我在 SKLabelNode 中显示多行标签时遇到了一些麻烦。首先,我知道没有 lines 属性或任何类似的东西。我知道那里有 GitHub 项目可能能够做到这一点,但我宁愿干脆不使用它们。

我需要多行的原因是我的应用程序内购买的工作方式。有时,描述不能全部放在一行中。例如,以最大的 DynamicType 字幕字体大小呈现,字符串:

Cheat and get 25% of the points needed for the "Chaos" theme!

不适用于任何纵向布局的 iOS 手机。我试过调用这个函数:

-(NSString*)autoInsertLineBreaksInString:(NSString*)string {
NSLog(@"Function called with %@", string);
NSMutableArray* arrayOfSpaceIndexes = [NSMutableArray array];
NSMutableString* returnString = [string mutableCopy];
for (int i = 0; i < string.length; i++) {
if ([string characterAtIndex:i] == [@" " characterAtIndex:0]) {
NSLog(@"Adding %i to array of space indexes.", i);
[arrayOfSpaceIndexes addObject:@(i)];
} else {
NSLog(@"Not adding %i to array of space indexes.", i);
}
}
[returnString replaceCharactersInRange:NSMakeRange([[arrayOfSpaceIndexes objectAtIndex:(NSUInteger)(floorf((arrayOfSpaceIndexes.count - 1) / 2))] unsignedIntegerValue], 1) withString:@"\n"];
NSLog(@"Retruning %@", returnString);
return returnString;
}

这会在正确的位置插入 \n 并输出...

Cheat and get 25% of the
points needed for the "Chaos" theme.

...但是标签节点将 \n 解释为一个空格,给我原始字符串。我真的不想使用第二个标签节点。关于如何解决此问题的任何想法?

最佳答案

这个帖子帮助我找到了正确的方向。这是我对建议解决方案的 objective-c 实现:

NSInteger fontSize = 40;
SKNode *messageNode;
messageNode = [[SKNode alloc] init];

NSArray *components = [messageString componentsSeparatedByString:@"\n"];

for(int i = 0; i < [components count]; i++){
SKLabelNode *subNode = [SKLabelNode labelNodeWithFontNamed:@"Helvetica-Bold"];
subNode.text = [components objectAtIndex:i];
subNode.position = CGPointMake(0, -fontSize*i);
subNode.fontSize = fontSize;
subNode.fontColor = [SKColor blackColor];
subNode.verticalAlignmentMode = SKLabelVerticalAlignmentModeCenter;
[messageNode addChild:subNode];
}

请注意,由于每个新行都相对于父节点垂直向下移动,因此当您将 messageNode 放置在场景中时,位置将基于第一行文本的中心点, 而不是整个文本 block 的中心点。这可以通过将 messageNode 的中心点向下调整 totalHeight/2 - lineHeight/2 来轻松解决。请参阅下面后台代码中的 backgroundNode.position 行。

我也写了一些代码来为文本 block 创建背景:

    //Get widest child frame
NSInteger frameWidth = 0;
for(int i = 0; i < [messageNode.children count]; i++){
if([messageNode.children objectAtIndex:i].frame.size.width > frameWidth){
frameWidth = [messageNode.children objectAtIndex:i].frame.size.width;
}
}

NSInteger singleLineHeight = [messageNode.children objectAtIndex:0].frame.size.height;
NSInteger lineCount = [messageNode.children count];
NSInteger totalFrameHeight = singleLineHeight * lineCount;

CGSize backgroundFrameSize = CGSizeMake(frameWidth * 1.1, totalFrameHeight * 1.5);
CGFloat cornerRadius = 10;
SKShapeNode *backgroundNode = [SKShapeNode shapeNodeWithRectOfSize:backgroundFrameSize cornerRadius:cornerRadius];

//Bump the frame down so it is vertically centered around all lines of text, rather than vertically centered on the first line.
backgroundNode.position = CGPointMake(0, -(totalFrameHeight/2 - singleLineHeight/2) );
backgroundNode.zPosition = -1;
[messageNode addChild:backgroundNode];

关于ios - SKLabelNode 多行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31351798/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com