2016-11-18 59 views
0

我有一個非常簡單的UIScrollView與一些內容(許多子視圖)。這個滾動視圖用於顯示用戶創建的一些帖子(圖片+文字)。其中一種觀點實際上是作者的形象,它溢出了底部細胞的界限。因此它與後面的單元格重疊,並使用clipToBounds = false我可以獲得所需的結果。如果我向下滾動,一切都很好。當我開始向前滾動時,以前覆蓋的視圖會被剪切。dequeueReusableCell休息cliptobounds

Cell overlapping working fine Cell overlapping not working (when I scroll up)

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let cellIdentifier = (indexPath.row % 2 == 0) ? "FeedCellLeft" : "FeedCellRight"; 
    let cell = feedScrollView.dequeueReusableCell(withIdentifier: cellIdentifier, for: indexPath) as! FeedCell; 
    self.setUpCell(cell, atIndexPath: indexPath); 
    return cell 
} 

setUpCell功能只是執行一些UI相關的任務

let row = indexPath.row 

    cell.postImage.downloadImageFrom(link: rows[row].image, contentMode: .scaleToFill) 
    cell.postAuthorImage.downloadImageFrom(link: "https://pbs.twimg.com/profile_images/691867591154012160/oaq0n2zy.jpg", contentMode: .scaleToFill) 
    cell.postAuthorImage.layer.cornerRadius = 22.0; 
    cell.postAuthorImage.layer.borderColor = UIColor.white.cgColor 
    cell.postAuthorImage.layer.borderWidth = 2.0; 
    cell.postAuthorImage.layer.masksToBounds = true; 

    cell.selectionStyle = .none 

    cell.postData.layer.cornerRadius = 10.0; 

    cell.contentView.superview?.clipsToBounds = false; 
    cell.clipsToBounds = false; 


    if (indexPath.row % 2 != 0) { 
     cell.postData.transform = CGAffineTransform.init(rotationAngle: (4 * .pi)/180); 
    } else { 
     cell.postData.transform = CGAffineTransform.init(rotationAngle: (-4 * .pi)/180); 
    } 

看來,雙端隊列操作打破我做了(使用自動版式)的佈局。我試過很多解決類似這樣的

func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) { 
    cell.contentView.superview?.clipsToBounds = false; 
    cell.clipsToBounds = false; 
    cell.contentView.clipsToBounds = false; 
} 

但結果看起來總是相同的。每行的高度是固定的。

回答

1

我認爲問題是與子視圖的層次結構。當您向下滾動時,您的細胞從頂部到底部出隊,並以相同順序添加到UITableView,並且所有外觀都很好。因爲前一個單元格在視圖層次結構中高於以下內容。 但是,當您向上滾動時,單元格會從下到上出列,這意味着頂部的單元格位於先前單元格的「後面」。您可以使用Xcode的Debugging View Hierarchies功能輕鬆檢查它。

你可以嘗試bringSubviewToFront:例如:

override func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) { 
    cell.superview.bringSubview(toFront cell) 
} 

更新版本

我在操場做的小調查,發現只有一個執行重疊合理選擇單元沒有巨大的性能問題。該解決方案基於cell.layer.zPosition屬性並且工作正常(至少在我的Playground中)。我更新的代碼內willDisplay cell:與下列之一:

override func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) { 
    cell.layer.zPosition = (CGFloat)(tableView.numberOfRows(inSection: 0) - indexPath.row) 
} 

根據用於.zPosition的文件(Apple Developer Documentation):

該屬性的缺省值是0改變的這個屬性的值更改屏幕上從前到後的圖層排序。數值越高,該層視覺上就越靠近觀察者而不是具有較低值的層。這可能會影響幀矩形重疊的圖層的可見性。

因此,我使用當前dataSource計數器作爲被減數當前小區爲減數indexPath.row來計算每個小區的層的zPosition

您可以下載完整版我的遊樂場here的。

+0

嗨,這是一個偉大的提示,它似乎工作,但相反方向。現在它在我向上滾動時起作用,但是當我向下滾動時不起作用,因爲在首先佈局單元時,也會調用'willDisplayCell'。 –

+0

@DiegoViganò,檢查我的更新答案。 – dive

+0

G R E A T!有效!我欠你一杯啤酒!再次感謝! –