Cómo establecer el tamaño de fuente de SKLabelNode para que quepa en tamaño fijo(Swift)
sprite-kit (2)
El tamaño del marco del SKLabelNode se puede comparar con el rectángulo dado. Si escala la fuente en proporción a los tamaños del rectángulo de la etiqueta y el rectángulo deseado, puede determinar el mejor tamaño de fuente para llenar el espacio tanto como sea posible. La última línea mueve convenientemente la etiqueta al centro del rectángulo. (Puede parecer fuera del centro si el texto es solo caracteres cortos como letras minúsculas o signos de puntuación).
Rápido
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)
}
C objetivo
-(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);
}
Tengo un cuadrado (200X200) con un SKLabelNode
en él. La etiqueta muestra la puntuación y es posible que llegue a un gran número. Quiero encajar el número en el cuadrado.
¿Cómo puedo cambiar el tamaño del texto (o el Tamaño) de un SKLabelNode
para adaptarlo a un tamaño fijo?
He escrito esto para el ancho, pero puedes adaptarlo a la altura para que se ajuste a tu CGRect. En el ejemplo, pg es un SKLabelNode inicializado con la fuente que está utilizando. Los argumentos son su cadena y el ancho del objetivo, y el resultado es el tamaño que desea asignar a su SKLabelNode. Por supuesto, también puede colocar directamente su SKLabelNode. Si el tamaño es demasiado grande, entonces el tamaño máximo es 50, pero eso es personal.
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))
}
Editar: De hecho, me di cuenta de que también había escrito esto:
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
}