在UITextView中调整字体大小

时间:2010-05-04 01:13:35

标签: iphone objective-c cocoa-touch ipad uitextview

如果文本太多,有没有办法缩小UITextView中的字体大小?类似于UILabel?

3 个答案:

答案 0 :(得分:12)

接受答案的问题是你必须猜测填充字段所需的字符数(字符串的长度),并且字体与字体不同。像这样的东西,UITextView上的一个类别应该可以工作。

#import "UITextView+Size.h"

#define kMaxFieldHeight 1000

@implementation UITextView (Size)

-(BOOL)sizeFontToFitMinSize:(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 = [self.text sizeWithFont:self.font constrainedToSize:tallerSize lineBreakMode:UILineBreakModeWordWrap];

while (stringSize.height >= self.frame.size.height) {

    if (fontSize <= aMinFontSize) // it just won't fit, ever
        return NO;

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

return YES; 
}

@end

答案 1 :(得分:8)

试试这个:

NSInteger lengthThreshold = 200;
if( [ textView.text length ] > lengthThreshold ) {
    NSInteger newSize = ... //calculate new size based on length

    [ textView setFont: [ UIFont systemFontOfSize: newSize ]];
}

答案 2 :(得分:2)

Swift 4的实施受@Jane Sales的回答启发。

在计算可用的宽度和高度时,我们还必须考虑可能的垂直和水平边距(textContainerInsettextContainer.lineFragmentPadding)。

这里更好地解释了保证金在UITextView上的运作方式:https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/TextUILayer/Tasks/SetTextMargins.html

如果文本视图可以调整大小,那么我们还必须强制布局,以便我们可以根据最大可能的文本视图大小计算字体大小。在这种情况下,只考虑高度(仅当所需文本高度大于原始可用高度时才布局)。

import UIKit

extension UITextView {

    func adjustFontToFitText(minimumScale: CGFloat) {
        guard let font = font else {
            return
        }

        let scale = max(0.0, min(1.0, minimumScale))
        let minimumFontSize = font.pointSize * scale
        adjustFontToFitText(minimumFontSize: minimumFontSize)
    }

    func adjustFontToFitText(minimumFontSize: CGFloat) {
        guard let font = font, minimumFontSize > 0.0 else {
            return
        }

        let minimumSize = floor(minimumFontSize)
        var fontSize = font.pointSize

        let availableWidth = bounds.width - (textContainerInset.left + textContainerInset.right) - (2 * textContainer.lineFragmentPadding)
        var availableHeight = bounds.height - (textContainerInset.top + textContainerInset.bottom)

        let boundingSize = CGSize(width: availableWidth, height: CGFloat.greatestFiniteMagnitude)
        var height = text.boundingRect(with: boundingSize, options: .usesLineFragmentOrigin, attributes: [.font: font], context: nil).height

        if height > availableHeight {
            // If text view can vertically resize than we want to get the maximum possible height
            sizeToFit()
            layoutIfNeeded()
            availableHeight = bounds.height - (textContainerInset.top + textContainerInset.bottom)
        }

        while height >= availableHeight {
            guard fontSize > minimumSize else {
                break
            }

            fontSize -= 1.0
            let newFont = font.withSize(fontSize)
            height = text.boundingRect(with: boundingSize, options: .usesLineFragmentOrigin, attributes: [.font: newFont], context: nil).height
        }

        self.font = font.withSize(fontSize)
    }

}