2011-09-10 69 views
0

我目前正在嘗試使用UITableViewController的任務是在縱向模式下使用單列單元行,在橫向模式下使用雙列單元格行。這只是爲了方便查看(使用可用寬度空間查看更多行 - 單元格),因此兩個列單元格的格式相同。但是,我不知道如何實現。如何更改UITableViewController旋轉的外觀?

所以,想到的是我的細胞定製的東西在「cellForRowAtIndexPath」方法,並檢查當前的屏幕模式。問題是我必須在「shouldAutorotateToInterfaceOrientation」設置一些標誌或者有一些設置嗎?

其次,在「shouldAutorotateToInterfaceOrientation」中調用表重載是否足以重繪我的表的單元格?

此外,我正在考慮製作不同的筆尖並在IB中設計我的細胞。我想這是另一個問題,只是想知道這將如何影響解決方案。

回答

1

您必須檢查cellForRowAtIndexPath中的當前方向並正確配置您的單元格。您可以使用IB創建2個不同的單元格。

另外,您必須在循環事件的回調之一(shouldAutorotateToInterfaceOrientationdidRotateFromInterfaceOrientation)中調用[myTableView reloadData]。每次撥打[myTableView reloadData](所有單元格)時都會調用cellForRowAtIndexPath。 確保您使用不同的標識符來重用單元格。

編輯:這是我會怎麼編寫這樣的:

添加2個IBOutlets您.h文件中:

IBOutlet MyCustomCell1 * customCell1; 
IBOutlet MyCustomCell2 * customCell2; 

在Interface Builder中,設置每個小區的標識屬性,或許真的如cellIdentifier1cellIdentifier2。確保IB中的文件所有者是你的數據源(cellForRowAtIndexPath的實現地點)。

cellForRowAtIndexPath應該是這樣的:

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    if ([UIDevice currentDevice].orientation == UIDeviceOrientationLandscapeLeft 
    || [UIDevice currentDevice].orientation == UIDeviceOrientationLandscaperight) 
    { 
     //Landscape, lets use MyCustomCell2. 
     NSString * cellIdentifier2 = @"cellIdentifier2"; 

     MyCustomCell2 * cell = (MyCustomCell2 *) [tableView dequeueReusableCellWithIdentifier:cellIdentifier]; 

     if (cell == nil) { 
     //We have to initialize the cell, we're going to use IB 
     [[NSBundle mainBundle] loadNibNamed:@"CustomCell2NibName" owner:self options:nil]; 
     //After this, customCell2 we defined in .h is initialized from IB 
     cell = customCell2; 

     } 
     //setup the cell, set text and everything. 

     return cell; 
    } 

    else 
    { 
    //portrait case, the same as before but using CustomCell1 
    NSString * cellIdentifier1 = @"cellIdentifier1"; 

     MyCustomCell1 * cell = (MyCustomCell1 *) [tableView dequeueReusableCellWithIdentifier:cellIdentifier]; 

     if (cell == nil) { 
     //We have to initialize the cell, we're going to use IB 
     [[NSBundle mainBundle] loadNibNamed:@"CustomCell1NibName" owner:self options:nil]; 
     //After this, customCell1 we defined in .h is initialized from IB 
     cell = customCell1; 

     } 
     //setup the cell, set text and everything. 

     return cell; 


    } 

}

+0

我很不熟悉標識符:)他們是什麼?我做了一些簡單的列表而不知道它們...... – Centurion

+0

爲了加速單元格渲染過程,可以使用[yourTable dequeueReusableCellWithIdentifier]創建單元格。該選擇器返回一個UITableviewCell,如果它爲零,是第一次創建單元格並且你已經初始化它。查看[本教程](http://www.iphonedeveloperdiary.com/2010/03/correct-use-of-dequeuereusablecellwithidentifier-in-a-table-view-on-the-iphone/)或訪問iOS參考指南更多信息;) – ender

+0

謝謝,我明白了:)現在,你可以更詳細地瞭解如何設置不同的標識符?我想我應該有兩個separete調用dequeueReusableCellWithIdentifier從cellForRowAtIndexPath?我的意思是,我應該檢查當前的方向,如果(mode = portrait)然後出隊通過potrait-mode-identifier的單元格,否則使用橫向模式標識符出列?它看起來像我必須重寫cellForRowAtIndexPath方法totaly。 – Centurion

1

在您的tableView:cellForRowAtIndexPath:代碼,可以檢查與當前方位:

if (self.interfaceOrientation == UIInterfaceOrientationPortrait || 
    self.interfaceOrientation == UIInterfaceOrientationPortraitUpsideDown) { 
    // use a portrait cell 
} else { 
    // use a landscape cell 
} 

此外,一定要返回YES來自shouldAutorotateToInterfaceOrientation:。在旋轉後(didRotateFromInterfaceOrientation:[tableView reloadData];也應該重新加載tableView以確保正在使用正確的單元格。