Авторазмер с динамическим шрифтом во вложенном текстовом представлении - PullRequest
0 голосов
/ 24 октября 2018

Так вот, я просто не могу найти подходящий случай при поиске здесь.

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

TextView просто содержит пару предложений, которые должны оставаться на экране, пока не произойдет внешняя вещь,и определенные значения меняются.

Все отлично, когда я использовал шрифт фиксированного размера.

Но, эй ... Я старый парень, и на моем телефоне немного увеличен размер текста.Тестирование его на моем устройстве показывает, где я должен что-то упустить.

При использовании динамического стиля шрифта «Заголовок 2» в свойствах текстового представления и включении «Автоматически корректировать шрифт» в свойствах TextView, когда текст больше размера по умолчанию, создается впечатление, что яне правильно фиксирует размер роста TextView (с большим текстом) при создании нового ограничительного прямоугольника, чтобы подбрасывать во фрейм.Он возвращает значения, которые во многом напоминают меньшие значения текста по умолчанию, а не увеличенный размер текста.

Код ниже, код класса представления, а также код вызова (сделан супер явным для публикации здесь).Я полагаю, что я либо упускаю что-то глупое, например захват размера после того, как что-то происходит со шрифтами, но даже перемещение этого кода в новую функцию и явный вызов его после полного отрисовки элементов управления, похоже, этого не делают.

Надеюсь, это имеет смысл.

Спасибо всем.

Телефонный код:

let noWView:NoWitnessesYetView = (Bundle.main.loadNibNamed("NoWitnessesYetView", owner: nil, options: nil)!.first as! NoWitnessesYetView)
//if nil != noWView {
let leftGutter:CGFloat = 20.0
let bottomGutter:CGFloat = 24.0
let newWidth = self.view.frame.width - ( leftGutter + leftGutter )
let newTop = (eventMap.frame.minY + eventMap.frame.height) - ( noWView.frame.height + bottomGutter ) // I suspect here is the issue
// I suspect that loading without drawing is maybe not allowing 
// the fonts to properly draw and the 
// TextView to figure out the size...?
noWView.frame = CGRect(x: 20, y: newTop, width: newWidth, height: noWView.frame.height)
self.view.addSubview(noWView)
//}

Код класса:

import UIKit
class NoWitnessesYetView: UIView {
    @IBOutlet weak var textView: EyeneedRoundedTextView!
    override func draw(_ rect: CGRect) {
        let newWidth = self.frame.width
        // form up a dummy size just to get the proper height for the popup
        let workingSize:CGSize = self.textView.sizeThatFits(CGSize(width: newWidth, height: CGFloat(MAXFLOAT)))
        // then build the real newSize value
        let newSize = CGSize(width: newWidth, height: workingSize.height)
        textView.frame.size = newSize
        self.textView.isHidden = false
    }
    override func awakeFromNib() {
        super.awakeFromNib()
        self.backgroundColor = UIColor.clear // .blue
        self.layer.cornerRadius = 10
    }
}

1 Ответ

0 голосов
/ 24 октября 2018

Это идеальный способ сделать это: https://www.youtube.com/watch?v=0Jb29c22xu8.

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        // let's create our text view
        let textView = UITextView()
        textView.frame = CGRect(x: 0, y: 0, width: 200, height: 100)
        textView.backgroundColor = .lightGray
        textView.text = "Here is some default text that we want to show and it might be a couple of lines that are word wrapped"

        view.addSubview(textView)

        // use auto layout to set my textview frame...kinda
        textView.translatesAutoresizingMaskIntoConstraints = false
        [
            textView.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor),
            textView.leadingAnchor.constraint(equalTo: view.leadingAnchor),
            textView.trailingAnchor.constraint(equalTo: view.trailingAnchor),
            textView.heightAnchor.constraint(equalToConstant: 50)
            ].forEach{ $0.isActive = true }

        textView.font = UIFont.preferredFont(forTextStyle: .headline)

        textView.delegate = self
        textView.isScrollEnabled = false

        textViewDidChange(textView)
    }

}

extension ViewController: UITextViewDelegate {

    func textViewDidChange(_ textView: UITextView) {
        print(textView.text)
        let size = CGSize(width: view.frame.width, height: .infinity)
        let estimatedSize = textView.sizeThatFits(size)

        textView.constraints.forEach { (constraint) in
            if constraint.firstAttribute == .height {
                constraint.constant = estimatedSize.height
            }
        }
    }

}
...