2010-01-10 129 views

回答

2

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

+0

啊,是否有任何示例代码在那里呢?我环顾四周,找不到任何东西。非常感谢! –

+0

我不知道任何示例代码;我从来没有听说过有人试图这样做。 –

8

这在UITextView的类别中应该有效。对于为什么需要fudgefactor,看到this post

#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; 
} 
+2

在iOS> 7.0中,您需要将UILineBreakModeWordWrap更改为NSLineBreakByWordWrapping – ignotusverum

+0

只是好奇,您怎么知道“fudgeFactor = 16.0”?当文字大小较小时,我认为此值应该较小 – Jacky

5

试试这个,这是一个简单多了:

while (self.contentSize.height > self.frame.size.height) 
{ 
    self.font = [self.font fontWithSize:self.font.pointSize -1]; 
} 
+0

+1,它正常工作 – NAZIK

+3

在iOS7中不起作用。 –

+2

@BradMoore,你需要添加一行:[textView layoutSubviews]; – Jacky

6

类似的方法来阿里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]; 
} 

该方法是继续缩小字体大小,直到文本恰好适合文本视图的框架。

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

  • 处理这种情况即使在最小的可能的字体大小的文本仍然不适合的情况。
  • 使用类似的方法增加的字体大小,如果你还想缩放文本增加以适合框架。
+0

处理“增加”字体大小写的快速方法:http://pastie.org/8975356 – Anil

2

这是我的示例代码。基本上,我检查期望的大小,知道字体大小是否需要增加或减少。您需要UITextViewDelegate添加到您的类以确保其运作

- (void)updateTextFont:(UITextView *)textView 
{ 
    // Only run if has text, otherwise it will make infinity loop 
    if (textView.text.length == 0 || CGSizeEqualToSize(textView.bounds.size, CGSizeZero)) return; 

    /* 
    - Update textView font size 
    If expectHeight > textViewHeight => descrease font size n point until it reach textViewHeight 
    If expectHeight < textViewHeight => inscrease font size n point until it reach textViewHeight 
    */ 
    CGSize textViewSize = textView.frame.size; 
    CGFloat fixedWidth = textViewSize.width; 
    CGSize expectSize = [textView sizeThatFits:CGSizeMake(fixedWidth, MAXFLOAT)]; 

    UIFont *expectFont = textView.font; 
    if (expectSize.height > textViewSize.height) { 
     while ([textView sizeThatFits:CGSizeMake(fixedWidth, MAXFLOAT)].height > textViewSize.height) { 
      expectFont = [textView.font fontWithSize:(textView.font.pointSize-1)]; 
      textView.font = expectFont; 
     } 
    } else { 
     while ([textView sizeThatFits:CGSizeMake(fixedWidth, MAXFLOAT)].height < textViewSize.height) { 
      expectFont = textView.font; 
      textView.font = [textView.font fontWithSize:(textView.font.pointSize+1)]; 
     } 
     textView.font = expectFont; 
    } 
} 
+0

我很好奇else子句在这里做什么。在修改之前,你在'textView's'' font'中设置了'expectFont' ...然后你将它设置回未修改的'font'?那是为了防止文字大小的跳跃和跳跃? –

+0

@StephenPaul in else子句,如果while不运行,'textView.font'不会改变(因为'expectFont'实际上是原始的'textView.font')。但是,如果至少运行一次,'expectFont'会更改,我们需要在完成循环后更新它。我可以在运行或不运行时确定一个标志,但我没有。相反,我把它分成最后一行'textView。font = expectFont' – nahung89

+0

如果while循环运行至少1次,则将当前字体存储在变量'expectFont'中。然后你增加'textView'的字体一点,但是当那个while循环退出时,你会看到'textView'字体回到了原来的样子...... –

10

我已经转换dementiazz's answer斯威夫特:

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; 
    } 
} 
+0

也可以添加最小和最大字体大小以避免出现意外大小。 (太大或太小) 我刚刚在你的while – RubenVot

+0

@RubenVot中添加了条件“&&(textView.font!.pointSize> CGFloat(minSize))”,我们何时应该使用这个函数? – Shyam

0

的@Arie Litovsky的代码的更新版本。这适用于iOS7及更高版本,并且可以向上和向下延伸字体大小以适应文本。

- (void) stretchFontToFit:(UITextView*)textView 
{ 

    while(textView.contentSize.height < textView.frame.size.height) 
    { 
     textView.font = [textView.font fontWithSize:textView.font.pointSize +1]; 
     [textView layoutIfNeeded]; 
    } 

    while(textView.contentSize.height > textView.frame.size.height) 
    { 
     textView.font = [textView.font fontWithSize:textView.font.pointSize -1]; 
     [textView layoutIfNeeded]; 
    } 
} 
0

在viewDidLoad中:

textView.textContainer.lineFragmentPadding = 0; 
textView.textContainerInset = UIEdgeInsetsMake(0, 0, 0, 0); 

您需要添加UITextViewDelegate:

- (void)updateTextFont:(UITextView *)textView { 

    CGSize textViewSize = textView.frame.size; 
    CGSize sizeOfText = [textView.text sizeWithAttributes:@{NSFontAttributeName: textView.font}]; 

    CGFloat fontOfWidth = floorf(textView.font.pointSize/sizeOfText.height * textViewSize.height); 
    CGFloat fontOfHeight = floorf(textView.font.pointSize/sizeOfText.width * textViewSize.width); 

    textView.font = [textView.font fontWithSize:MIN(fontOfHeight, fontOfWidth)]; 
} 
1

我已经转换dementiazz的&马特Frear的回答让斯威夫特3:

func updateTextFont() { 
     if (textView.text.isEmpty || textView.bounds.size.equalTo(CGSize.zero)) { 
      return 
     } 

    let textViewSize = textView.frame.size 
    let fixedWidth = textViewSize.width 
    let expectSize = textView.sizeThatFits(CGSize(width: fixedWidth, height: CGFloat(MAXFLOAT))) 

    var expectFont = textView.font 
    if (expectSize.height > textViewSize.height) { 
     while (textView.sizeThatFits(CGSize(width: fixedWidth, height: CGFloat(MAXFLOAT))).height > textViewSize.height) { 
      expectFont = textView.font!.withSize(textView.font!.pointSize - 1) 
      textView.font = expectFont 
     } 
    } 
    else { 
     while (textView.sizeThatFits(CGSize(width: fixedWidth, height: CGFloat(MAXFLOAT))).height < textViewSize.height) { 
      expectFont = textView.font 
      textView.font = textView.font!.withSize(textView.font!.pointSize + 1) 
     } 
     textView.font = expectFont 
    } 
} 
+0

适合我。谢谢! –

-1

ü能够!self.textview.font .fontName,
大小:self.textview.frame使用

  • self.textview.font =

self.textview.font = UIFont(名字很容易做到这一点。 size.height/10)!在根据您的需要某个常数

鸿沟textview.frame.size.height ..

1

为SWIFT 3

func updateTextFont(textView : UITextView) { 


    if (textView.text.isEmpty || textView.bounds.size.equalTo(CGSize.zero)) { 
     return; 
    } 

    let textViewSize = textView.frame.size; 
    let fixedWidth = textViewSize.width; 

    let expectSize = textView.sizeThatFits(CGSize(width : fixedWidth, height : CGFloat(MAXFLOAT))); 

    var expectFont = textView.font; 
    if (expectSize.height > textViewSize.height) { 
     while (textView.sizeThatFits(CGSize(width : fixedWidth, height : CGFloat(MAXFLOAT))).height > textViewSize.height) { 
      expectFont = textView.font!.withSize(textView.font!.pointSize - 1) 
      textView.font = expectFont 
     } 
    } 
    else { 
     while (textView.sizeThatFits(CGSize(width : fixedWidth,height : CGFloat(MAXFLOAT))).height < textViewSize.height) { 
      expectFont = textView.font; 
      textView.font = textView.font!.withSize(textView.font!.pointSize + 1) 
     } 
     textView.font = expectFont; 
    } 
} 
-2

这里是解决斯威夫特4(基于Arie Litovsky答案),您可以将此代码放入textViewDidChange(_ textView: UITextView)代表方法:

缩小字体:

while (textView.contentSize.height > textView.frame.size.height) { 
     guard let fontName = textView.font?.fontName, let fontSize = textView.font?.pointSize else {return} 
     if fontSize < 12 { 
      return 
     } 
     textView.font = UIFont(name: fontName, size: fontSize - 1) 
     textView.layoutIfNeeded() 
    } 

和扩大字体:

 while (textView.contentSize.height < textView.frame.size.height) { 
     guard let fontName = textView.font?.fontName, let fontSize = textView.font?.pointSize else {return} 
     if fontSize > 15 { 
      return 
     } 
     textView.font = UIFont(name: fontName, size: fontSize + 1) 
     textView.layoutIfNeeded() 
    } 

可以更改fontSize < 12fontSize > 15以适应最小和最大字体大小您的需求。