Форум программистов, компьютерный форум 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. Просмотров 1382. Ответов 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, и уже знаю высоту ячеки.
Но как-то это мне не нравится, возможно вы знаете лучшие варианты. Буду рад любым советам опытных людей.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
zulkis
681 / 608 / 38
Регистрация: 13.01.2011
Сообщений: 1,724
21.03.2014, 21:01     The best way to calculate UITableViewCell height #2
Если данные не меняются в процессе пользования - высоту можно посчитать и положить в массив в методах
- init, -viewDidLoad, и прочих.
Затем возвращать значение по индексу из массива в -tableView:heightForRowAtIndexPath: методе
Если же они могут меняться - тогда либо как вы делаете, либо высчитывать высоту но без использования представления. То есть только из информации модели.

Еще можете посмотреть на метод -tableView:estimatedHeightForRowAtIndexPath:. Но он только с iOS7
Pro2005
44 / 44 / 3
Регистрация: 27.05.2013
Сообщений: 163
22.03.2014, 11:49  [ТС]     The best way to calculate UITableViewCell height #3
Цитата Сообщение от zulkis Посмотреть сообщение
Если данные не меняются в процессе пользования - высоту можно посчитать и положить в массив в методах
- init, -viewDidLoad, и прочих.
Затем возвращать значение по индексу из массива в -tableView:heightForRowAtIndexPath: методе
Если же они могут меняться - тогда либо как вы делаете, либо высчитывать высоту но без использования представления. То есть только из информации модели.
Еще можете посмотреть на метод -tableView:estimatedHeightForRowAtIndexPath:. Но он только с iOS7
В данном случае, если я буду расчитывать высоту ячейки в классе в котором реализуется метод
-tableView:heightForRowAtIndexPath:
мне прийдется в этом классе хранить константы, такие как UIFont, maxWeight - они необходимы для расчета. Да я так тоже делал не однократно... НО... к примеру реализовали, и мне нужно изменить размер шрифта да и вообще шрифт поменять. Я захожу в InterfaceBuilder - редактирую шрифт, и тогда мне еще прийдется редактировать класс с методами - init, -viewDidLoad,-tableView:estimatedHeightForRowAtIndexPath: ... Т.е редактировать в 2-ух местах, мне это ужасно не нравится.
Pro2005
44 / 44 / 3
Регистрация: 27.05.2013
Сообщений: 163
26.03.2014, 18:19  [ТС]     The best way to calculate UITableViewCell height #4
Блин... неужели я один морочу этим голову ))
zulkis
681 / 608 / 38
Регистрация: 13.01.2011
Сообщений: 1,724
26.03.2014, 20:31     The best way to calculate UITableViewCell height #5
Pro2005, нет, я например, уже "наморочился", и делаю это как выше написал. 1 раз написал, потом пользуешься.
Pro2005
44 / 44 / 3
Регистрация: 27.05.2013
Сообщений: 163
26.03.2014, 21:00  [ТС]     The best way to calculate UITableViewCell height #6
Цитата Сообщение от zulkis Посмотреть сообщение
я например, уже "наморочился", и делаю это как выше написал. 1 раз написал, потом пользуешься.
Но вы как я понимаю не используете storyboard/xib. Я прав ?
noname_club
102 / 90 / 9
Регистрация: 01.05.2013
Сообщений: 581
29.03.2014, 02:39     The best way to calculate UITableViewCell height #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;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.03.2014, 10:08     The best way to calculate UITableViewCell height
Еще ссылки по теме:

Неизвестный объект занимает всю область ячейки UITableViewCell Objective-C
Кастомная UITableViewCell как в iMessage Objective-C
Objective-C Отображение UITableViewCell в UIStoryboard
VBA Calculate - пересчет листа
Редактирование заголовка UITableViewCell Objective-C

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

Или воспользуйтесь поиском по форуму:
zulkis
681 / 608 / 38
Регистрация: 13.01.2011
Сообщений: 1,724
29.03.2014, 10:08     The best way to calculate UITableViewCell height #8
Pro2005, нет вы не правы. Конечно же я их использую.
Статический метод в классе, отвечающем за ячейку - и все.
Yandex
Объявления
29.03.2014, 10:08     The best way to calculate UITableViewCell height
Ответ Создать тему
Опции темы

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