19

標準の UILabel を使用して、垂直方向のスペースを埋めるようにフォント サイズを大きくしたいと考えています。この質問に対する受け入れられた回答からインスピレーションを得て、この drawRect 実装で UILabel のサブクラスを定義しました。

- (void)drawRect:(CGRect)rect
{
    // Size required to render string
    CGSize size = [self.text sizeWithFont:self.font];

    // For current font point size, calculate points per pixel
    float pointsPerPixel = size.height / self.font.pointSize;

    // Scale up point size for the height of the label
    float desiredPointSize = rect.size.height * pointsPerPixel;

    // Create and assign new UIFont with desired point Size
    UIFont *newFont = [UIFont fontWithName:self.font.fontName size:desiredPointSize];
    self.font = newFont;

    // Call super
    [super drawRect:rect];
}

ただし、ラベルの下部を超えてフォントをスケーリングするため、これは機能しません。これを複製したい場合は、289x122 (wxh) のラベル、フォントとして Helvetica、ラベルに快適に収まる 60 の開始点サイズから始めました。標準 UILabel と文字列 "{Hg" を使用したサブクラスからの出力例を次に示します。

uilabel

uilabel サブクラス

私はフォントのディセンダーとアセンダーを調べ、これらを考慮してさまざまな組み合わせでスケーリングを試みましたが、まだ運がありませんでした。これは、さまざまなディセンダーとアセンダーの長さを持つさまざまなフォントと関係がありますか?

4

2 に答える 2

13

あなたの計算pointsPerPixelは間違っています。それは...

float pointsPerPixel =  self.font.pointSize / size.height;

layoutSubviewsまた、フォントを変更する必要があるのはフレームサイズが変更されたときだけであるため、このコードを含める必要があります。

于 2012-12-02T17:43:46.510 に答える
0

次の大きなフォントサイズまでインチングする丸め誤差なのだろうか。rec.size.height を少し拡大していただけませんか?何かのようなもの:

float desiredPointSize = rect.size.height *.90 * pointsPerPixel;

更新: pointPerPixel の計算は逆です。実際には、ピクセルによるポイントではなく、フォント ポイントでピクセルを分割しています。それらを交換すると、毎回機能します。完全を期すために、私がテストしたサンプルコードを次に示します。

//text to render    
NSString *soString = [NSString stringWithFormat:@"{Hg"];
UIFont *soFont = [UIFont fontWithName:@"Helvetica" size:12];

//box to render in
CGRect rect = soLabel.frame;

//calculate number of pixels used vertically for a given point size. 
//We assume that pixel-to-point ratio remains constant.
CGSize size = [soString sizeWithFont:soFont];
float pointsPerPixel;
pointsPerPixel = soFont.pointSize / size.height;   //this calc works
//pointsPerPixel = size.height / soFont.pointSize; //this calc does not work

//now calc which fontsize fits in the label
float desiredPointSize = rect.size.height * pointsPerPixel;
UIFont *newFont = [UIFont fontWithName:@"Helvetica" size:desiredPointSize];

//and update the display
[soLabel setFont:newFont];
soLabel.text = soString;

これは、40pt から 60pt のフォントの範囲で、テストしたすべてのサイズのラベル ボックス内にスケーリングされて収まりました。計算を逆にすると、フォントがボックスに対して高すぎるという同じ結果が得られました。

于 2012-12-02T08:13:56.867 に答える