2010-07-28 4 views
13

У меня есть код, который создает ячейку таблицы со слайдером. Это довольно просто, и он отлично подходит для iPhone. Я немного анонимизировал его здесь:Изменение размера содержимого UITableViewCell автоматически

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 по умолчанию, поэтому ничего не изменилось.

Я бы хотел, чтобы содержимое этой ячейки автоматически изменялось, чтобы быть «полной» шириной ячейки, независимо от устройства и ориентации. Есть простой способ сделать это?

ответ

3

Вы должны иметь возможность сообщить системе изменения размера «привязать» объект к фиксированному расстоянию от правого края (где он не изменяется достаточно далеко). Если вы экспериментируете с IB, вы можете создать представление, изменяющееся в ширину и фиксированное с правой стороны.

У вас есть комплект UIViewAutoresizingFlexibleRightMargin?

+0

У меня нет набора 'UIViewAutoresizingFlexibleRightMargin'. Можете ли вы объяснить немного больше, как это сделать программно? Приведенный выше код анонимен, но именно то, что у меня есть сейчас. –

10

Он работает именно так, как вы описали. Я склонен думать, что это ошибка IOS. На iPAD, когда вы создаете новый UITableViewCell, его ширина установлена ​​на 320. hardcoded (!) Как view, так и contentView. Он не изменяется правильно, если установлен в UIViewAutoresizingFlexibleWidth. У меня было установлено view.frame.size.width/2 с забавными результатами: на iPhone это 160, на iPad - 608 !!!

В результате я вручную изменил размеры своих ячеек и их содержимого.

+1

Да, похоже, что его всегда 320 при первом создании – onmyway133

+0

Это не ошибка, «contentMode» просто неправильно. Смотри ниже. –

6

Бит поздно, но сегодня я нашел решение того же вопроса, но вам нужно создать пользовательский 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 является фактическим один.
И он также работает с вращением устройства.

+0

Вам не нужно вручную устанавливать эти рамки в представлении. Вам просто нужно вызвать '[super layoutSubviews];' там, чтобы сделать subviews автоматически отрегулированным. – Hlung

+1

Если у вас есть пользовательские подзаголовки (в вашей пользовательской ячейке) –

+1

на layoutSubviews, docs говорится: «Вы не должны вызывать этот метод напрямую». Вместо этого вызовите setNeedsLayout –

3

Установите contentMode на номер UIViewContentModeRedraw.

+0

Сделал трюк для меня – Jasper

Смежные вопросы