web-dev-qa-db-fra.com

Swift - Ajustement de fontSize pour s’adapter à la largeur de la présentation (par programme)

Je cherchais quelque chose pour ajuster dynamiquement ma fontSize à la largeur de ma boîte de texte. Mais toutes les réponses que je peux trouver, sont soit d’utiliser ceci:

label.adjustsFontSizeToFitWidth = true

Ce qui fonctionne Mais uniquement si je n'ai pas défini setTranslatesAutoresizingMaskIntoConstraints sur false.

S'il vous plaît noter que je n'utilise pas de storyboards. Donc, pour avoir le plein contrôle de mes autres contraintes, j'ai besoin de cette ligne:

label.setTranslatesAutoresizingMaskIntoConstraints(false)

Alors, comment puis-je ajuster la taille de la police à la largeur sans utiliser de storyboard et quand je ne peux pas utiliser adjustsFontSizeToFitWidth.

Après avoir compris comment ajuster la taille de la police à la largeur. Je dois également ajuster la hauteur de la boîte de mise en page à la taille de la police. Il semble cependant y avoir de la documentation à ce sujet, mais si vous en connaissiez la réponse également, ce serait grandement apprécié.

Merci d'avance

28
MLyck

Essayez les commandes suivantes pour votre étiquette: 

label.adjustsFontSizeToFitWidth = true
label.minimumScaleFactor = 0.2

Et essayez de changer les lignes de l'étiquette en 0 et 1 (cochez les deux cas):

label.numberOfLines = 0 // or 1
41
Roi Mulia

MinimumScaleFactor est compris entre 0 et 1. Nous définissons donc MinimumScaleFactor en fonction de la taille de la police, comme suit

Objectif c  

[lb setMinimumScaleFactor:10.0/[UIFont labelFontSize]]; lb.adjustsFontSizeToFitWidth = YES;

Swift 3.0

lb.minimumScaleFactor = 10/UIFont.labelFontSize lb.adjustsFontSizeToFitWidth = true

10
Vinu David Jose

Je ne sais pas si cela répondra complètement à votre question, mais vous pouvez utiliser cette extension pour calculer vos propres tailles de police.

extension String {
   func height(constrainedBy width: CGFloat, with font: UIFont) -> CGFloat {
       let constraintSize = CGSize(width: width, height: .max)
       let boundingBox = self.boundingRectWithSize(constraintSize, options: .UsesLineFragmentOrigin, attributes: [NSFontAttributeName: font], context: nil)

       return boundingBox.height
   }

   func width(constrainedBy height: CGFloat, with font: UIFont) -> CGFloat {
       let constrainedSize = CGSize(width: .max, height: height)
       let boundingBox = self.boundingRectWithSize(constrainedSize, options: .UsesLineFragmentOrigin, attributes: [NSFontAttributeName: font], context: nil)

       return boundingBox.width
   }
}
3
SeanRobinson159

Je viens de faire que tu avais besoin, fonctionne parfaitement! (Par programme UNIQUEMENT) - Nous définissons une grande taille de police pour l’étiquette, afin de la redimensionner à la taille parfaite.

self.label.font = UIFont(name: "Heiti TC", size: 60)
self.label.numberOfLines = 0
self.label.minimumScaleFactor = 0.1
self.label.baselineAdjustment = .alignCenters
self.label.textAlignment  = .center

Si vous utilisez AutoLayout, implémentez ce code dans viewDidLayoutSubviews (après la présentation de la présentation).

Bien à vous, Roi

2
Roi Mulia

J'avais un problème similaire en utilisant un UILabel dans un UITableViewCell et mes cellules ajustaient aussi leurs hauteurs de façon dynamique (référez-vous à cela si vous voulez en savoir plus sur les hauteurs de cellules dynamiques: https://www.raywenderlich.com/129059/self -sizing-table-view-cells )

Et peu importe ce que j'ai fait pour la police minimale, cela ne fonctionnait pas. Il s'avère que pour que cette fonctionnalité fonctionne, vous devez également définir la propriété Saut de ligne sur Truncate Tail ou Middle ou Head. Si vous utilisez Word Wrap ou Character Wrap, votre police UILabel ne sera pas réduite de façon dynamique (une police personnalisée nommée: Title 2) a été créée.

J'espère que cela aidera quelqu'un d'autre à essayer de comprendre cela.

Voici une capture d'écran de mes propriétés UILabel:

 enter image description here

0
c1pherB1t

Voici une solution de hack:

var size: CGFloat = 20

    while titleLabel.frame.width > containerView.frame.width {

        titleLabel.font = UIFont.systemFont(ofSize: size)
        titleLabel.sizeToFit()
        size -= 1

    }
0
AthleteInAction

Swift 4 conversion de ce qui précède:

extension String
{
    func height(constrainedBy width: CGFloat, with font: UIFont) -> CGFloat
    {
        let constraintSize = CGSize(width: width, height: .greatestFiniteMagnitude)
        let boundingBox = self.boundingRect(with: constraintSize, options: .usesLineFragmentOrigin, attributes: [NSAttributedStringKey.font: font], context: nil)

        return boundingBox.height
    }

    func width(constrainedBy height: CGFloat, with font: UIFont) -> CGFloat
    {
        let constrainedSize = CGSize(width: .greatestFiniteMagnitude, height: height)
        let boundingBox = self.boundingRect(with: constrainedSize, options: .usesLineFragmentOrigin, attributes: [NSAttributedStringKey.font: font], context: nil)

        return boundingBox.width
    }
}
0
Larry Seyer