Это отличный вопрос, потому что кажется, что это будет частью встроенной функциональности UIKit
или связанной с ней инфраструктуры.Вот хороший наглядный пример вопроса:
Легкого пути нет, но это определенно возможно.Один из способов сделать это - программно пробовать шрифты разных размеров, пока не найдете тот, который подходит достаточно близко к границам вида.Вы можете сделать это с помощью функции boundingRect()
, равной NSString
или NSAttributedString
.Например:
let string = "This is a test"
let infiniteSize = CGSize(width: CGFloat.greatestFiniteMagnitude, height:CGFloat.greatestFiniteMagnitude)
let size = string.boundingRect(with: infiniteSize, options: [], attributes: [.font: UIFont.systemFont(ofSize: avgSize)] context: nil).size
Вы можете сделать бинарный поиск более эффективным, чем полный метод грубой силы.Есть также некоторые соображения, которые немного более сложны, в том числе правильная перенос слов и производительность кэширования шрифтов iOS, если вы ищете что-то действительно надежное.Проще говоря, я разработал надежную реализацию в Swift, которую я также использую в производственном приложении.Это подкласс UIView
с эффективным автоматическим масштабированием шрифта для любого вводимого текста, включая несколько строк.Чтобы использовать его, вы просто должны сделать что-то вроде:
let view = AKTextView()
// Use a simple or fancy NSAttributedString
view.attributedText = .init(string: "Some text here")
// Add to the view hierarchy somewhere
Вот и все!Вы можете найти полный источник здесь: https://github.com/FlickType/AccessibilityKit
Надеюсь, это поможет!