3

drawRectを呼び出して、テキスト表示に使用していますNSStringsizeWithFontデフォルトのフォントサイズ17でフォントの自動サイズ変更(縮小)を使用し、幅のサイズに合わない場合はループを使用してフォントサイズを1縮小することを実装しようとしています。誰でもこれを実装する方法を教えてもらえますか? フォントサイズを17.0に設定しただけの今の例はいいでしょう

[[self.string displayName] drawAtPoint:CGPointMake(xcoord, ycoord) withFont:[UIFont boldSystemFontOfSize:17.0]];
CGSize size = [[self.patient displayName] sizeWithFont:[UIFont boldSystemFontOfSize:17.0]];
max_current_y = size.height > max_current_y ? size.height : max_current_y;
xcoord = xcoord + 3.0f + size.width;
4

7 に答える 7

12

分かった、気にしないで。フォントを返す NSString を受け取る同じメソッドの修正版を次に示します。

    -(UIFont*)getFontForString:(NSString*)string
               toFitInRect:(CGRect)rect
                  seedFont:(UIFont*)seedFont{
    UIFont* returnFont = seedFont;
    CGSize stringSize = [string sizeWithAttributes:@{NSFontAttributeName : seedFont}];

    while(stringSize.width > rect.size.width){
        returnFont = [UIFont systemFontOfSize:returnFont.pointSize -1];
        stringSize = [string sizeWithAttributes:@{NSFontAttributeName : returnFont}];
    }

    return returnFont;
}

これを呼び出す方法は次のとおりです。

NSString* stringToDraw = @"Test 123";

    CGRect rect = CGRectMake(100., 100., 100., 200.);
    UIFont* font = [self getFontForString:stringToDraw toFitInRect:rect seedFont:[UIFont systemFontOfSize:20]];
    [stringToDraw drawInRect:rect withFont:font];

コードはiOS7+用です

于 2013-02-11T21:01:32.273 に答える
9

ステップ 1.0 でフォント サイズを試すと、非常に遅くなる場合があります。2 つの異なるサイズに対して 2 つの測定値を作成し、線形近似を使用して正しいサイズに非常に近いサイズを推測することで、アルゴリズムを大幅に改善できます。

十分に近くないことが判明した場合は、前の 2 つのサイズのいずれかではなく、推測されたサイズを使用して、十分なサイズになるか変化が止まるまで計算を繰り返します。

// any values will do, prefer those near expected min and max
CGFloat size1 = 12.0, size2 = 56.0; 
CGFloat width1 = measure_for_size(size1);
CGFloat width2 = measure_for_size(size2);

while (1) {
    CGFloat guessed_size = size1 + (required_width - width1) * (size2 - size1) / (width2 - width1);

    width2 = measure_for_size(guessed_size);
    if ( fabs(guessed_size-size2) < some_epsilon || !is_close_enough(width2, required_width) ) {
        size2 = guessed_size;
        continue;
    }
    // round down to integer and clamp guessed_size as appropriate for your design
    return floor(clamp(guessed_size, 6.0, 24.0));
}

is_close_enough()実装は完全にあなた次第です。テキストの幅がフォント サイズにほぼ比例して大きくなることを考えると、単純にドロップして 2 ~ 4 回の繰り返しで十分です。

于 2013-02-11T18:53:04.240 に答える
1

元の投稿者は、彼が作業しているプラ​​ットフォームを指定していませんでしたが、Mavericks の OSX 開発者にsizeWithFont:は存在せず、次のものを使用する必要がありますsizeWithAttributes

NSSize newSize = [aString sizeWithAttributes:
[NSDictionary dictionaryWithObjectsAndKeys:
           [NSFont fontWithName:@"Arial Rounded MT Bold" size:53.0],NSFontAttributeName,nil
]];
于 2013-11-25T21:53:59.017 に答える
0

四角形に収まるフォントを返すメソッドは次のとおりです。

-(UIFont*)getFontToFitInRect:(CGRect)rect seedFont:(UIFont*)seedFont{
    UIFont* returnFont = seedFont;
    CGSize stringSize = [self sizeWithFont:returnFont];

    while(stringSize.width > rect.size.width){
        returnFont = [UIFont systemFontOfSize:returnFont.pointSize -1];
        stringSize = [self sizeWithFont:returnFont];
    }

    return returnFont;
}

このメソッドを NSString カテゴリに追加できます。カテゴリを追加する方法の詳細については、http: //developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/ProgrammingWithObjectiveC/CustomizingExistingClasses/CustomizingExistingClasses.html#//apple_ref/doc/uid/TP40011210を参照してください。 -CH6-SW2

カテゴリを作成したくない場合は、このメソッドをユーティリティ クラスの 1 つに追加し、フォントを取得する文字列を渡すことができます。

于 2013-02-11T19:02:48.523 に答える
0

@ puru020 と @ jowie の回答に触発された別の方法を次に示します。それが誰かを助けることを願っています

-(UIFont *) adjustedFontSizeForString:(NSString *)string forWidth:(float)originalWidth forFont:(UIFont *)font
{
    CGSize stringSize = [string sizeWithFont:font];
    if(stringSize.width <= originalWidth)
    {
        return font;
    }
    float ratio = originalWidth / stringSize.width;
    float fontSize = font.pointSize * ratio;
    return [font fontWithSize:fontSize];
}
于 2015-01-07T07:28:11.907 に答える
0

@puru020 のソリューションを少し変更し、属性のサポートを追加し、少し改善しました。

注:メソッドは NSString カテゴリでラップする必要があります

- (UIFont*)requiredFontToFitInSize:(CGSize)size seedFont:(UIFont*)seedFont attributes:(NSDictionary*)attributes{
   UIFont *returnFont = [UIFont systemFontOfSize:seedFont.pointSize +1];
   NSMutableDictionary *mutableAttributes = attributes.mutableCopy;
   CGSize stringSize;

   do {
    returnFont = [UIFont systemFontOfSize:returnFont.pointSize -1];
    [mutableAttributes setObject:returnFont forKey:NSFontAttributeName];
    stringSize = [self sizeWithAttributes:mutableAttributes];
   } while (stringSize.width > size.width);

   return returnFont;
}
于 2015-11-17T12:31:16.990 に答える