Форум программистов, компьютерный форум, киберфорум
Наши страницы
Objective-C
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.56/9: Рейтинг темы: голосов - 9, средняя оценка - 4.56
Pro2005
44 / 44 / 3
Регистрация: 27.05.2013
Сообщений: 163
1

The best way to calculate UITableViewCell height

21.03.2014, 19:07. Просмотров 1632. Ответов 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
Ответы с готовыми решениями:

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

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

Редактирование заголовка UITableViewCell
Здравствуйте. Я делаю сейчас небольшое задание по Objective-C. Это обычный...

Работа с кастомными UITableViewCell и MVC
Всем привет! У меня есть привычка при работе со своими кастомными ячейками...

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

7
zulkis
684 / 611 / 43
Регистрация: 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
684 / 611 / 43
Регистрация: 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
106 / 97 / 12
Регистрация: 01.05.2013
Сообщений: 603
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
684 / 611 / 43
Регистрация: 13.01.2011
Сообщений: 1,724
29.03.2014, 10:08 8
Pro2005, нет вы не правы. Конечно же я их использую.
Статический метод в классе, отвечающем за ячейку - и все.
0
29.03.2014, 10:08
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.03.2014, 10:08

Изображение перед uitableviewcell как?
Здравствуйте. Как добавить изображение перед ячейками? Скрин:...

Неизвестный объект занимает всю область ячейки UITableViewCell
Есть класс наследованный от UITableViewController в методе...

блоки с height внутри min-height не растягиваются или wrapper не растягивается
вот такой вот пример &lt;html&gt; &lt;head&gt; &lt;style type=&quot;text/css&quot;&gt; *...


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

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

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