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

Objective-C

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.60
Pro2005
44 / 44 / 3
Регистрация: 27.05.2013
Сообщений: 163
#1

The best way to calculate UITableViewCell height - Objective-C

21.03.2014, 19:07. Просмотров 1466. Ответов 7
Метки нет (Все метки)

Привет всем. Назрел довольно давний вопрос. Все мы пользуемся чудесными классами UITableViewCell, UITableView. Мне бы хотелось проанализировать и выбрать лучший вариант исп UITableViewCell и динамический расчет ее высоты. Обычно сами ячейки у меня хранятся в nib/xib/storyboard - как ни странно но для меня это удобно и наглядно. К примеру в ячейки лежит UILabel, в InterfaceBuilder я его настраиваю (шрифты, цвет, ширину и т.д). Остается его только инициализовать setText:, расчитать его высоту и изменить ее. Но вот в чем загвоздка
Метод
Objective-C
1
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
вызывается раньше чем
Objective-C
1
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
Как я выхожу из этого
Objective-C
1
2
3
4
5
6
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
     id dataModel = [dataSource objectAtIndex:indexPath.row]
     CustomCell *cell = [tableView dequeueReusableCellWithIdentifier:@"customCell"];
     [cell loadFromData:dataModel];
     return cell.height;
}
Т.е в методе loadFromData, я инициализирую UI, расчитую размеры label при этом учитываю все параметры которые выставлены исп interfaceBuilder, и уже знаю высоту ячеки.
Но как-то это мне не нравится, возможно вы знаете лучшие варианты. Буду рад любым советам опытных людей.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.03.2014, 19:07
Здравствуйте! Я подобрал для вас темы с ответами на вопрос The best way to calculate UITableViewCell height (Objective-C):

Редактирование заголовка UITableViewCell - Objective-C
Здравствуйте. Я делаю сейчас небольшое задание по Objective-C. Это обычный To-Do List. По кнопке + на новом экране создается объект...

Отображение UITableViewCell в UIStoryboard - Objective-C
Всем доброго времени суток, меня интересует вопрос: как выводить ячейки в Objective-C я создал 10 ячеек, но вывел только 1 как вывести...

Изменение высоты UITableViewCell - Objective-C
Нужно сделать таблицу, ячейки которой при нажатии расширяются по высоте и меняют положение картинки и текста как на картинке. Почитал про...

Изображение перед uitableviewcell как? - Программирование iOS
Здравствуйте. Как добавить изображение перед ячейками? Скрин: http://prntscr.com/14kpgp Двигаю ячейки и выше их идет изображение....

Работа с кастомными UITableViewCell и MVC - Программирование iOS
Всем привет! У меня есть привычка при работе со своими кастомными ячейками делать так: Допустим, есть ячейка, отображающая данные...

Кастомная UITableViewCell как в iMessage - Objective-C
Целый день мучаюсь с кастомной ячейкой. Решил начать с нуля. Хочу создать ячейку на подобии как в iMessage. Но сразу возникает вопрос -...

7
zulkis
682 / 609 / 38
Регистрация: 13.01.2011
Сообщений: 1,724
21.03.2014, 21:01 #2
Если данные не меняются в процессе пользования - высоту можно посчитать и положить в массив в методах
- init, -viewDidLoad, и прочих.
Затем возвращать значение по индексу из массива в -tableView:heightForRowAtIndexPath: методе
Если же они могут меняться - тогда либо как вы делаете, либо высчитывать высоту но без использования представления. То есть только из информации модели.

Еще можете посмотреть на метод -tableView:estimatedHeightForRowAtIndexPath:. Но он только с iOS7
0
Pro2005
44 / 44 / 3
Регистрация: 27.05.2013
Сообщений: 163
22.03.2014, 11:49  [ТС] #3
Цитата Сообщение от zulkis Посмотреть сообщение
Если данные не меняются в процессе пользования - высоту можно посчитать и положить в массив в методах
- init, -viewDidLoad, и прочих.
Затем возвращать значение по индексу из массива в -tableView:heightForRowAtIndexPath: методе
Если же они могут меняться - тогда либо как вы делаете, либо высчитывать высоту но без использования представления. То есть только из информации модели.
Еще можете посмотреть на метод -tableView:estimatedHeightForRowAtIndexPath:. Но он только с iOS7
В данном случае, если я буду расчитывать высоту ячейки в классе в котором реализуется метод
-tableView:heightForRowAtIndexPath:
мне прийдется в этом классе хранить константы, такие как UIFont, maxWeight - они необходимы для расчета. Да я так тоже делал не однократно... НО... к примеру реализовали, и мне нужно изменить размер шрифта да и вообще шрифт поменять. Я захожу в InterfaceBuilder - редактирую шрифт, и тогда мне еще прийдется редактировать класс с методами - init, -viewDidLoad,-tableView:estimatedHeightForRowAtIndexPath: ... Т.е редактировать в 2-ух местах, мне это ужасно не нравится.
0
Pro2005
44 / 44 / 3
Регистрация: 27.05.2013
Сообщений: 163
26.03.2014, 18:19  [ТС] #4
Блин... неужели я один морочу этим голову ))
0
zulkis
682 / 609 / 38
Регистрация: 13.01.2011
Сообщений: 1,724
26.03.2014, 20:31 #5
Pro2005, нет, я например, уже "наморочился", и делаю это как выше написал. 1 раз написал, потом пользуешься.
0
Pro2005
44 / 44 / 3
Регистрация: 27.05.2013
Сообщений: 163
26.03.2014, 21:00  [ТС] #6
Цитата Сообщение от zulkis Посмотреть сообщение
я например, уже "наморочился", и делаю это как выше написал. 1 раз написал, потом пользуешься.
Но вы как я понимаю не используете storyboard/xib. Я прав ?
0
noname_club
103 / 94 / 10
Регистрация: 01.05.2013
Сообщений: 598
29.03.2014, 02:39 #7
Но вот в чем загвоздка
Метод вызывается раньше чем
Данные для ячеек уже должны быть известны, еще до построения ячейки

=>
при вызове метода
Objective-C
1
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
уже известно какой текст пойдет внутрь

Добавлено через 9 минут
рассчитать высоту можно через вот эту функцию

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
-(float) IOS_text_height: (NSString*) text
                    font: (UIFont*) font
                    width: (NSUInteger) width {
                    
#define __cuios7 70000
#define __cuios6 60000
 
    float IOSVersion = [[[UIDevice currentDevice] systemVersion] floatValue];
 
    if (!font || !text) {
        NSLog(@"IOS_text_height text OR font is NULL");
        return 0;
    }
    
    CGSize constraintSize = CGSizeMake(width, MAXFLOAT);
    
    CGSize labelSize = CGSizeZero;
 
    if (IOSVersion<6) {
        labelSize = [text sizeWithFont:font
                     constrainedToSize:constraintSize
                         lineBreakMode:UILineBreakModeWordWrap];
    }
    
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= __cuios6
    if (IOSVersion>=6 && IOSVersion<7) {
        labelSize = [text sizeWithFont:font
                     constrainedToSize:constraintSize
                         lineBreakMode:NSLineBreakByWordWrapping];
    }
#endif
 
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= __cuios7
    if (IOSVersion >= 7) {
        
        NSMutableAttributedString *atext = [[NSMutableAttributedString alloc] initWithString:text attributes:@{NSFontAttributeName: font}];
        CGRect arect = [atext boundingRectWithSize:constraintSize options: NSStringDrawingUsesLineFragmentOrigin context:nil];
        
        labelSize = arect.size;
    }
#endif
 
 
    return labelSize.height;
}
0
zulkis
682 / 609 / 38
Регистрация: 13.01.2011
Сообщений: 1,724
29.03.2014, 10:08 #8
Pro2005, нет вы не правы. Конечно же я их использую.
Статический метод в классе, отвечающем за ячейку - и все.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.03.2014, 10:08
Привет! Вот еще темы с ответами:

Неизвестный объект занимает всю область ячейки UITableViewCell - Objective-C
Есть класс наследованный от UITableViewController в методе tableView:cellForRowAtIndexPath я получаю ячейку: cell = ;потом создаю...

блоки с height внутри min-height не растягиваются или wrapper не растягивается - HTML, CSS
вот такой вот пример &lt;html&gt; &lt;head&gt; &lt;style type=&quot;text/css&quot;&gt; * {margin:0; padding:0;} html {height:100%; } body...

max-height и min-height резиновый блок - HTML, CSS
есть див &lt;div class=&quot;main&quot;&gt;&lt;/div&gt; подключены стили .main{ border:1px solid #0C0; max-width:3000px; min-width:1000px; ...

height внутри min-height - HTML, CSS
структура такова &lt;div id=&quot;wrapper&quot;&gt; # min-height 100% &lt;div id=&quot;block1&quot;&gt; height 60% width 30% float:left &lt;/div&gt; &lt;div...


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

Или воспользуйтесь поиском по форуму:
8
Yandex
Объявления
29.03.2014, 10:08
Ответ Создать тему
Опции темы

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