Вопрос: Пляски вокруг UILabel (как нормально настроить перенос текста?)
Всем привет, существует задача - один вью контроллер с одной UILabel на нем. Текст этого лейбла динамически изменяется, должно быть всегда на весь экран девайса крупно его видно. Привязки UILabel стоят к центру по вертикали и горизонтали вьюхи, а также Equal Widths с вьюхой. Размер текста 250 для айпадов и 150 для айфонов, также стоит атрибут Autoshrink -> Maximum Font Scale (0.4) для сжатия размера текста в зависимости от количества символов.
Все проблемы начинаются с изменением количества Lines (строк) в UILabel. То есть, например, если поставить количество строк 3, то надпись "непереносимая невыносимость бытия" выглядит хорошо:
Кликните здесь для просмотра всего текста
А вот "ощущение безысходности" - уже не очень:
Кликните здесь для просмотра всего текста
Этой надписи гораздо комфортнее было бы со значением Lines - 2:
Кликните здесь для просмотра всего текста
То есть, при фиксированном количестве строк в зависимости от длины текста возникают уродливые переносы слов (ладно бы по правилам) и это очень печалит.
Как бы сделать так, чтобы, например, количество строк выставлялось в зависимости от количества слов, или просто отменить эти уродские переносы принудительно заставляя вывести минимум одно слово в строку? (пробовал играться с параметром Line Breaks - никакого эффекта(( )
Ну или посоветуйте, может, какое-нибудь другое решение, главное, чтобы текст читался и был крупным.
Заранее большое спасибо за любую попытку помочь)
Ответ:
таак, уже почти добился, чего хотел, но почему-то не работает в портретной ориентации (в ландшафтной все ок). может, подскажете, чего я не замечаю?
Label на вьюхе один (pickupLabel), привязки - equal widths и equal heigths с view.
переделанная функция под Swift:
Кликните здесь для просмотра всего текста
Код Objective-C |
1
2
3
4
5
6
7
8
9
10
11
12
13
| func getSizeForText(text: NSString, maxWidth: CGFloat, fontName: String, fontSize:CGFloat) -> CGSize {
var constraintSize: CGSize = CGSizeZero
constraintSize.height = CGFloat.max
constraintSize.width = maxWidth
let attributesDictionary: NSDictionary = NSDictionary(objectsAndKeys: UIFont(name: fontName, size: fontSize)!, NSFontAttributeName)
let frame: CGRect = text.boundingRectWithSize(constraintSize, options: NSStringDrawingOptions.UsesLineFragmentOrigin, attributes: attributesDictionary, context: nil)
let stringSize:CGSize = frame.size
return stringSize
} |
|
viewDidLoad:
textFromInput - это строка со словами
Кликните здесь для просмотра всего текста
Код Objective-C |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
| override func viewDidLoad() {
super.viewDidLoad()
let words = textFromInput.componentsSeparatedByString(" ")
let longest = words.reduce(String?()) {
(longest, word) in
longest == nil || countElements(word) > countElements(longest!) ? word : longest
}
var maxs: CGSize = CGSizeZero
var fontSize: CGFloat = 10
do {
fontSize++
maxs = self.getSizeForText(longest!, maxWidth: CGFloat.max, fontName: "Helvetica", fontSize: fontSize)
} while maxs.width < pickupLabel.frame.size.width
pickupLabel.text = textFromInput
pickupLabel.font = UIFont(name: "Helvetica", size: fontSize)
pickupLabel.numberOfLines = 0
println("Самое длинное слово: \(longest!)")
println("Искомый максимальный размер шрифта: \(Int(fontSize))")
println("Ширина рамки Label: \(pickupLabel.frame.size.width)")
println("Ширина рамки View: \(self.view.frame.size.width)")
} |
|
И что получается:
в портретной:
Кликните здесь для просмотра всего текста
в ландшафтной:
Кликните здесь для просмотра всего текста
пробовал сравнивать maxs с self.view.frame.size.width - но почему-то тоже ничего не получается(