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