iOS 7 - UITextView大小字体,适合所有文本进入视图(无滚动)

时间:2014-05-13 01:39:43

标签: ios7 resize uitextview sizewithfont

我正在尝试找到一种不推荐使用的方法来调整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;
}

5 个答案:

答案 0 :(得分:20)

解决方案1 ​​

只需将sizeWithFont: constrainedToSize:替换为:

即可解决您的问题
boundingRectWithSize:CGSizeMake(newView.frame.size.width, FLT_MAX)
                options:NSStringDrawingUsesLineFragmentOrigin
             attributes:@{NSFontAttributeName:[UIFont fontWithName:@"Interstate" size:fontSize]}
                context:nil];

解决方案2

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)