web-dev-qa-db-ja.com

Swift-レイアウトの幅に合わせてfontSizeを調整する(プログラムで)

レイアウトボックスの幅に合わせてfontSizeを動的に調整するものを探していました。しかし、私が見つけることができるすべての答えは、これを使用することです:

label.adjustsFontSizeToFitWidth = true

動作します。ただし、setTranslatesAutoresizingMaskIntoConstraintsfalseに設定されていない場合のみ。

ストーリーボードは使用しないことに注意してください。したがって、他の制約を完全に制御するには、次の行が必要です。

label.setTranslatesAutoresizingMaskIntoConstraints(false)

したがって、ストーリーボードを使用せずにadjustsFontSizeToFitWidthを使用できない場合に、フォントサイズを幅に合わせて調整するにはどうすればよいですか。

フォントサイズを幅に合わせて調整する方法を見つけた後。また、フォントサイズに合わせてレイアウトボックスの高さを調整する必要があります。しかし、それについてのドキュメントがあるようですが、もしあなたがたまたまこの答えを知っているなら、それは大歓迎です。

前もって感謝します

30
MLyck

ラベルに対して次のコマンドを試してください。

label.adjustsFontSizeToFitWidth = true
label.minimumScaleFactor = 0.2

そして、ラベルの行を0と1に変更してみてください(両方のケースをチェックしてください):

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

MinimumScaleFactorの範囲は0〜1です。そのため、フォントサイズに関してMinimumScaleFactorを次のように設定しています。

目的C

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

Swift 3.

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

15
Vinu David Jose

これがあなたの質問に完全に答えるかどうかはわかりませんが、この拡張機能を使用して、適合する独自のフォントサイズを計算できます。

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
   }
}
4
SeanRobinson159

私はちょうどあなたが必要なことをしました、完璧に動作します! (プログラムのみ)-完璧なフォントサイズに再スケーリングするために、ラベルに大きなフォントサイズを設定しています。

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に実装します(レイアウトがレイアウトされた後)。

あなたの、ロイ

2
Roi Mulia

UITableViewCell内でUILabelを使用して同様の問題が発生し、セルの高さも動的に調整されていました(動的なセルの高さについてもっと知りたい場合はこれを参照してください: https://www.raywenderlich.com/129059/self-sizing-table-view-cells

そして、私が最小のフォントスケールで何をしたとしても、機能しませんでした。この機能を動作させるには、行区切りプロパティをTruncate TailまたはMiddleまたはHeadに設定する必要があります。 Word WrapまたはCharacter Wrapを使用している場合、UILabelフォントが動的に縮小されることはありません(タイトル2というカスタムフォントを作成しました)。

これが他の誰かがこれを理解しようとしているのを助けることを願っています。

UILabelプロパティのスクリーンショットを次に示します。

enter image description here

1
C0D3

ハックソリューションは次のとおりです。

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変換:

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