«сбросить» ячейки после изменения ориентации - PullRequest
1 голос
/ 17 апреля 2010

Я добавил интерфейс Ориентация в свое приложение. Это прекрасно работает относительно взглядов. Некоторые из ячеек таблицы, которые я определил с помощью CGRect для размещения текста в ячейке. В портретном режиме длина ячейки составляет 300 пикселей, в ландшафтном режиме - 420 пикселей. Я использую следующий код для изменения CGRects в зависимости от ориентации:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    if (self.interfaceOrientation == UIDeviceOrientationPortrait) {
        NSString *currentLanguage = [[NSString alloc] initWithContentsOfFile:[NSHomeDirectory() stringByAppendingPathComponent:@"/Documents/sprache.txt"]]; 
        static NSString *TableViewTableCellIdentifier = @"TableViewTableCellIdentifier";
        UITableViewCell *cell = (UITableViewCell *) [tableView dequeueReusableCellWithIdentifier:TableViewTableCellIdentifier];

        CGRect cellRect = CGRectMake(0, 0, 300, 175);
        cell.backgroundColor = [UIColor darkGrayColor];
        cell = [[[UITableViewCell alloc] initWithFrame:cellRect reuseIdentifier:TableViewTableCellIdentifier] autorelease];

        CGRect keyLabelRect = CGRectMake(0, 5, 5, 20);
        UILabel *keyLabel = [[UILabel alloc]initWithFrame:keyLabelRect];
        keyLabel.tag = 100; //.........
    } else {
        NSString *currentLanguage = 
            [[NSString alloc] initWithContentsOfFile:[NSHomeDirectory() stringByAppendingPathComponent:@"/Documents/sprache.txt"]];   
        static NSString *TableViewTableCellIdentifier = @"TableViewTableCellIdentifier";

        UITableViewCell *cell = (UITableViewCell *) [tableView dequeueReusableCellWithIdentifier:TableViewTableCellIdentifier];

        CGRect cellRect = CGRectMake(0, 0, 450, 175);
        cell.backgroundColor = [UIColor darkGrayColor];
        cell = [[[UITableViewCell alloc] initWithFrame:cellRect reuseIdentifier:TableViewTableCellIdentifier] autorelease];

        CGRect keyLabelRect = CGRectMake(0, 5, 5, 20);
        UILabel *keyLabel = [[UILabel alloc] //.....
    }
}

Моя проблема в том, что когда таблица видна и ориентация меняется, мне нужно прокрутить, чтобы увидеть новый «макет». Как мне удается «перезагрузить» вид после изменения ориентации?

Ответы [ 2 ]

1 голос
/ 17 апреля 2010

Прежде всего, это будет течь, как сумасшедший. Вы создаете ячейки и удаляете их из очереди, но никогда не выпускаете их. Вы просто создаете совершенно новую ячейку каждый раз, когда ячейка запрашивается. Нет причин для воссоздания ячейки, если вы удаляете ее из очереди, и наоборот. Что еще более важно, вы создаете столько ячеек, сколько у вас строк в логической таблице. Это съест всю вашу память очень быстро.

Когда вы удаляете ячейку из очереди, вам нужно проверить, подходит ли ей размер кадра, и повторно использовать его, если он есть. Если это не так, то вам нужно освободить ячейку и создать другую.

Во-вторых, таблица не будет запрашивать новые ячейки, пока вы не прокрутите существующие ячейки за пределы экрана. Вот почему ваши клетки не меняются, пока вы не прокрутите. Это ожидаемое поведение таблицы.

Моя постоянная рекомендация для любого умеренно сложного вида - использовать разные пары вид-контроллер / вид для каждой ориентации. Это похоже на большую работу, но обычно я считаю, что на самом деле это занимает меньше времени, и им легче управлять. В этом случае наличие двух отдельных таблиц, вероятно, избавит вас от многих неприятностей.

0 голосов
/ 17 апреля 2010

Я почти уверен, что вам не нужно указывать фрейм во время создания UITableViewCell по умолчанию. Обычно размер кадра обрабатывается самим UITableView.

Но если вы хотите, вы можете отправить setNeedsLayout и / или setNeedsDisplay сообщение в tableView, чтобы принудительно обновить макет ячейки (в обработчике ориентации).

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