gpt4 book ai didi

iphone - 如何调整标签的字体大小以适应矩形?

转载 作者:行者123 更新时间:2023-12-03 18:14:09 30 4
gpt4 key购买 nike

是的,有一个很酷的 myLabel.adjustsFontSizeToFitWidth = YES; 属性。但是,一旦标签有两行或更多行,它就不会将文本大小调整为任何内容。因此,如果它不适合矩形,它就会被截断为 ...。

还有其他方法吗?

最佳答案

如果您想确保标签的宽度和高度都适合矩形,您可以在标签上尝试不同的字体大小,看看是否适合。

此代码段从 300 pt 开始,并尝试通过减小字体大小使标签适合目标矩形。

- (void) sizeLabel: (UILabel *) label toRect: (CGRect) labelRect {

// Set the frame of the label to the targeted rectangle
label.frame = labelRect;

// Try all font sizes from largest to smallest font size
int fontSize = 300;
int minFontSize = 5;

// Fit label width wize
CGSize constraintSize = CGSizeMake(label.frame.size.width, MAXFLOAT);

do {
// Set current font size
label.font = [UIFont fontWithName:label.font.fontName size:fontSize];

// Find label size for current font size
CGRect textRect = [[label text] boundingRectWithSize:constraintSize
options:NSStringDrawingUsesLineFragmentOrigin
attributes:@{NSFontAttributeName: label.font}
context:nil];

CGSize labelSize = textRect.size;

// Done, if created label is within target size
if( labelSize.height <= label.frame.size.height )
break;

// Decrease the font size and try again
fontSize -= 2;

} while (fontSize > minFontSize);
}

我认为上面已经解释了发生的事情。更快的实现可以使用缓存和 argarcians 二进制搜索,如下所示

+ (CGFloat) fontSizeForString: (NSString*) s inRect: (CGRect) labelRect  {
// Cache repeat queries
static NSMutableDictionary* mutableDict = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
mutableDict = [NSMutableDictionary dictionary];
});

NSString* key = [NSString stringWithFormat:@"%@_%d_%d", s, (int) labelRect.size.width, (int) labelRect.size.height];
NSNumber* value = [mutableDict objectForKey:key];
if (value)
return value.doubleValue;

// Set the frame of the label to the targeted rectangle
UILabel* label = [[UILabel alloc] init];
label.text = s;
label.frame = labelRect;

// Hopefully between 5 and 300
CGFloat theSize = (CGFloat) [self binarySearchForFontSizeForLabel:label withMinFontSize:5 withMaxFontSize:300 withSize:label.frame.size];
[mutableDict setObject:@(theSize) forKey:key];
return theSize;
}


+ (NSInteger)binarySearchForFontSizeForLabel:(UILabel *)label withMinFontSize:(NSInteger)minFontSize withMaxFontSize:(NSInteger)maxFontSize withSize:(CGSize)size {
// If the sizes are incorrect, return 0, or error, or an assertion.
if (maxFontSize < minFontSize) {
return maxFontSize;
}

// Find the middle
NSInteger fontSize = (minFontSize + maxFontSize) / 2;
// Create the font
UIFont *font = [UIFont fontWithName:label.font.fontName size:fontSize];
// Create a constraint size with max height
CGSize constraintSize = CGSizeMake(size.width, MAXFLOAT);
// Find label size for current font size
CGRect rect = [label.text boundingRectWithSize:constraintSize
options:NSStringDrawingUsesLineFragmentOrigin
attributes:@{NSFontAttributeName : font}
context:nil];
CGSize labelSize = rect.size;

// EDIT: The next block is modified from the original answer posted in SO to consider the width in the decision. This works much better for certain labels that are too thin and were giving bad results.
if (labelSize.height >= (size.height + 10) && labelSize.width >= (size.width + 10) && labelSize.height <= (size.height) && labelSize.width <= (size.width)) {
return fontSize;
} else if (labelSize.height > size.height || labelSize.width > size.width) {
return [self binarySearchForFontSizeForLabel:label withMinFontSize:minFontSize withMaxFontSize:fontSize - 1 withSize:size];
} else {
return [self binarySearchForFontSizeForLabel:label withMinFontSize:fontSize + 1 withMaxFontSize:maxFontSize withSize:size];
}
}

关于iphone - 如何调整标签的字体大小以适应矩形?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2844397/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com