Форум программистов, компьютерный форум, киберфорум
Наши страницы

Программирование iOS/iPhone

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 20, средняя оценка - 4.95
rovnyart
1 / 1 / 1
Регистрация: 20.08.2014
Сообщений: 19
#1

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

31.10.2014, 17:09. Просмотров 3411. Ответов 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 (как нормально настроить перенос текста?) (Программирование iOS):

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

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

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

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

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

Как нарисовать прямоугольник вокруг текста? - C#
Возможно ли сделать обводку текста, есть такой код... g.DrawString(textBox1.Text, new Font(combofont.Text,...

6
noname_club
104 / 95 / 11
Регистрация: 01.05.2013
Сообщений: 600
31.10.2014, 18:16 #2
Как бы сделать так, чтобы, например, количество строк выставлялось в зависимости от количества слов
Название: 001.png
Просмотров: 217

Размер: 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
104 / 95 / 11
Регистрация: 01.05.2013
Сообщений: 600
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
104 / 95 / 11
Регистрация: 01.05.2013
Сообщений: 600
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
Привет! Вот еще темы с ответами:

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

Не могу нормально настроить wdk для vs2015 - Программирование драйверов
Наконец-то я вас нашел! Не знал, что разработка драйверов-это низкоуровневое программирование, оказывается пишут еще и на с. Ладно, ближе к...

Как сделать перенос текста в Outlook - VBA
Как сделать перенос на следующую строку в тексте вставляемом в тело письма Sub CreateSign() Dim Message As MailItem Set Message =...

Построение прямоугольника,его масштабирование,вращение вокруг осей и перенос - Turbo Pascal
Здравствуйте!Помогите пожалуйста найти ошибку в коде...программа запускается,но отрисовка прямоугольников выходит в итоге не правильная ,я...


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

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

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