Resize font size to fill UITextView?

后端 未结 15 931
春和景丽
春和景丽 2020-12-01 07:03

How would I set the font size of text in a UITextView such that it fills the entire UITextView? I\'d like the user to type in their text, then have the text fill the entire

相关标签:
15条回答
  • 2020-12-01 07:23

    I have converted Matt Frear's answer to Swift 4.1 as extension for 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 讨论(0)
  • 2020-12-01 07:27

    Similar approach to Arie Litovsky's answer but without sub-classing (or use of a category) and not using contentSize which didn't return the correct height of the rendered text for me. Tested on iOS 7:

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

    The approach is to keep reducing the font size until the text just fits inside the frame of the text view.

    If you were going to use this in production you would still need to:

    • Handle the case where even with the smallest-possible font size the text still won't fit.
    • Use a similar approach to increase the font size if you would also like to scale text up to fit the frame.
    0 讨论(0)
  • 2020-12-01 07:28

    for 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
         }
     }
    
    0 讨论(0)
  • 2020-12-01 07:29

    I have converted dementiazz's answer to 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;
        }
    }
    

    Swift 3.0+ Update:

    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 讨论(0)
  • 2020-12-01 07:29

    Try this, it's a lot simpler:

    while (self.contentSize.height > self.frame.size.height)
    {
        self.font = [self.font fontWithSize:self.font.pointSize -1];
    }
    
    0 讨论(0)
  • 2020-12-01 07:29

    Hope that's clearer:

    extension UITextView {
        @objc public func fitText() {
            fitText(into: frame.size)
        }
    
        @objc public func fitText(into originalSize: CGSize) {
            let originalWidth = originalSize.width
            let expectedSize = sizeThatFits(CGSize(width: originalWidth, height: CGFloat(MAXFLOAT)))
    
            if expectedSize.height > originalSize.height {
                while let font = self.font, sizeThatFits(CGSize(width: originalWidth, height: CGFloat(MAXFLOAT))).height > originalSize.height {
                    self.font = font.withSize(font.pointSize - 1)
                }
            } else {
                var previousFont = self.font
                while let font = self.font, sizeThatFits(CGSize(width: originalWidth, height: CGFloat(MAXFLOAT))).height < originalSize.height {
                    previousFont = font
                    self.font = font.withSize(font.pointSize + 1)
                }
                self.font = previousFont
            }
        }
    }
    
    0 讨论(0)
提交回复
热议问题