2011-05-13 48 views
1

我試圖通過調整我的UITableViewCell's框架:調整一個UITableViewCell框架問題

[cell setFrame:CGRectMake(cell.frame.origin.x, 
          cell.frame.origin.y, 
          cell.frame.size.width, 
          cell.frame.size.height+25)]; 
但是

,它不調整我做到這一點之後......這是爲什麼?

這是奇怪的,如果我加UIToolBar進入細胞內,它會調整,但是當我加入一個UIView,它不:

[cell.contentView addSubview:sideSwipeView]; 
+0

嗨aherlambang ...答案有幫助嗎?請選擇正確的答案...如果不是,請評論讓我們知道它沒有幫助。 :) – Sid 2011-05-18 17:09:15

回答

8

這裏的長和短的它:

  1. 你的細胞寬度由它在的tableview的寬度決定

[編輯:如果它是一個分組的表視圖,如果您使用的是iPhone或iPad,則該單元格比桌面寬度窄20 - 60像素。]

  1. Your cel l高度由heightForRowAtIndexPath方法確定。

如果你手動設置單元格的框架,這將是當你使用一個子類的細胞要添加基於細胞的尺寸除了子視圖沒用。

即使在這種情況下,建議使用rectForRowAtIndexPath:(NSIndexPath*)indexPath方法從tableview中獲取單元格的框架,然後將該框架設置爲單元格的框架(將框架的原點Y設置爲0之後)。

我對UIToolBar不太確定,但是您的子視圖的框架在更改單元框架時不會改變。

也許如果你能告訴我們你想達到的目標,我們可以爲你提供一個解決方案?


--------------------編輯--------------------


因此,您需要根據新的子視圖動態地將子視圖添加到單元格,然後調整它的高度。這是會得到毛茸茸所以這裏有雲:

在您的.h文件中聲明:

BOOL subviewAdded; 

在您.m文件,在init,這樣做:

subviewAdded = NO; 

讓我們假設你希望單元格的高度在沒有子視圖的情況下爲50,在子視圖中爲100。因此,你的heightForRow方法應該是:

- (CGFloat)tableView:(UITableView *)tableView 
      heightForRowAtIndexPath:(NSIndexPath *)indexPath { 
    return (subviewAdded?100.0f:50.0f); 
} 

這意味着,最初因爲subviewAdded是NO,所有的細胞都會有較小的高度。

現在,一個子視圖添加到單元格上點擊它,並改變它的高度動態的,在你的didSelectRow方法做到這一點:

- (void)tableView:(UITableView *)tableView 
     didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
    //Get the cell at this indexPath 

    UITableViewCell *thisCell = [tableView cellForRowAtIndexPath:indexPath]; 

    if(subviewAdded) 
    { 
     subviewAdded = NO; 

     for(int i = 0; i < [thisCell.contentView.subviews count]; i++) 
     { 
      UIView *thisSubview = [thisCell.contentView.subviews objectAtIndex:i]; 
      [thisSubview removeFromSuperview]; 
     } 
    } 
    else 
    { 
     UIView *someView = [[UIView alloc] initWithFrame:someFrame]; 

     [thisCell.contentView addSubview:someView]; 
     [someView release]; 

     subviewAdded = YES; 
    } 

    NSMutableArray *array = [NSMutableArray array]; 

    [array addObject:indexPath]; 

    [tableView reloadRowsAtIndexPaths:array 
        withRowAnimation:UITableViewRowAnimationFade]; 
} 

所以發生了什麼事情發生在這裏的是你要添加一個子視圖到你點擊的這個單元格。重新加載這個單元格會調用heightForRowAtIndexPath並做一個很好的小淡入淡出動畫並改變你的tableview高度。

重要提示:理想情況下,您應該維護一個帶有布爾值的NSNumbers數組。數組大小應該與您擁有的tableview單元的數量相同。

在heightForRow中,您將檢查該數組,而不是使用整個tableView的單個布爾值。這將確保您可以爲不同的單元格設置不同的高度。

這看起來是這樣的:

- (CGFloat)tableView:(UITableView *)tableView 
      heightForRowAtIndexPath:(NSIndexPath *)indexPath { 
    BOOL thisBool = (BOOL)[[booleanArray objectAtIndex:indexPath.row] boolValue]; 

    return (thisBool?100.0f:50.0f); 
} 

因爲它意味着我沒有在這裏發佈的所有代碼,我已經張貼應該把你對你的方式來執行布爾數組的東西是什麼。

無論如何,你是。我只是自己測試這個代碼,所以它的工作:)

+0

我正在嘗試創建http://thenextweb.com/apps/files/2011/04/iPhone-Screenshot-11.jpeg,如果您在點擊單元格後添加子視圖到單元格並再次點擊它它將刪除子視圖..所有動態調整視圖高度 – aherlambang 2011-05-14 00:00:54

5

如果你想提高你的細胞爲基礎的高度在一些參數例如。文字,圖片, 您必須在您的代碼中實施heightForRowAtIndexPath方法UITableViewDelegate

- (CGFloat)tableView:(UITableView *)tableView 
      heightForRowAtIndexPath:(NSIndexPath *)indexPath 
+1

+1表格在放置時不會詢問單元格的尺寸。無論更好還是更糟,這並不是它的工作原理。 – 2011-05-13 19:36:01

+0

我非常瞭解它,但是現在的問題是,當我在heightForRowAtIndexPath中檢查是否存在此子視圖時,所以我可以調整其崩潰的高度。如果([cell.contentView viewWithTag:5]!= nil)我剛添加了這段代碼 optionsHeight = 25 ;. – aherlambang 2011-05-13 20:23:33

+1

heightForRow被稱爲BEFORE cellForRow ....因此崩潰。你的細胞還沒有「存在」。在heightForRow中,你告訴tableview將單元格渲染到特定的高度。它在這一點上沒有渲染單元,所以你不能訪問單元。 – Sid 2011-05-13 21:41:03