レイアウトボックスの幅に合わせてfontSize
を動的に調整するものを探していました。しかし、私が見つけることができるすべての答えは、これを使用することです:
label.adjustsFontSizeToFitWidth = true
動作します。ただし、setTranslatesAutoresizingMaskIntoConstraints
がfalse
に設定されていない場合のみ。
ストーリーボードは使用しないことに注意してください。したがって、他の制約を完全に制御するには、次の行が必要です。
label.setTranslatesAutoresizingMaskIntoConstraints(false)
したがって、ストーリーボードを使用せずにadjustsFontSizeToFitWidth
を使用できない場合に、フォントサイズを幅に合わせて調整するにはどうすればよいですか。
フォントサイズを幅に合わせて調整する方法を見つけた後。また、フォントサイズに合わせてレイアウトボックスの高さを調整する必要があります。しかし、それについてのドキュメントがあるようですが、もしあなたがたまたまこの答えを知っているなら、それは大歓迎です。
前もって感謝します
ラベルに対して次のコマンドを試してください。
label.adjustsFontSizeToFitWidth = true
label.minimumScaleFactor = 0.2
そして、ラベルの行を0と1に変更してみてください(両方のケースをチェックしてください):
label.numberOfLines = 0 // or 1
MinimumScaleFactor
の範囲は0〜1です。そのため、フォントサイズに関してMinimumScaleFactor
を次のように設定しています。
目的C
[lb setMinimumScaleFactor:10.0/[UIFont labelFontSize]]; lb.adjustsFontSizeToFitWidth = YES;
Swift 3.
lb.minimumScaleFactor = 10/UIFont.labelFontSize lb.adjustsFontSizeToFitWidth = true
これがあなたの質問に完全に答えるかどうかはわかりませんが、この拡張機能を使用して、適合する独自のフォントサイズを計算できます。
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
}
}
私はちょうどあなたが必要なことをしました、完璧に動作します! (プログラムのみ)-完璧なフォントサイズに再スケーリングするために、ラベルに大きなフォントサイズを設定しています。
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
AutoLayoutを使用している場合は、このコードをviewDidLayoutSubviews
に実装します(レイアウトがレイアウトされた後)。
あなたの、ロイ
UITableViewCell内でUILabelを使用して同様の問題が発生し、セルの高さも動的に調整されていました(動的なセルの高さについてもっと知りたい場合はこれを参照してください: https://www.raywenderlich.com/129059/self-sizing-table-view-cells )
そして、私が最小のフォントスケールで何をしたとしても、機能しませんでした。この機能を動作させるには、行区切りプロパティをTruncate TailまたはMiddleまたはHeadに設定する必要があります。 Word WrapまたはCharacter Wrapを使用している場合、UILabelフォントが動的に縮小されることはありません(タイトル2というカスタムフォントを作成しました)。
これが他の誰かがこれを理解しようとしているのを助けることを願っています。
UILabelプロパティのスクリーンショットを次に示します。
ハックソリューションは次のとおりです。
var size: CGFloat = 20
while titleLabel.frame.width > containerView.frame.width {
titleLabel.font = UIFont.systemFont(ofSize: size)
titleLabel.sizeToFit()
size -= 1
}
上記のSwift 4変換:
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
}
}