如何设置 SKLabelNode 的字体大小以适应固定大小(Swift)
Posted
技术标签:
【中文标题】如何设置 SKLabelNode 的字体大小以适应固定大小(Swift)【英文标题】:How to set font size of SKLabelNode to fit in fixed size (Swift) 【发布时间】:2015-09-07 23:04:50 【问题描述】:我有一个正方形 (200X200),里面有一个 SKLabelNode
。标签显示分数,它可能会达到一个很大的数字。我想把数字放在正方形里。
如何更改 SKLabelNode
的文本大小(或大小)以使其适合固定大小。
【问题讨论】:
【参考方案1】:mike663 答案的这种扩展对我有用,而且比一次 1 个像素快得多。
// Find the right size by trial & error...
var testingSize: CGFloat = 0 // start from here
var currentStep: CGFloat = 16 // go up by this much. It will be reduced each time we overshoot.
var foundMatch = false
while !foundMatch
var overShot = false
while !overShot
testingSize += currentStep
labelNode.fontSize = testingSize
// How much bigger the text should be to perfectly fit in the given rectangle.
let scalingFactor = min(rect.width / labelNode.frame.width, rect.height / labelNode.frame.height)
if scalingFactor < 1 overShot = true // Never go over the space
else if scalingFactor < 1.01 foundMatch = true // Stop when over 99% of the space is filled
testingSize -= currentStep // go back to the last one that didn't overshoot
currentStep /= 4
labelNode.fontSize = testingSize // go back to the one we were happy with
【讨论】:
【参考方案2】:SKLabelNode 框架的大小可以与给定的矩形进行比较。如果根据标签矩形和所需矩形的大小按比例缩放字体,则可以确定最佳字体大小以尽可能多地填充空间。最后一行方便地将标签移动到矩形的中心。 (如果文本只有小写字母或标点符号等短字符,它可能看起来偏离中心。)
斯威夫特
func adjustLabelFontSizeToFitRect(labelNode:SKLabelNode, rect:CGRect)
// Determine the font scaling factor that should let the label text fit in the given rectangle.
let scalingFactor = min(rect.width / labelNode.frame.width, rect.height / labelNode.frame.height)
// Change the fontSize.
labelNode.fontSize *= scalingFactor
// Optionally move the SKLabelNode to the center of the rectangle.
labelNode.position = CGPoint(x: rect.midX, y: rect.midY - labelNode.frame.height / 2.0)
Objective-C
-(void)adjustLabelFontSizeToFitRect:(SKLabelNode*)labelNode rect:(CGRect)rect
// Determine the font scaling factor that should let the label text fit in the given rectangle.
double scalingFactor = MIN(rect.size.width / labelNode.frame.size.width, rect.size.height / labelNode.frame.size.height);
// Change the fontSize.
labelNode.fontSize *= scalingFactor;
// Optionally move the SKLabelNode to the center of the rectangle.
labelNode.position = CGPointMake(CGRectGetMidX(rect), CGRectGetMidY(rect) - labelNode.frame.size.height / 2.0);
【讨论】:
请注意,您可能需要在标签节点和矩形之间添加额外的填充。MIN(rect.size.width / (labelNode.frame.size.width + PADDING), rect.size.height / (labelNode.frame.size.height + PADDING));
这在 2019 年对我不起作用,我的字体(带有表情符号的 Menlo-Bold!)fontSize 显然与占用的空间不成比例,但我已经为我的解决方案捏了这个 scalingFactor下面:)
Menlo 是固定宽度的字体。 2019年你试过比例字体了吗?【参考方案3】:
我已经为宽度写了这个,但是您可以将其调整为适合您的 CGRect 的高度。在示例中, pg 是一个 SKLabelNode,使用您正在使用的字体进行初始化。参数是您的字符串和目标宽度,结果是您要分配给 SKLabelNode 的大小。当然你也可以直接放你的SKLabelNode。如果尺寸太大,则最大尺寸为 50,但这是个人的。
func getTextSizeFromWidth(s:String, w:CGFloat)->CGFloat
var result:CGFloat = 0;
var fits:Bool = false
pg!.text=s
if(s != "")
while (!fits)
result++;
pg!.fontSize=result
fits = pg!.frame.size.width > w;
result -= 1.0
else
result=0;
return min(result, CGFloat(50))
编辑:实际上,我刚刚意识到我也写了这个:
extension SKLabelNode
func fitToWidth(maxWidth:CGFloat)
while frame.size.width >= maxWidth
fontSize-=1.0
func fitToHeight(maxHeight:CGFloat)
while frame.size.height >= maxHeight
fontSize-=1.0
【讨论】:
以上是关于如何设置 SKLabelNode 的字体大小以适应固定大小(Swift)的主要内容,如果未能解决你的问题,请参考以下文章
Windows Forms C# 应用程序 - 当用户为操作系统字体大小选择 125% 或 150% 时,设置表单控件的字体大小以适应屏幕?
如何在 Swift 中以编程方式调整 UIButton 中文本的字体大小以适应宽度?