4

幅が制限されたラベルがあり、テキストが収まるようにフォント サイズを自動調整する必要があります。テキストに下線を引く必要があるため、属性付きの文字列をこのラベルに割り当てました。

[_commentsLabel setAttributedText:[[NSAttributedString alloc] initWithString:[NSString stringWithFormat:@"%d comments", [comments count]] attributes:@{NSUnderlineStyleAttributeName : @(NSUnderlineStyleSingle)}]];

ご覧のとおり、コメントの数によってテキストの長さが決まります。しかし、何らかの理由で、テキストは縮小されません。最小フォント スケールが 0.1 に設定され、文字間隔を狭くするがオンになっています。

私が使用しているカスタム フォントに関連している可能性があると思いましたが、システムの既定のフォントでもテキストが切り取られます。

4

3 に答える 3

5

ラベル プロパティを設定してみます

@property(nonatomic) BOOL adjustsFontSizeToFitWidth

YES にして、問題が解決するかどうかを確認します。そうでない場合はお知らせください。別の状況で問題が発生しましたが、コードを使用してサイズを手動で変更することになりました。

これは、フォントサイズを手動で変更するために使用したコードです。あなたの問題が何であるかはわかりませんが、これは私の問題の良い解決策になりました. ラベルのテキストを設定するときにこのメソッドを呼び出すだけで、フォント サイズを自分で設定できます。

    - (CGFloat)requiredFontSizeForLabel:(UILabel *)label
{
    if (!label) {
        return kFontSize;
    }
    CGFloat originalFontSize = kFontSize;

    UIFont* font = label.font;
    CGFloat fontSize = originalFontSize;

    BOOL found = NO;
    do
    {
        if( font.pointSize != fontSize )
        {
            font = [font fontWithSize: fontSize];
        }
        if([self wouldThisFont:font workForThisLabel:label])
        {
            found = YES;
            break;
        }

        fontSize -= 0.5;
        if( fontSize < (label.minimumScaleFactor * label.font.pointSize))
        {
            break;
        }

    } while( TRUE );

    return( fontSize );
}

    - (BOOL) wouldThisFont:(UIFont *)testFont workForThisLabel:(UILabel *)testLabel {
    NSDictionary *attributes = [NSDictionary dictionaryWithObjectsAndKeys:testFont, NSFontAttributeName, nil];
    NSAttributedString *as = [[NSAttributedString alloc] initWithString:testLabel.text attributes:attributes];
    CGRect bounds = [as boundingRectWithSize:CGSizeMake(CGRectGetWidth(testLabel.frame), CGFLOAT_MAX) options:(NSStringDrawingUsesLineFragmentOrigin) context:nil];
    BOOL itWorks = [self doesThisSize:bounds.size fitInThisSize:testLabel.bounds.size];
    return itWorks;
}

        - (BOOL)doesThisSize:(CGSize)aa fitInThisSize:(CGSize)bb 
    {
        if ( aa.width > bb.width ) return NO;
        if ( aa.height > bb.height ) return NO;
        return YES;
    }

コードのソースはこちら

于 2014-01-21T19:26:56.927 に答える
1

AttributeStrings には独自のフォント サイズがあります。これは手動で行います。

属性付き文字列を構成するすべての属性付き文字列には、NSFontAttributeName が必要です。

func updateLabelSizeIfNeeded() {
    let maxScale: CGFloat = 0.65
    let bounding = self.label.attributedText!.boundingRectWithSize(CGSizeMake(CGFloat.infinity, CGFloat.infinity), options: [], context: nil)
    if bounding.size.width > self.bounds.size.width*maxScale {
        let scaleFactor = (self.bounds.size.width * maxScale) / bounding.size.width

        label.transform = CGAffineTransformMakeScale(scaleFactor, scaleFactor)
    } else {
        label.transform = CGAffineTransformIdentity
    }
}
于 2016-01-28T19:52:31.410 に答える