Пользовательский UITableViewCell не отображается правильно, когда UITableViewController впервые загружается - PullRequest
1 голос
/ 10 февраля 2012

Я создал пользовательский 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] здесь (он работает, но потом вызывается снова) или есть другой способ?

1 Ответ

0 голосов
/ 15 февраля 2012

Я решил (я немного смущен этой ошибкой), но я изначально неправильно устанавливал размеры CGRect.Я ставил высоту по ширине и ширину по высоте.Код должен быть:

CGRect frame = CGRectMake(0, 0, mapButtonWidth, h);

Достаточно простая ошибка, но она приводит к необычным результатам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...