调整字体大小以填充UITextView?

Joh*_*Tee 12 iphone cocoa-touch font-size uitextview uikit

如何在UITextView中设置文本的字体大小,使其填满整个UITextView?我希望用户输入他们的文本,然后让文本填充整个UITextView.

任何帮助表示赞赏!

Mat*_*ear 19

我已经将痴呆症的答案转换为Swift:

func updateTextFont() {
    if (textView.text.isEmpty || CGSizeEqualToSize(textView.bounds.size, CGSizeZero)) {
        return;
    }

    let textViewSize = textView.frame.size;
    let fixedWidth = textViewSize.width;
    let expectSize = textView.sizeThatFits(CGSizeMake(fixedWidth, CGFloat(MAXFLOAT)));

    var expectFont = textView.font;
    if (expectSize.height > textViewSize.height) {
        while (textView.sizeThatFits(CGSizeMake(fixedWidth, CGFloat(MAXFLOAT))).height > textViewSize.height) {
            expectFont = textView.font!.fontWithSize(textView.font!.pointSize - 1)
            textView.font = expectFont
        }
    }
    else {
        while (textView.sizeThatFits(CGSizeMake(fixedWidth, CGFloat(MAXFLOAT))).height < textViewSize.height) {
            expectFont = textView.font;
            textView.font = textView.font!.fontWithSize(textView.font!.pointSize + 1)
        }
        textView.font = expectFont;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • @RubenVot,我们什么时候应该使用这个功能? (3认同)

Jan*_*les 8

在UITextView的类别中,这应该可以解决问题.为什么你需要fudgefactor,请看这篇文章

#define kMaxFieldHeight 9999 

-(BOOL)sizeFontToFit:(NSString*)aString minSize:(float)aMinFontSize maxSize:(float)aMaxFontSize 
{   
float fudgeFactor = 16.0;
float fontSize = aMaxFontSize;

self.font = [self.font fontWithSize:fontSize];

CGSize tallerSize = CGSizeMake(self.frame.size.width-fudgeFactor,kMaxFieldHeight);
CGSize stringSize = [aString sizeWithFont:self.font constrainedToSize:tallerSize lineBreakMode:UILineBreakModeWordWrap];

while (stringSize.height >= self.frame.size.height)
       {
       if (fontSize <= aMinFontSize) // it just won't fit
           return NO;

       fontSize -= 1.0;
       self.font = [self.font fontWithSize:fontSize];
       tallerSize = CGSizeMake(self.frame.size.width-fudgeFactor,kMaxFieldHeight);
       stringSize = [aString sizeWithFont:self.font constrainedToSize:tallerSize lineBreakMode:UILineBreakModeWordWrap];
       }

return YES; 
}
Run Code Online (Sandbox Code Playgroud)

  • 在iOS> 7.0中,您需要将UILineBreakModeWordWrap更改为NSLineBreakByWordWrapping (2认同)

Ste*_*son 7

类似于Arie Litovsky的答案,但没有子类(或使用类别)而没有使用contentSize哪种方法没有为我返回正确的渲染文本高度.在iOS 7上测试:

while (((CGSize) [_textView sizeThatFits:_textView.frame.size]).height > _textView.frame.size.height) {
    _textView.font = [_textView.font fontWithSize:_textView.font.pointSize-1];
}
Run Code Online (Sandbox Code Playgroud)

方法是不断缩小字体大小,直到文本恰好适合文本视图的框架.

如果你打算在生产中使用它,你仍然需要:

  • 处理即使使用尽可能小的字体大小,文本仍然不适合的情况.
  • 使用类似的方法来增加字体大小,如果你也想缩放文本起来,以适应框架.


Ari*_*sky 5

试试这个,它更简单:

while (self.contentSize.height > self.frame.size.height)
{
    self.font = [self.font fontWithSize:self.font.pointSize -1];
}
Run Code Online (Sandbox Code Playgroud)

  • @BradMoore,你需要再添加一行:[textView layoutSubviews]; (2认同)

Ben*_*ieb 2

此属性仅适用于 UITextFields。要在 UITextView 中执行此操作,您必须不断观察文本并根据更改手动调整字体大小。