Helpex - Trao đổi & giúp đỡ Đăng nhập
194

Tôi hiện có một UILabel:

factLabel = [[UILabel alloc] initWithFrame:CGRectMake(20, 100, 280, 100)];
factLabel.text = @"some text some text some text some text";
factLabel.backgroundColor = [UIColor clearColor];
factLabel.lineBreakMode = UILineBreakModeWordWrap;
factLabel.numberOfLines = 10;
[self.view addSubview:factLabel];

Trong suốt vòng đời của ứng dụng iOS của tôi, factLabelnhận được một loạt các giá trị khác nhau. Một số có nhiều câu, một số khác chỉ có 5 hoặc 6 từ.

Làm cách nào để thiết lập UILabelkích thước phông chữ thay đổi để văn bản luôn phù hợp với giới hạn mà tôi đã xác định?

194 hữu ích 1 bình luận 240k xem chia sẻ
12 trả lời 12
383

Dòng đơn:

factLabel.numberOfLines = 1;
factLabel.minimumFontSize = 8;
factLabel.adjustsFontSizeToFitWidth = YES;

Đoạn mã trên sẽ điều chỉnh kích thước phông chữ của văn bản của bạn xuống (ví dụ) 8cố gắng vừa với văn bản của bạn trong nhãn. numberOfLines = 1là bắt buộc.

Nhiều dòng:

numberOfLines > 1có một phương pháp để tìm ra kích thước của văn bản cuối cùng thông qua kích thước của NSString's sizeWithFont: ... Các phương pháp bổ sung UIKit , ví dụ:

CGSize lLabelSize = [yourText sizeWithFont:factLabel.font
                                  forWidth:factLabel.frame.size.width
                             lineBreakMode:factLabel.lineBreakMode];

Sau đó, bạn chỉ có thể thay đổi kích thước nhãn của mình bằng cách sử dụng kết quả lLabelSize, chẳng hạn (giả sử rằng bạn sẽ chỉ thay đổi chiều cao của nhãn):

factLabel.frame = CGRectMake(factLabel.frame.origin.x, factLabel.frame.origin.y, factLabel.frame.size.width, lLabelSize.height);

hệ điều hanh 6

Dòng đơn:

Bắt đầu với iOS6, minimumFontSizeđã không được dùng nữa. Dòng

factLabel.minimumFontSize = 8.;

có thể được thay đổi thành:

factLabel.minimumScaleFactor = 8./factLabel.font.pointSize;

IOS 7

Nhiều dòng:

Bắt đầu với iOS7, sizeWithFontkhông được dùng nữa. Trường hợp nhiều dòng được giảm xuống:

factLabel.numberOfLines = 0;
factLabel.lineBreakMode = NSLineBreakByWordWrapping;
CGSize maximumLabelSize = CGSizeMake(factLabel.frame.size.width, CGFLOAT_MAX);
CGSize expectSize = [factLabel sizeThatFits:maximumLabelSize];
factLabel.frame = CGRectMake(factLabel.frame.origin.x, factLabel.frame.origin.y, expectSize.width, expectSize.height);

iOS 13 (Swift 5):

label.adjustsFontSizeToFitWidth = true
label.minimumScaleFactor = 0.5
383 hữu ích 5 bình luận chia sẻ
73

minimumFontSizeđã không được dùng nữa với iOS 6. Bạn có thể sử dụng minimumScaleFactor.

yourLabel.adjustsFontSizeToFitWidth=YES;
yourLabel.minimumScaleFactor=0.5;

Điều này sẽ quan tâm đến kích thước phông chữ của bạn theo chiều rộng của nhãn và văn bản.

73 hữu ích 2 bình luận chia sẻ
26

Dòng đơn - Có hai cách, bạn có thể thay đổi một cách đơn giản.

1- Thực dụng (Swift 3)

Chỉ cần thêm mã sau

    yourLabel.numberOfLines = 1;
    yourLabel.minimumScaleFactor = 0.7;
    yourLabel.adjustsFontSizeToFitWidth = true;

2 - Sử dụng trình kiểm tra Thuộc tính UILabel

i- Select your label- Set number of lines 1.
ii- Autoshrink-  Select Minimum Font Scale from drop down
iii- Set Minimum Font Scale value as you wish , I have set 0.7 as in below image. (default is 0.5)

Tự động thay đổi kích thước phông chữ của UILabel

26 hữu ích 1 bình luận chia sẻ
24

Dựa trên câu trả lời của @Eyal Ben Dov, bạn có thể muốn tạo một danh mục để làm cho nó linh hoạt khi sử dụng trong các ứng dụng khác của bạn.

Ám ảnh: Tôi đã cập nhật mã của anh ấy để tương thích với iOS 7

-Tập tin tiêu đề

#import <UIKit/UIKit.h>

@interface UILabel (DynamicFontSize)

-(void) adjustFontSizeToFillItsContents;

@end

-Tệp thực hiện

#import "UILabel+DynamicFontSize.h"

@implementation UILabel (DynamicFontSize)

#define CATEGORY_DYNAMIC_FONT_SIZE_MAXIMUM_VALUE 35
#define CATEGORY_DYNAMIC_FONT_SIZE_MINIMUM_VALUE 3

-(void) adjustFontSizeToFillItsContents
{
    NSString* text = self.text;

    for (int i = CATEGORY_DYNAMIC_FONT_SIZE_MAXIMUM_VALUE; i>CATEGORY_DYNAMIC_FONT_SIZE_MINIMUM_VALUE; i--) {

        UIFont *font = [UIFont fontWithName:self.font.fontName size:(CGFloat)i];
        NSAttributedString *attributedText = [[NSAttributedString alloc] initWithString:text attributes:@{NSFontAttributeName: font}];

        CGRect rectSize = [attributedText boundingRectWithSize:CGSizeMake(self.frame.size.width, CGFLOAT_MAX) options:NSStringDrawingUsesLineFragmentOrigin context:nil];

        if (rectSize.size.height <= self.frame.size.height) {
            self.font = [UIFont fontWithName:self.font.fontName size:(CGFloat)i];
            break;
        }
    }

}

@end

-Sử dụng

#import "UILabel+DynamicFontSize.h"

[myUILabel adjustFontSizeToFillItsContents];

Chúc mừng

24 hữu ích 5 bình luận chia sẻ
23

Đó là năm 2015. Tôi đã phải đi tìm một bài đăng trên blog sẽ giải thích cách thực hiện điều đó cho phiên bản iOS và XCode mới nhất với Swift để nó hoạt động với nhiều dòng.

  1. đặt “Autoshrink” thành “Kích thước phông chữ tối thiểu”.
  2. đặt phông chữ thành kích thước phông chữ mong muốn lớn nhất (tôi đã chọn 20)
  3. Thay đổi “Ngắt dòng” từ “Word Wrap” thành “Cắt cụt đuôi”.

Nguồn: http://beckyhansmeyer.com/2015/04/09/autoshrinking-text-in-a-multiline-uilabel/

23 hữu ích 1 bình luận chia sẻ
15

Phiên bản Swift:

textLabel.adjustsFontSizeToFitWidth = true
textLabel.minimumScaleFactor = 0.5
15 hữu ích 1 bình luận chia sẻ
7

Đây là một tiện ích mở rộng Swift cho UILabel. Nó chạy một thuật toán tìm kiếm nhị phân để thay đổi kích thước phông chữ dựa trên chiều rộng và chiều cao của các giới hạn của nhãn. Đã thử nghiệm hoạt động với iOS 9 và tự động thanh toán.

SỬ DỤNG: ở đâu <label>là được xác định trước UILabel của bạn cần thay đổi kích thước phông chữ

<label>.fitFontForSize()

Theo Mặc định, chức năng này tìm kiếm trong phạm vi kích thước phông chữ 5pt và 300pt và đặt phông chữ để phù hợp với văn bản của nó một cách "hoàn hảo" trong giới hạn (chính xác trong vòng 1,0pt). Bạn có thể xác định các tham số để nó, ví dụ, tìm kiếm giữa 1ptkích thước phông chữ hiện tại của nhãn một cách chính xác trong vòng 0,1 điểm theo cách sau:

<label>.fitFontForSize(1.0, maxFontSize: <label>.font.pointSize, accuracy:0.1)

Sao chép / Dán mã sau vào tệp của bạn

extension UILabel {

    func fitFontForSize(var minFontSize : CGFloat = 5.0, var maxFontSize : CGFloat = 300.0, accuracy : CGFloat = 1.0) {
        assert(maxFontSize > minFontSize)
        layoutIfNeeded() // Can be removed at your own discretion
        let constrainedSize = bounds.size
        while maxFontSize - minFontSize > accuracy {
            let midFontSize : CGFloat = ((minFontSize + maxFontSize) / 2)
            font = font.fontWithSize(midFontSize)
            sizeToFit()
            let checkSize : CGSize = bounds.size
            if  checkSize.height < constrainedSize.height && checkSize.width < constrainedSize.width {
                minFontSize = midFontSize
            } else {
                maxFontSize = midFontSize
            }
        }
        font = font.fontWithSize(minFontSize)
        sizeToFit()
        layoutIfNeeded() // Can be removed at your own discretion
    }

}

LƯU Ý: Mỗi layoutIfNeeded()cuộc gọi có thể được gỡ bỏ theo quyết định của riêng bạn

7 hữu ích 1 bình luận chia sẻ
4

Nó hơi không phức tạp nhưng điều này sẽ hoạt động, ví dụ: giả sử bạn muốn giới hạn nhãn uilabel của mình thành 120x120, với kích thước phông chữ tối đa là 28:

magicLabel.numberOfLines = 0;
magicLabel.lineBreakMode = NSLineBreakByWordWrapping;
...
magicLabel.text = text;
    for (int i = 28; i>3; i--) {
        CGSize size = [text sizeWithFont:[UIFont systemFontOfSize:(CGFloat)i] constrainedToSize:CGSizeMake(120.0f, CGFLOAT_MAX) lineBreakMode:NSLineBreakByWordWrapping];
        if (size.height < 120) {
            magicLabel.font = [UIFont systemFontOfSize:(CGFloat)i];
            break;
        }
    }
4 hữu ích 2 bình luận chia sẻ
2

Chỉ cần gửi tin nhắn sizeToFit đến UITextView. Nó sẽ tự điều chỉnh chiều cao để vừa với văn bản của nó. Nó sẽ không thay đổi chiều rộng hoặc điểm gốc của chính nó.

[textViewA1 sizeToFit];
2 hữu ích 1 bình luận chia sẻ
0

Phiên bản Swift 2.0:

private func adapteSizeLabel(label: UILabel, sizeMax: CGFloat) {
     label.numberOfLines = 0
     label.lineBreakMode = NSLineBreakMode.ByWordWrapping
     let maximumLabelSize = CGSizeMake(label.frame.size.width, sizeMax);
     let expectSize = label.sizeThatFits(maximumLabelSize)
     label.frame = CGRectMake(label.frame.origin.x, label.frame.origin.y, expectSize.width, expectSize.height)
}
0 hữu ích 0 bình luận chia sẻ
0

Giải pháp này hoạt động cho đa dòng:

Sau khi theo dõi một số bài báo và yêu cầu một chức năng tự động chia tỷ lệ văn bản và điều chỉnh số dòng để vừa với kích thước nhãn nhất định, tôi đã tự viết một hàm. (ví dụ: một chuỗi ngắn sẽ vừa khít trên một dòng và sử dụng một lượng lớn khung nhãn, trong khi một chuỗi dài sẽ tự động chia thành 2 hoặc 3 dòng và điều chỉnh kích thước cho phù hợp)

Hãy sử dụng lại nó và chỉnh sửa theo yêu cầu. Đảm bảo rằng bạn gọi nó sau khi viewDidLayoutSubviewsđã hoàn tất để khung nhãn ban đầu đã được thiết lập.

+ (void)setFontForLabel:(UILabel *)label withMaximumFontSize:(float)maxFontSize andMaximumLines:(int)maxLines {
    int numLines = 1;
    float fontSize = maxFontSize;
    CGSize textSize; // The size of the text
    CGSize frameSize; // The size of the frame of the label
    CGSize unrestrictedFrameSize; // The size the text would be if it were not restricted by the label height
    CGRect originalLabelFrame = label.frame;

    frameSize = label.frame.size;
    textSize = [label.text sizeWithAttributes:@{NSFontAttributeName:[UIFont systemFontOfSize: fontSize]}];

    // Work out the number of lines that will need to fit the text in snug
    while (((textSize.width / numLines) / (textSize.height * numLines) > frameSize.width / frameSize.height) && (numLines < maxLines)) {
        numLines++;
    }

    label.numberOfLines = numLines;

    // Get the current text size
    label.font = [UIFont systemFontOfSize:fontSize];
    textSize = [label.text boundingRectWithSize:CGSizeMake(frameSize.width, CGFLOAT_MAX)
                                        options:(NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading)
                                     attributes:@{NSFontAttributeName : label.font}
                                        context:nil].size;

    // Adjust the frame size so that it can fit text on more lines
    // so that we do not end up with truncated text
    label.frame = CGRectMake(label.frame.origin.x, label.frame.origin.y, label.frame.size.width, label.frame.size.width);

    // Get the size of the text as it would fit into the extended label size
    unrestrictedFrameSize = [label textRectForBounds:CGRectMake(0, 0, label.bounds.size.width, CGFLOAT_MAX) limitedToNumberOfLines:numLines].size;

    // Keep reducing the font size until it fits
    while (textSize.width > unrestrictedFrameSize.width || textSize.height > frameSize.height) {
        fontSize--;
        label.font = [UIFont systemFontOfSize:fontSize];
        textSize = [label.text boundingRectWithSize:CGSizeMake(frameSize.width, CGFLOAT_MAX)
                                            options:(NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading)
                                         attributes:@{NSFontAttributeName : label.font}
                                            context:nil].size;
        unrestrictedFrameSize = [label textRectForBounds:CGRectMake(0, 0, label.bounds.size.width, CGFLOAT_MAX) limitedToNumberOfLines:numLines].size;
    }

    // Set the label frame size back to original
    label.frame = originalLabelFrame;
}
0 hữu ích 0 bình luận chia sẻ
0

Đây là mã điền của lớp con UILabel thực hiện thay đổi kích thước phông chữ động:

@interface SNTextLayer : CATextLayer

@end

@implementation SNTextLayer

- (void)drawInContext:(CGContextRef)ctx {
    // We override this to make text appear at the same vertical positon as in UILabel
    // (otherwise it's shifted tdown)
    CGFloat height = self.bounds.size.height;
    float fontSize = self.fontSize;
    // May need to adjust this somewhat if it's not aligned perfectly in your implementation
    float yDiff = (height-fontSize)/2 - fontSize/10;

    CGContextSaveGState(ctx);
    CGContextTranslateCTM(ctx, 0.0, yDiff);
    [super drawInContext:ctx];
     CGContextRestoreGState(ctx);
}

@end

@interface SNAnimatableLabel ()

@property CATextLayer* textLayer;

@end

@interface SNAnimatableLabel : UILabel

- (void)animateFontToSize:(CGFloat)fontSize withDuration:(double)duration;

@end



@implementation SNAnimatableLabel


- (void)awakeFromNib {
    [super awakeFromNib];
    _textLayer = [SNTextLayer new];
    _textLayer.backgroundColor = self.backgroundColor.CGColor;
    _textLayer.foregroundColor = self.textColor.CGColor;
    _textLayer.font = CGFontCreateWithFontName((CFStringRef)self.font.fontName);
    _textLayer.frame = self.bounds;
    _textLayer.string = self.text;
    _textLayer.fontSize = self.font.pointSize;
    _textLayer.contentsScale = [UIScreen mainScreen].scale;
    [_textLayer setPosition: CGPointMake(CGRectGetMidX(_textLayer.frame), CGRectGetMidY(_textLayer.frame))];
    [_textLayer setAnchorPoint: CGPointMake(0.5, 0.5)];
    [_textLayer setAlignmentMode: kCAAlignmentCenter];
    self.textColor = self.backgroundColor;
    // Blend text with background, so that it doens't interfere with textlayer text
    [self.layer addSublayer:_textLayer];
    self.layer.masksToBounds = NO;
}

- (void)setText:(NSString *)text {
    _textLayer.string = text;
    super.text = text;
}

- (void)layoutSubviews {
    [super layoutSubviews];
    // Need to enlarge the frame, otherwise the text may get clipped for bigger font sizes
    _textLayer.frame = CGRectInset(self.bounds, -5, -5);
}

- (void)animateFontToSize:(CGFloat)fontSize withDuration:(double)duration {
    [CATransaction begin];
    [CATransaction setAnimationDuration:duration];
    _textLayer.fontSize = fontSize;
    [CATransaction commit];
}
0 hữu ích 0 bình luận chia sẻ
loading
Không tìm thấy câu trả lời bạn tìm kiếm? Duyệt qua các câu hỏi được gắn thẻ ios objective-c fonts uilabel , hoặc hỏi câu hỏi của bạn.

Có thể bạn quan tâm

loading