Форум программистов, компьютерный форум, киберфорум
Наши страницы
Objective-C
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
vitalik_a
4 / 4 / 1
Регистрация: 11.09.2014
Сообщений: 81
1

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

11.09.2014, 23:14. Просмотров 932. Ответов 12
Метки нет (Все метки)

Есть класс наследованный от UITableViewController
в методе tableView:cellForRowAtIndexPath я получаю ячейку:
Objective-C
1
cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
потом создаю картинку (UIImageView) и текст (UILabel) и вставляю их в ячейку с помощью addSubview

но мои картинку и текст закрывает неизвестный белый объект, растянутый на всю ячейку, свои элементы я вижу только потому что они не помещаются в ячейке и выглядываю снизу

что это за белый объект?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.09.2014, 23:14
Ответы с готовыми решениями:

The best way to calculate UITableViewCell height
Привет всем. Назрел довольно давний вопрос. Все мы пользуемся чудесными...

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

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

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

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

12
edward_jonson
160 / 160 / 68
Регистрация: 23.02.2011
Сообщений: 392
12.09.2014, 00:31 2
Скриншот был бы очень кстати.
0
vitalik_a
4 / 4 / 1
Регистрация: 11.09.2014
Сообщений: 81
12.09.2014, 00:49  [ТС] 3
сделал разные высоты ячеек, белая область всегда на всю ячейку
0
Миниатюры
Неизвестный объект занимает всю область ячейки UITableViewCell   Неизвестный объект занимает всю область ячейки UITableViewCell   Неизвестный объект занимает всю область ячейки UITableViewCell  

edward_jonson
160 / 160 / 68
Регистрация: 23.02.2011
Сообщений: 392
12.09.2014, 01:17 4
Покажите ваш метод tableView:cellForRowAtIndexPath
0
vitalik_a
4 / 4 / 1
Регистрация: 11.09.2014
Сообщений: 81
12.09.2014, 11:31  [ТС] 5
вот tableView:cellForRowAtIndexPath, я в нём вызываю ещё один метод так как будут разные типы ячеек
Кликните здесь для просмотра всего текста

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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    //
    NSLog(@"Вызван метод NewsMainViewController::cellForRowAtIndexPath");
    //
    static NSString *CellIdentifier = @"Cell Identifier";
    // Создаём указатель на ячейку
    NewsTableViewCell *cell = nil;
    //
    [tableView registerClass:[NewsTableViewCell class] forCellReuseIdentifier:CellIdentifier];
    //
    cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
    // Если это наша таблица
    if ([tableView isEqual:self.tableView])
    {
        //
        if (indexPath.section == 0 && indexPath.row == 0)
        {
            //
            cell = [self tableView: tableView cellMainNews: cell ForRowAtIndexPath:indexPath];
        }
    }
    // Возвращаем указатель на объект ячейки
    return cell;
}
 
 
// Метод создаёт ячейку с главной новостью на главной странице
- (NewsTableViewCell *)tableView:(UITableView *)tableView cellMainNews: (NewsTableViewCell *)cell ForRowAtIndexPath:(NSIndexPath *)indexPath
{
    // Высота картинки
    CGFloat imageHeight = 0;
    // Если есть картинка новости
    if (self.model.newsMainItem.image != nil)
    {
        // Вычисляем ширину картинки по ширине таблицы
        CGFloat imageWidh = self.tableView.contentSize.width;
        // Вычисляем пропорциональную высоту картинки
        imageHeight = self.tableView.contentSize.width / self.model.newsMainItem.image.size.width * self.model.newsMainItem.image.size.height;
        // Создаём объект представления картинки
        cell.image.frame = CGRectMake(0, 0, imageWidh, imageHeight);
        // Устанавливаем масштабирование картинки
        cell.image.contentMode = UIViewContentModeScaleAspectFill;
        // Устанвливаем картинку
        cell.image.image = self.model.newsMainItem.image;
    }
    else
    {
        // Загружаем картинку
        [self.model.newsMainItem loadImage];
    }
    // Высота заголовка
    CGFloat titleLabelHeight = 0;
    // Устанавливаем текст заголовка
    cell.title.text = self.model.newsMainItem.title;
    //
    titleLabelHeight = [self expectedLabelSize:cell.title maximumLabelSize:CGSizeMake(320, 640)];
    //
    cell.title.frame = CGRectMake(0, imageHeight, 320, titleLabelHeight);
    // Высота заголовка
    CGFloat createdLabelHeight = 0;
    // Устанавливаем текст заголовка
    cell.created.text = self.model.newsMainItem.created;
    //
    createdLabelHeight = [self expectedLabelSize:cell.created maximumLabelSize:CGSizeMake(320, 640)];
    //
    cell.created.frame = CGRectMake(0, imageHeight + titleLabelHeight, 320, createdLabelHeight);
    // Возвращаем указатель на объект ячейки
    return cell;
}
а это переопределённый метод класса NewsTableViewCell
Кликните здесь для просмотра всего текста

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
- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
    //
    NSLog(@"Вызван метод NewsTableViewCell::initWithStyle");
    //
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    //
    self.image = [[UIImageView alloc] init];
    // Добавляем картинку в ячейку
    [self addSubview:self.image];
    //
    self.title = [[UILabel alloc] init];
    //
    self.title.numberOfLines = 0;
    // Добавляем загловок в ячейку
    [self addSubview:self.title];
    //
    self.created = [[UILabel alloc] init];
    //
    self.title.numberOfLines = 0;
    // Добавляем дату создания в ячейку
    [self addSubview:self.created];
    //
    return self;
}


Добавлено через 10 часов 6 минут
если надо я могу сократить код tableView:cellForRowAtIndexPath до нескольких строк
0
noname_club
107 / 98 / 12
Регистрация: 01.05.2013
Сообщений: 603
12.09.2014, 13:29 6
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
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
 
    //
    //static NSString *CellIdentifier = @"Cell Identifier"; // << статик не требуется
    // Создаём указатель на ячейку // << 
    
    
    NewsTableViewCell *cell = nil;
    //
    //[tableView registerClass:[NewsTableViewCell class] forCellReuseIdentifier:CellIdentifier]; 
    // << регистрация требуется только для UICollectionView , для таблицы это писать не нужно
    //
    
    cell = [tableView dequeueReusableCellWithIdentifier:@"Cell Identifier" forIndexPath:indexPath]; 
   // <<  если ячейка находится на сториборде то этого кода достаточно для инициализации экземпляра ячейки
    
    
    // Если это наша таблица
    if (tableView  == self.tableView) // << UIview объекты сравниваются через == равенство
    {
        //
        if (indexPath.section == 0 && indexPath.row == 0)
        {
            //
            cell = [self tableView: tableView cellMainNews: cell ForRowAtIndexPath:indexPath];
        }
    }
    // Возвращаем указатель на объект ячейки
    return cell;
}
Добавлено через 5 минут
Может пригодится пример программного рассчета высот текста в таблицах

http://www.imaladec.com/forum/index....post__p__11740
0
vitalik_a
4 / 4 / 1
Регистрация: 11.09.2014
Сообщений: 81
12.09.2014, 14:03  [ТС] 7
сториборда у меня нет
0
noname_club
107 / 98 / 12
Регистрация: 01.05.2013
Сообщений: 603
12.09.2014, 14:05 8
еще скажите что *.xib ячейки тоже нет.
0
vitalik_a
4 / 4 / 1
Регистрация: 11.09.2014
Сообщений: 81
12.09.2014, 14:30  [ТС] 9
xib - тоже нет
0
noname_club
107 / 98 / 12
Регистрация: 01.05.2013
Сообщений: 603
12.09.2014, 14:31 10
тогда на кофейной гуще гадать будет сложно.
0
vitalik_a
4 / 4 / 1
Регистрация: 11.09.2014
Сообщений: 81
12.09.2014, 14:31  [ТС] 11
у меня в ячейке всего три элемента: картинка и два текста
я хочу их программно создать и разместить на ячейке
0
noname_club
107 / 98 / 12
Регистрация: 01.05.2013
Сообщений: 603
12.09.2014, 14:44 12
тогда не в конструкторе initWithStyle

Инициализацию UView компонентов лучше делать в didMoveToSuperView:

Objective-C
1
2
3
4
5
6
7
8
9
10
11
-(void)didMoveToSuperview {
    if (self.tag == 0 && self.tag++ == 0) {
        
       UIView *z = [[UIView alloc] initWithFrame: CGRectMake(0,0,50,50)];
       z.backgroundColor = [UIColor redColor];
       
       [self.contentView addSubview: z];
 
    } // end init
 
}
Добавлено через 5 минут
кстати еще грубая ошибка.
У ячеек нужно вьюшки добавлять на .contentView а не на саму ячейку
0
vitalik_a
4 / 4 / 1
Регистрация: 11.09.2014
Сообщений: 81
12.09.2014, 16:30  [ТС] 13
Инициализацию UView компонентов лучше делать в didMoveToSuperView
инициализация должна выполняться только один раз или при каждом обновлении таблицы?

Добавлено через 36 минут
проблема белого прямоугольника решена
после загрузки картинки я использовал:
Objective-C
1
[self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:[NSIndexPath indexPathForRow:0 inSection:0]] withRowAnimation:UITableViewRowAnimationNone];
я думал что это тоже самое что:
Objective-C
1
[self.tableView reloadData];
но только для одной ячейки

но оказалось что reloadRowsAtIndexPaths заново вызывает инициализацию ячейки, а tableView reloadData вызывает prepareForReuse
0
12.09.2014, 16:30
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.09.2014, 16:30

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

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

Если создать объект Graphics в модуле или в форме, то картинка прорисовывается не на всю область видимости
Здравствуйте, если создать объект Graphics в модуле или в форме, то картинка...


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

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

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