Изменение размера содержимого 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.