web-dev-qa-db-fra.com

Comment définir la taille de police de SKLabelNode pour qu'elle s'adapte à une taille fixe (Swift)

J'ai un carré (200X200) avec une SKLabelNode dedans. L'étiquette indique le score et il peut être atteint par un grand nombre. Je veux correspondre au nombre dans le carré.

Comment puis-je changer la taille du texte (ou la taille) d'une SKLabelNode pour l'adapter à une taille fixe.

19
nmokkary

La taille du cadre de SKLabelNode peut être comparée au rectangle donné. Si vous redimensionnez la police proportionnellement à la taille du rectangle de l'étiquette et du rectangle souhaité, vous pouvez déterminer la taille de police la mieux adaptée pour remplir l'espace autant que possible. La dernière ligne déplace commodément l'étiquette au centre du rectangle. (Cela peut sembler décentré si le texte ne contient que des caractères courts tels que des lettres minuscules ou des signes de ponctuation.)

Rapide

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)
}

Objectif 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);
}
30
mike663

J'ai écrit ceci pour la largeur, mais vous pouvez l'adapter à la hauteur pour l'adapter à votre CGRect. Dans cet exemple, pg est un SKLabelNode initialisé avec la police que vous utilisez. Les arguments sont votre chaîne et la largeur cible. Le résultat est la taille que vous souhaitez attribuer à votre SKLabelNode. Bien sûr, vous pouvez aussi mettre directement votre SKLabelNode. Si la taille est trop grande, la taille maximale est de 50, mais c'est personnel.

 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))
}

Edit: En fait, je viens de me rendre compte que j'avais aussi écrit ceci:

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
    }
1
Myoch