2010-04-17 84 views
1

我將interfaceOrientation添加到我的應用程序。關於意見,它工作得很好。一些由CGRects定義的表格單元將文本定位在單元格中。縱向模式下,單元格長度爲300px,橫向模式爲420px。我使用下面的代碼來改變依賴於方位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] //..... 
    } 
} 

我的問題是,當表可見,並且方向改變,我需要滾動才能看到新的「佈局」。如何在更改方向後設法「重新加載」視圖?

回答

1

首先,這會像瘋了一樣泄漏。你創建單元格並將它們出列,但是你永遠不會釋放它們。每次請求單元格時,您只需創建一個全新的單元格。如果您離隊,則沒有理由重新創建單元格,反之亦然。更重要的是,創建與您的邏輯表中的行一樣多的單元格。那會很快消耗你所有的記憶。

當你出隊一個單元格時,你需要檢查它的框架是否合適,如果是的話就重用。如果不是,那麼你需要釋放單元格並創建另一個單元格。

其次,表格不會要求新的單元格,直到您從屏幕上滾動現有的單元格。這就是爲什麼你的單元格不會改變,直到你滾動。這是tableview的預期行爲。

我對任何中等複雜視圖的常見建議是對每個方向使用不同的視圖控制器/視圖對。看起來更多的工作,但通常我發現它實際上花費更少,管理更容易。在這種情況下,擁有兩張獨立的桌子可能會爲你節省很多的痛苦。

+0

您對不同視圖控制器的建議可以正常工作。謝謝。但是,如何在用戶更改方向時進行管理?我在viewcontroller0中決定了方向:縱向 - > viewControllerA,橫向 - > viewControllerB。例如,viewControllerA被選中,然後用戶改變方向。他必須退出實際的viewControllerA,然後選擇正確的viewControllerB。 – Christian 2010-04-17 19:51:28

+0

在每個控制器的'willRotateToOrientation'方法中,您將該方向的視圖控制器推送到沒有動畫的導航堆棧上。當您旋轉回來時,您會關閉最後一個視圖。用戶不能說他們是不同的意見。 – TechZen 2010-04-17 20:46:01

0

我很確定你不需要在默認的UITableViewCell構造過程中指定框架。通常幀大小由UITableView本身處理。

但是,如果你希望你可以發送setNeedsLayout和/或setNeedsDisplay消息到tableView來強制它更新單元佈局(在方向處理程序中)。

+0

我試了兩個。但沒有任何改變。在改變方向時,我仍然需要滾動以將縱向的CGRect替換爲CGRects的橫向。我需要CGRects將文本放置在默認tableviewcell中的不同位置。 – Christian 2010-04-17 14:40:52