我正在尝试找到一种不推荐使用的方法来调整textview的字体大小,以便所有文本都适合textview而无需滚动。
方法'sizeWithFont'已被弃用,我想确保最佳实践,XCode说要使用'boundingRectWithSize',但不知道如何使用它来缩小字体大小,以便所有文本适合。
有什么建议吗? 不,我不能使用UILabel。我需要将文本垂直对齐在顶部,而UILabel不会这样做。
这适用于iOS 7之前版本
CGFloat fontSize;
CGFloat minSize;
if([deviceType isEqualToString:@"iPad"] || [deviceType isEqualToString:@"iPad Simulator"]){
fontSize = 40;
minSize = 15;
}
else{
fontSize = 18;
minSize = 8;
}
while (fontSize > minSize)
{
CGSize size = [quote sizeWithFont:[UIFont fontWithName:@"Interstate" size:fontSize] constrainedToSize:CGSizeMake(newView.frame.size.width, 10000)];
if (size.height <= newView.frame.size.height) break;
fontSize -= 1.0;
}
答案 0 :(得分:20)
只需将sizeWithFont: constrainedToSize:
替换为:
boundingRectWithSize:CGSizeMake(newView.frame.size.width, FLT_MAX)
options:NSStringDrawingUsesLineFragmentOrigin
attributes:@{NSFontAttributeName:[UIFont fontWithName:@"Interstate" size:fontSize]}
context:nil];
sizeThatFits
方法可用于解决此问题,如下所示:
while (fontSize > minSize && [newView sizeThatFits:(CGSizeMake(newView.frame.size.width, FLT_MAX))].height >= newView.frame.size.height ) {
fontSize -= 1.0;
newView.font = [tv.font fontWithSize:fontSize];
}
我希望其中一种解决方案可以解决您的问题。干杯!
答案 1 :(得分:4)
我必须这样做,但后来以编程方式添加了AutoLayout约束(NSLayoutConstraint
)。由于约束,contentSize
在导致UITextView
滚动的最长时间内不正确:/为了仍然获得正确的字体大小,我最终只是为了创建一个新的UITextView
为了做一些好的试验和错误测试并通过那里进行。
非常简单,但就像你得到的所有东西一样:)
NSInteger fontSize = 200;
UITextView *testTextView = [[UITextView alloc] init];
testTextView.text = self.myRealTextView.text;
testTextView.font = [UIFont fontWithName:@"AldotheApache" size:fontSize];
while ([testTextView sizeThatFits:(CGSizeMake(self.myRealTextView.frame.size.width, FLT_MAX))].height >= self.myRealTextView.frame.size.height ) {
fontSize -= 0.5;
testTextView.font = [UIFont fontWithName:@"AldotheApache" size:fontSize];
}
NSLog(@"Correct font size is: %ld",(long)fontSize);
self.myRealTextView.font = [UIFont fontWithName:@"AldotheApache" size:fontSize];
答案 2 :(得分:1)
尝试使用UITextView sizeThatFits
。您可以通过以下方式使用它:
//Set text content of UITextView
//...
while (fontSize > minSize) {
// Set font size of UITextView
CGSize size = [textView sizeThatFits:(CGSizeMake(textView.frame.size.width, FLT_MAX)];
if (size.height <= newView.frame.size.height) break;
fontSize -= 1.0;
}
答案 3 :(得分:1)
UITextView是UIScrollView的子类 - &gt;因此,在将文本或字体设置为textView后,可以检查可滚动区域的contentSize。
textView.text = quote;
do
{
textView.font = [UIFont fontWithName:@"Interstate" size:fontSize];
[textView layoutIfNeeded];
if (textView.contentSize.height <= newView.frame.size.height) {
break;
}
fontSize -= 1.0;
} while (fontSize >= minSize);
这应该有效......即使没有[textView layoutIfNeeded],也可能会有效。
答案 4 :(得分:0)
迅速5 +
var fontSize = Font.Size.section.rawValue
let minSize = Font.Size.large.rawValue
while fontSize > minSize {
let textViewSize = CGSize(width: textView.frame.size.width, height: textView.frame.size.height)
let size = textView.sizeThatFits(textViewSize)
if size.height <= textViewSize.height {
break
}
fontSize -= 1.0
}
textView.font = Font.primary.of(size: fontSize)