Я создал пользовательский UITableViewCell, используя следующий код:
- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
if (self) {
mapButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
[[self contentView] addSubview:mapButton];
houseNumberLabel = [[UILabel alloc] initWithFrame:CGRectZero];
[[self contentView] addSubview:houseNumberLabel];
[houseNumberLabel release];
NSArray *segmentArray = [[NSArray alloc] initWithObjects:@"Yes", @"No", nil];
segmentedControl = [[UISegmentedControl alloc] initWithItems:segmentArray];
[segmentArray release];
[segmentedControl setSegmentedControlStyle:UISegmentedControlStyleBar];
[[self contentView] addSubview:segmentedControl];
[segmentedControl release];
disclosureButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
[[self contentView] addSubview:disclosureButton];
}
return self;
}
Затем я переопределил метод layoutSubviews в пользовательской ячейке следующим кодом:
- (void)layoutSubviews
{
[super layoutSubviews];
CGRect viewBounds = [[self contentView] bounds];
float h = viewBounds.size.height;
float w = viewBounds.size.width;
float inset = 20.0;
float mapButtonWidth = mapButton.frame.size.width;
float segmentWidth = 140.0;
float disclosureButtonWidth = disclosureButton.frame.size.width;
float houseNumberLabelWidth = viewBounds.size.width - (mapButtonWidth + inset + inset + segmentWidth + inset + disclosureButtonWidth + inset);
CGRect frame = CGRectMake(0, 0, h, mapButtonWidth);
[mapButton setFrame:frame];
frame.origin.x += mapButtonWidth + inset;
frame.size.width = houseNumberLabelWidth;
[houseNumberLabel setFrame:frame];
frame.origin.x += houseNumberLabelWidth + inset;
frame.size.width = segmentWidth;
[segmentedControl setFrame:frame];
frame.origin.x += segmentWidth + inset;
frame.size.width = disclosureButtonWidth;
[disclosureButton setFrame:frame];
}
Я добавил журналы для этих функций, и они вызываются каждый раз, когда создается ячейка. Проблема заключается в том, что UITableViewController сначала загружает и отображает ячейки, отображаемые в ячейках, отформатированные так, как если бы layoutSubviews никогда не вызывался (хотя в соответствии с имеющимся у него журналом). Однако, когда я прокручиваю табличное представление, новые ячейки (которые были вне экрана) отображаются правильно. Затем я прокручиваю назад и первые ячейки теперь правильные. Это как будто layoutSubviews вызывается, но когда табличное представление загружается впервые, оно не понимает, что ему нужно выполнить рендеринг с использованием нового макета.
Я добавил reloadData для viewWillAppear, который частично устраняет проблему, однако последняя ячейка (которая находится за пределами экрана) по-прежнему отображает неправильный путь. Я выдергиваю волосы.
[SUBNOTE] Я только что добавил журнал в:
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
И это выполняется 8 раз (по одному для каждой ячейки, отображаемой в первую очередь для табличного представления) ПЕРЕД вызовом layoutSubviews. layoutSubviews вызывается после этого (следовательно, почему формат неправильный). Должен ли я добавить [cell layoutSubviews] здесь (он работает, но потом вызывается снова) или есть другой способ?