2014-01-24 69 views
3

我想將CALayer添加到我的UITableViewCell的底部以獲得一點「陰影」效果。問題在於當表格向上滾動並移出屏幕時,所以當您向下滾動時,它不可見。如果您從屏幕向下滾動單元格然後備份它們顯示正常。將CALayer添加到UITableViewCell滾動後刪除

I have a gif here showing what's happening.

這是我正在做它:

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


    static NSString *cellIdentifier = @"CellIdentifier"; 

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier]; 

    if (!cell) { 
     cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier]; 
    } 

    cell.textLabel.text = [NSString stringWithFormat:@"Row %d", (int)indexPath.row]; 

    CALayer *bottomBorder = [CALayer layer]; 
    bottomBorder.frame = CGRectMake(0.0f, cell.frame.size.height, cell.frame.size.width, 1.0f); 
    bottomBorder.backgroundColor = [UIColor colorWithWhite:0.9f alpha:1.0f].CGColor; 
    [cell.layer addSublayer:bottomBorder]; 

    cell.clipsToBounds = NO; 

    cell.selectionStyle = UITableViewCellSelectionStyleNone; 

    return cell; 
} 

這我也利用每個小區的獨特cellIdentifier,希望他們不會被重用,因此嘗試層不會這樣刪除:

//Same code as before just this changed 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:[NSString stringWithFormat:@"%ld_%ld", (long)indexPath.row, (long)indexPath.section]]; 

    if (!cell) { 
     cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:[NSString stringWithFormat:@"%ld_%ld", (long)indexPath.row, (long)indexPath.section]]; 
    } 

    //Same code continued... 

所以我的問題是,當一個單元格被重用,CALayer添加到它被刪除。當單元格從屏幕上滾動並重新打開時,我需要做些什麼才能保留該圖層。

編輯:

我也試過這不工作之一:

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


    static NSString *cellIdentifier = @"CellIdentifier"; 

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier]; 

    if (!cell) { 
     cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier]; 

     CALayer *bottomBorder = [CALayer layer]; 
     bottomBorder.frame = CGRectMake(0.0f, cell.frame.size.height, cell.frame.size.width, 1.0f); 
     bottomBorder.backgroundColor = [UIColor colorWithWhite:0.9f alpha:1.0f].CGColor; 
     [cell.layer addSublayer:bottomBorder]; 

     cell.clipsToBounds = NO; 
     cell.selectionStyle = UITableViewCellSelectionStyleNone; 
    } 

    cell.textLabel.text = [NSString stringWithFormat:@"Row %d", (int)indexPath.row]; 

    return cell; 
} 

回答

3

原來它被刪除的原因是因爲CALayer被添加到單元格中,而不是被添加到UITableViewCellcontentView。所以正確實施如下:

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


    static NSString *cellIdentifier = @"CellIdentifier"; 

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier]; 

    if (!cell) { 
     cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier]; 

     CALayer *bottomBorder = [CALayer layer]; 
     bottomBorder.frame = CGRectMake(0.0f, 
              (CGRectGetHeight(cell.contentView.bounds) - 1), 
              CGRectGetWidth(cell.contentView.bounds), 
              1.0f); 

     bottomBorder.backgroundColor = [UIColor colorWithWhite:0.9f alpha:1.0f].CGColor; 
     [cell.contentView.layer addSublayer:bottomBorder]; 
    } 

    cell.textLabel.text = [NSString stringWithFormat:@"Row %d", (int)indexPath.row]; 

    return cell; 
} 
4

GACK!是否不是爲每個單元格使用不同的單元格標識符。這完全破壞了單元重用機制,並且會給你不斷增加的內存使用,並迫使你總是爲每個索引創建一個新單元 - 這是最糟糕的結果。

每當單元格在屏幕外滾動時,它就會進入重用隊列。然後,當一個新的索引路徑滾動到視圖中時,系統將先前使用的單元格從回收站中取出並交給您。你應該假設它的結構是完全形成的(你添加的任何自定義字段都會在那裏),但是內容都是錯誤的,並且需要完全設置。因此,如果您的單元格帶有3個標籤,並且模型中的某些對象將文本填充爲1個標籤,其中一些填充到2個標籤中,並且其中一部分插入到所有3個標籤中,則應始終爲所有3個標籤設置一個值,即使它是空的串。這樣可以防止上次使用單元時留下的值繼續存在。

它有點像醫生的辦公室,有病人表格供您填寫。你填寫一張表格並交給店員。店員將信息鍵入計算機,然後將表格放回空白表格的頂部。下一個病人必須抹去事事休的形式,包括孩子的名字,如果他們沒有任何孩子,配偶,預存他們沒有條件,等,等,否則從最後一個人的信息使用表格將仍然在你的表格上。

至於你的影子層,當你使用取一個dequeueReusableCellWithIdentifier細胞,如果你要創建一個新的細胞,你應該只添加圖層。如果您找回重複使用的單元格,該圖層將已存在,但是如果它們在單元格之間切換,則可能需要設置它的內容。

+0

謝謝您花時間回答。我完全理解UITableView如何重用細胞。我所做的只是試圖以某種形式解決問題,即使錯誤的方式將其變爲工作狀態。我已經更新了我的問題,並提出了更清晰的問題。 – random

+0

除了你發佈的代碼是錯誤的。向單元添加圖層的代碼屬於「if(!cell)」條件內。相反,每次你重新使用一個單元格時,你都會添加一個新層,這是不好的。這告訴我你不像你認爲的那樣瞭解細胞再利用。 –

+0

我想我應該發佈了所有我試過的代碼。把它放在'if(!cell)'中也不能解決問題。 – random