Изменение размера содержимого UITableViewCell автоматически
У меня есть код, который создает ячейку таблицы со слайдером. Это довольно просто, и он хорошо подходит для iPhone. Я немного анонимизировал его здесь:
UITableViewCell* cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"Foo"] autorelease];
cell.selectionStyle = UITableViewCellSelectionStyleNone;
CGRect contentViewFrame = cell.contentView.frame;
CGRect sliderFrame = CGRectMake(10, 0, 280, contentViewFrame.size.height);
UISlider* slider = [[UISlider alloc] initWithFrame:sliderFrame];
UIImage* minimumImage = [UIImage imageNamed:@"min.png"];
UIImage* maximumImage = [UIImage imageNamed:@"max.png"];
slider.minimumValueImage = minimumImage;
slider.maximumValueImage = maximumImage;
slider.value = 0.5f;
[slider addTarget:self action:@selector(sliderAction:) forControlEvents:UIControlEventValueChanged];
[cell.contentView addSubview:slider];
[slider release];
Конечно, это неправильно для iPad. Поэтому моя первая мысль заключалась в том, чтобы установить свойство autoresizingMask
на UIViewAutoresizingFlexibleWidth
. Проблема решена, не так ли? Неа. Теперь на iPhone ширина содержимого слайдера плюс-изображения меньше 280, и поэтому он не подходит до конца - он заканчивается примерно на 20 пикселей.
На iPad одно и то же - ширина UISlider
автоматически изменяется на 20 пикселей меньше конца ячейки.
Возможно, флаг автоматического изменения размера обращает внимание на несуществующий accessoryView
ячейки? Я попытался установить его на nil
явно, но я думаю, что он nil
по умолчанию, поэтому ничего не изменилось.
Я хотел бы, чтобы этот контент ячейки автоматически изменялся, чтобы быть "полной" шириной ячейки, независимо от устройства и ориентации. Есть ли простой способ сделать это?
Ответы
Ответ 1
Он работает точно так, как вы описали. Я склонен думать, что это ошибка iOS. На iPAD, когда вы создаете новый UITableViewCell, его ширина установлена на 320. hardcoded (!) Как view, так и contentView. Он не изменяется правильно, если установлен на UIViewAutoresizingFlexibleWidth
. У меня было установлено view.frame.size.width/2 со смешными результатами: на iPhone это 160, на iPad это 608!!!
В результате я вручную изменил размеры своих ячеек и их содержимого.
Ответ 2
Бит поздно, но сегодня я нашел решение того же вопроса, но вам нужно создать пользовательский UITableViewCell.
Затем вы можете перезаписать функцию
- (void) layoutSubviews
{
[dateLabel setFrame:CGRectMake(10.f, 16.f, 80.f, 12.f)];
[textLabel setFrame:CGRectMake(106.f, 16.f, contentView.frame.size.width-105.f + 1.f, 12.f)];
}
В этой функции self.frame.size.width является фактическим.
И он также работает с вращением устройства.
Ответ 3
Вы должны иметь возможность сообщить системе изменения размера "привязать" объект к фиксированному расстоянию от правого края (где он не будет изменять размер достаточно далеко). Если вы экспериментируете с IB, вы можете создать представление, изменяющееся в ширину и закрепленное на правой стороне.
У вас установлен UIViewAutoresizingFlexibleRightMargin?
Ответ 4
Установите ячейку contentMode
на UIViewContentModeRedraw
.