1

のフレームを拡張できず、複数行のメソッドであるため、特定CGSizeの が機能しません。UILabelUILabelUILabels adjustsFontSizeToFitWidth

だから私は次のような関数を作成する必要があると考えました;

- (CGFloat)fontSizeWithText:(NSString*)text andFont:(UIFont*)font constrainedSize:(CGSize)size LBM:(UILineBreakMode)LBM
{
    // check if text fits to label
    CGSize labelSize = [text sizeWithFont:font constrainedToSize:CGSizeMake(size.width, 9999) lineBreakMode:LBM];

    // if not, decrease font size until it fits to the given size
    while (labelSize.height > size.height) {
        font = [UIFont fontWithName:font.fontName size:font.pointSize - 0.5];
        labelSize = [text sizeWithFont:font constrainedToSize:CGSizeMake(size.width, 9999) lineBreakMode:LBM];
    }

    return font.pointSize;
}

使用法:

// fit detail label by arranging font's size
    CGFloat fontSize = [self fontSizeWithText:self.titleLabel.text andFont:self.titleLabel.font constrainedSize:self.titleLabel.frame.size LBM:self.titleLabel.lineBreakMode];
    self.titleLabel.font = [UIFont fontWithName:self.titleLabel.font.fontName size:fontSize];

しかし、この方法では、一部のテキストが UILabel のフレームに収まらず、切り捨てられることがわかります。私が見逃しているものがあるに違いありません。「特定の複数行のUILabelに特定のフォントのテキストを合わせる」ことを解決するためのコードまたはその他の提案の助けは素晴らしいでしょう。

4

1 に答える 1

6

まず、問題全体を簡単に見てみましょう。テキストを事前定義されたフレームに合わせて、フォントサイズを調整しようとしています。これは通常、ひどくうまく機能しません。網膜ディスプレイであっても、サイズが小さすぎて読み取れないためです。余分なテキストに対応できるようにラベルのフレームを調整する必要があります(可能な場合。場合によっては、切り捨てが唯一のオプションです)。

さて、それは邪魔にならないので、フォントサイズの調整を見てみましょう。推奨はしていませんが、それでも最善の方法を説明します。

重要なのは、このコードはテストされておらず、おそらくいくつかの調整が必要になるでしょうが、それは読者の練習になる可能性があります。

したがって、最初に知っておく必要があるのは、1本の線の高さです。これで、ラベルの高さと表示できる行数がわかったので、ラベルの高さを行数で割るだけでこれを判断できます。

CGFloat optimalLineHeight = CGRectGetHeight(label.frame) / label.numberOfLines;

これにより、実際に必要な高さよりも高い行が返される場合があることに気付いたかもしれません。これに対処するために、追加のチェックと制約を実装できるようになります。ただし、現時点では、フォントサイズは縮小するだけでなく、拡大することもできます。

さて、最適な線の高さを取得することは話の一部にすぎません。次に、フォントサイズを最適化する必要があります。ここにいくつかのコードがあります:

CGFloat optimumFontSize = 0.0;
BOOL optimumFontSizeFound = NO;
do {
    CGSize charSize = [@"M" sizeWithFont:[UIFont systemFontOfSize:optimumFontSize]
                       constrainedToSize:CGSizeMake(100, 9999)
                           lineBreakMode:0];
    if ( CGSizeGetHeight(charSize) > optimalLineHeight ) {
        optimumFontSizeFound = YES;
    }
    else {
        optimumFontSize++;
    }
} while ( !optimumFontSizeFound );

では、これは何をするのでしょうか?これでは、これまでのところoptimalFontSizeを追跡しています。フォントサイズを0と仮定して開始し、そのフォントサイズを使用する1文字の高さを確認します。その高さが以前に計算された最適な線の高さよりも大きい場合は、前の高さが最適な高さです。そうでない場合は、サイズを大きくして、最適なものが見つかるまで繰り返します。

すべての状況で完全に機能させるには、これで克服しなければならない問題がまだたくさんあります。これにより、文字の垂直方向のクリッピングが表示されないようにする必要がありますが、すべてのテキストコンテンツがフレームに表示されることを保証することはできません。そのためには、必要な行数を決定する方法をより賢くする必要がありますが、これも読者の練習として残しておきます。

これがあなたの目標に向かってあなたを助けることを願っています。

于 2013-02-10T14:17:22.157 に答える