改变方向后“重置”单元格

时间:2010-04-17 13:10:26

标签: iphone iphone-sdk-3.0

我将interfaceOrientation添加到了我的应用中。它对视图很好。我在CGRects中定义的一些表格单元格,用于将文本放置在单元格中。在纵向模式下,单元格长300px,横向模式为420px。我使用以下代码根据方向更改CGRect:

- (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 个答案:

答案 0 :(得分:1)

首先,这会像疯了一样泄漏。您创建单元格并将它们出列但您永远不会释放它们。您只需在每次请求单元格时创建一个全新的单元格。如果你出队,没有理由重新创建一个单元格,反之亦然。更重要的是,您可以创建与逻辑表中的行一样多的单元格。这将很快消耗你所有的记忆。

当您将单元格出列时,您需要检查它的框架是否正确,如果是,则重新使用它。如果不是,那么您需要释放单元格并创建另一个单元格。

其次,在您将现有单元格从屏幕上滚动之前,表格不会要求新单元格。这就是为什么你的单元格在滚动之前不会改变的原因。这是tableview的预期行为。

我对任何中等复杂视图的建议是为每个方向使用不同的视图 - 控制器/视图对。这似乎更多的工作,但通常我发现它实际上需要更少,它更容易管理。在这种情况下,拥有两个单独的表可能会为您带来很多悲伤。

答案 1 :(得分:0)

我很确定您在默认的UITableViewCell构造期间不需要指定帧。通常帧大小由UITableView本身处理。

但是如果您希望可以将setNeedsLayout和/或setNeedsDisplay消息发送到tableView以强制它更新单元格布局(在方向处理程序中)。