wake-up-neo.net

Swift - Anpassung von fontSize an die Breite des Layouts (programmgesteuert)

Ich habe nach etwas gesucht, um meine fontSize dynamisch an die Breite meiner Layoutbox anzupassen. Aber alle Antworten, die ich finden kann, ist entweder diese zu verwenden:

label.adjustsFontSizeToFitWidth = true

Was funktioniert Aber nur wenn ich setTranslatesAutoresizingMaskIntoConstraints nicht auf false eingestellt habe.

Bitte beachten Sie, dass ich keine Storyboards verwende. Um meine anderen Einschränkungen voll unter Kontrolle zu haben, brauche ich diese Zeile:

label.setTranslatesAutoresizingMaskIntoConstraints(false)

Wie kann ich also die Schriftgröße an die Breite anpassen, ohne das Storyboard zu verwenden, und wenn ich adjustsFontSizeToFitWidth nicht verwenden kann.

Nachdem ich herausgefunden habe, wie ich die Schriftgröße an die Breite anpassen kann. Ich muss auch die Höhe der Layoutbox an die Schriftgröße anpassen. Es scheint zwar eine Dokumentation dazu zu geben, aber wenn Sie auch die Antwort darauf kennen, wäre dies sehr dankbar.

Danke im Voraus

28
MLyck

Versuchen Sie die folgenden Befehle für Ihr Label: 

label.adjustsFontSizeToFitWidth = true
label.minimumScaleFactor = 0.2

Und versuchen Sie, die Zeilen der Beschriftung in 0 und 1 zu ändern (beide Fälle überprüfen):

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

MinimumScaleFactor Bereich ist 0 bis 1. Daher setzen wir die MinimumScaleFactor in Bezug auf unsere Schriftgröße wie folgt

Ziel 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

Ich weiß nicht, ob Ihre Frage damit vollständig beantwortet wird, aber Sie können mit dieser Erweiterung Ihre eigenen Schriftgrößen berechnen.

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

Ich habe einfach das getan, was du brauchst, funktioniert perfekt! (Programmatisch NUR) - Wir setzen der Beschriftung eine große Schriftgröße, um sie auf die perfekte Schriftgröße zu skalieren.

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

Wenn Sie AutoLayout verwenden, implementieren Sie diesen Code in viewDidLayoutSubviews (nachdem das Layout angelegt wurde).

Dein Roi

2
Roi Mulia

Ich hatte ein ähnliches Problem bei der Verwendung eines UILabels in einer UITableViewCell, und auch die Höhen meiner Zellen wurden dynamisch angepasst (wenn Sie mehr über dynamische Zellhöhen erfahren möchten: https://www.raywenderlich.com/129059/self -sizing-table-view-cells )

Und egal was ich für die minimale Schriftgröße tat, es funktionierte nicht. Es stellt sich heraus, dass für diese Funktion auch die Zeilenumbrücheigenschaft auf Tail oder Mittlerer Kopf oder Kopf abschneiden muss. Wenn Sie einen Zeilenumbruch oder einen Zeichenumbruch haben, wird der UILabel-Zeichensatz nicht dynamisch herabgesetzt (ich hatte einen benutzerdefinierten Zeichensatz namens Titel 2).

Ich hoffe, das hilft jemandem, der versucht, das herauszufinden.

Hier ist ein Screenshot meiner UILabel-Eigenschaften:

 enter image description here

0
c1pherB1t

Hier ist eine Hacklösung:

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 Konvertierung von oben:

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