Изменить размер шрифта, чтобы заполнить UITextView? - PullRequest
10 голосов
/ 11 января 2010

Как бы я установил размер шрифта текста в UITextView так, чтобы он заполнял весь UITextView? Я бы хотел, чтобы пользователь набрал свой текст, а затем заполнил весь текст UITextView.

Любая помощь приветствуется!

Ответы [ 13 ]

17 голосов
/ 25 ноября 2014

Я преобразовал ответ дементиаз в Свифт:

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;
    }
}
8 голосов
/ 31 мая 2010

Это, в категории на UITextView, должно сработать. Чтобы узнать, почему вам нужен помадка, см. этот пост

#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; 
}
7 голосов
/ 16 марта 2014

Подобный подход к ответу Арье Литовского, но без подклассов (или использования категории) и без использования contentSize, который не вернул мне правильную высоту отображаемого текста. Протестировано на iOS 7:

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

Подход заключается в том, чтобы уменьшать размер шрифта до тех пор, пока текст не поместится внутри рамки текстового представления.

Если вы собираетесь использовать это в производстве, вам все равно потребуется:

  • Обработайте случай, когда даже при минимально возможном размере шрифта текст все равно не помещается.
  • Используйте аналогичный подход к увеличению размера шрифта, если вы также хотите масштабировать текст до , чтобы соответствовать рамке.
5 голосов
/ 06 августа 2012

Попробуйте, это намного проще:

while (self.contentSize.height > self.frame.size.height)
{
    self.font = [self.font fontWithSize:self.font.pointSize -1];
}
3 голосов
/ 25 июля 2017

для быстрых 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
     }
 }
3 голосов
/ 13 января 2017

Я преобразовал ответ Дементиаз и Мэтта Фреара в Свифт 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
    }
}
3 голосов
/ 22 июля 2014

Вот мой пример кода. В основном, я проверяю ожидаемый размер, чтобы знать, нужно ли увеличивать или уменьшать размер шрифта. Вам нужно добавить 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;
    }
}
2 голосов
/ 11 января 2010

Это свойство доступно только для UITextFields. Чтобы сделать это в UITextView, вам придется постоянно просматривать текст и вручную изменять размер шрифта, как он изменился.

1 голос
/ 21 апреля 2018

Я преобразовал ответ Мэтта Фреара в Swift 4.1 как расширение для UITextView:

extension UITextView {
func updateTextFont() {
    if (self.text.isEmpty || self.bounds.size.equalTo(CGSize.zero)) {
        return;
    }

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


    var expectFont = self.font
    if (expectSize.height > textViewSize.height) {

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

}

0 голосов
/ 30 января 2018

Вот решение для Swift 4 (на основе Arie Litovsky answer), вы можете поместить этот код в 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 < 12 и fontSize > 15 в соответствии с вашими потребностями в минимальном и максимальном размере шрифта.

...