С наступающим Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование iOS/iPhone
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.87/23: Рейтинг темы: голосов - 23, средняя оценка - 4.87
rovnyart
1 / 1 / 1
Регистрация: 20.08.2014
Сообщений: 19
1

Пляски вокруг UILabel (как нормально настроить перенос текста?)

31.10.2014, 17:09. Просмотров 4466. Ответов 6
Метки нет (Все метки)

Всем привет, существует задача - один вью контроллер с одной UILabel на нем. Текст этого лейбла динамически изменяется, должно быть всегда на весь экран девайса крупно его видно. Привязки UILabel стоят к центру по вертикали и горизонтали вьюхи, а также Equal Widths с вьюхой. Размер текста 250 для айпадов и 150 для айфонов, также стоит атрибут Autoshrink -> Maximum Font Scale (0.4) для сжатия размера текста в зависимости от количества символов.

Все проблемы начинаются с изменением количества Lines (строк) в UILabel. То есть, например, если поставить количество строк 3, то надпись "непереносимая невыносимость бытия" выглядит хорошо:
Кликните здесь для просмотра всего текста

Пляски вокруг UILabel (как нормально настроить перенос текста?)



А вот "ощущение безысходности" - уже не очень:
Кликните здесь для просмотра всего текста

Пляски вокруг UILabel (как нормально настроить перенос текста?)



Этой надписи гораздо комфортнее было бы со значением Lines - 2:

Кликните здесь для просмотра всего текста

Пляски вокруг UILabel (как нормально настроить перенос текста?)



То есть, при фиксированном количестве строк в зависимости от длины текста возникают уродливые переносы слов (ладно бы по правилам) и это очень печалит.
Как бы сделать так, чтобы, например, количество строк выставлялось в зависимости от количества слов, или просто отменить эти уродские переносы принудительно заставляя вывести минимум одно слово в строку? (пробовал играться с параметром Line Breaks - никакого эффекта(( )
Ну или посоветуйте, может, какое-нибудь другое решение, главное, чтобы текст читался и был крупным.
Заранее большое спасибо за любую попытку помочь)
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.10.2014, 17:09
Ответы с готовыми решениями:

Кликабельные части текста в UILabel
Доброго времени суток. Кто-нибудь знает, есть ли какая-то возможность сделать...

Как перевернуть объект UILabel на 180 градусов
задумал я сделать зеркальное отображение в верхней половине экрана экземпляра...

Как вывести весь лог с консоли (от NSLog) в UILabel окошко?
Всем привет! Подскажите, как вывести лог консоли в окошко label? Чтоб...

UILabel смена текста каждые 3 секунды
Здравствуйте. У меня есть таблица, ячейки которой содержат по одному UILabel....

Пляски с бубном вокруг терминала сбора данных CipherLAB-8300
Модераторам: Создал тему в "Обо всем", ибо соответствующего раздела не нашел....

6
noname_club
107 / 98 / 12
Регистрация: 01.05.2013
Сообщений: 603
31.10.2014, 18:16 2
Как бы сделать так, чтобы, например, количество строк выставлялось в зависимости от количества слов
Название: 001.png
Просмотров: 224

Размер: 12.5 Кб

Objective-C
1
Label.numberOfLines = 0;
0
rovnyart
1 / 1 / 1
Регистрация: 20.08.2014
Сообщений: 19
31.10.2014, 19:00  [ТС] 3
Кликните здесь для просмотра всего текста

Пляски вокруг UILabel (как нормально настроить перенос текста?)



Значит я чуток не правильно сформулировал вопрос) суть в том, чтобы слова не переносились криво)

Так, кстати, шрифт не масштабируется почему-то(
0
noname_club
107 / 98 / 12
Регистрация: 01.05.2013
Сообщений: 603
31.10.2014, 20:09 4
http://stackoverflow.com/questions/4...t-size-uilabel
0
rovnyart
1 / 1 / 1
Регистрация: 20.08.2014
Сообщений: 19
03.11.2014, 19:26  [ТС] 5
да гуглил я уже это все. все равно не то( у меня шрифт-то уменьшается и влазит в заданные границы без проблем, но слова переносятся по-уродски. мне именно это нужно - чтобы слова не переносились. И если скажем они "хотят перенестись" - шрифт сам уменьшается до такого, чтобы "не хотели"
как отловить это "хотение"?
Я пытался разбить строку, передаваемую в Label на слова и вычислить самое длинное, потом вычислить его длину и т.д. но запутался окончательно и бросил это дело(
теперь вот сижу тут надеюсь, что кто-нибудь шибко умный подскажет.
а stackoverflow я уже весь перелопатил данво(
0
noname_club
107 / 98 / 12
Регистрация: 01.05.2013
Сообщений: 603
03.11.2014, 19:50 6
Я пытался разбить строку, передаваемую в Label на слова и вычислить самое длинное, потом вычислить его длину и т.д.
можно вычислить самое длинное слово, и потом через цикл подобрать нужный размер (программно, до отрисовки UILabel)

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
/*! Returns the size of the label to display the text provided
    @param text
        The string to be displayed
    @param width
        The width required for displaying the string
    @param fontName
        The font name for the label
    @param fontSize
        The font size for the label
 */
- (CGSize)getSizeForText:(NSString *)text maxWidth:(CGFloat)width font:(NSString *)fontName fontSize:(float)fontSize {
    CGSize constraintSize;
    constraintSize.height = MAXFLOAT;
    constraintSize.width = width;
    NSDictionary *attributesDictionary = [NSDictionary dictionaryWithObjectsAndKeys:
                                          [UIFont fontWithName:fontName size:fontSize], NSFontAttributeName,
                                          nil];
 
    CGRect frame = [text boundingRectWithSize:constraintSize
                                      options:NSStringDrawingUsesLineFragmentOrigin
                                   attributes:attributesDictionary
                                      context:nil];
 
    CGSize stringSize = frame.size;
    return stringSize;
}
Objective-C
1
2
3
4
5
6
7
8
9
CGSize maxs = CGSizeZero;
NSString * maxText = @"BIGHELLOWORLDBIG";
CGFloat fontSize = 10;
do {
    fontSize += 1;
    maxs = [self getSizeForText: maxText maxWidth: MAXFLOAT font:@"Helvetica" fontSize:fontSize];
} while (maxs.width>self.label.frame.size.width);
 
NSLog(@"Искомый максимальный размер шрифта рассчитан : %d", (int) fontSize);
0
rovnyart
1 / 1 / 1
Регистрация: 20.08.2014
Сообщений: 19
30.11.2014, 12:13  [ТС] 7
таак, уже почти добился, чего хотел, но почему-то не работает в портретной ориентации (в ландшафтной все ок). может, подскажете, чего я не замечаю?

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)")
}

И что получается:

в портретной:
Кликните здесь для просмотра всего текста
Пляски вокруг UILabel (как нормально настроить перенос текста?)


в ландшафтной:
Кликните здесь для просмотра всего текста
Пляски вокруг UILabel (как нормально настроить перенос текста?)


пробовал сравнивать maxs с self.view.frame.size.width - но почему-то тоже ничего не получается(
0
30.11.2014, 12:13
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.11.2014, 12:13

Внешняя звуковая карта подключена к внутренней - как их настроить нормально?
Господа, давно не пользовался форумами, но это единственный вариант, который...

Как нарисовать прямоугольник вокруг текста?
Возможно ли сделать обводку текста, есть такой код......

Как сделать рамку вокруг текста и изображения?
Подскажите пожалуйста, у меня есть изображение и ниже несколько слов, как...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru