2

我有一個CollectionView(subclassed CollectionViewController)在另一個視圖的容器視圖內。 CollectionViewCells在Interface Builder中定義,幷包含一個帶有更多子視圖的UIView。UICollectionViewCell子視圖大小不正確

我的收藏視圖包含7個部分,每個部分包含1個項目。這些部分有一個定義的插圖和大小(通過CollectionViewDelegateFlowLayout)。每個單元格都應該填充集合視圖的大小,不帶插頁。

問題似乎是單元格內的視圖不能正確渲染。使用約束它被設置爲固定到每一邊,但是這似乎不起作用。

我已經嘗試記錄細胞本身的寬度和高度與細胞內的視圖。當我滾動瀏覽collectionView時,所有奇數單元顯示的內容大小遠小於單元格的大小。這也適用於第一個偶數單元,但直到我滾動到第二個偶數單元爲止。由於這種大小差異,細胞的子視圖不會在all.ui渲染

我的IB設置:

enter image description here

CollectionViewController:

// MARK: CollectionViewController 

class DayViewController: UICollectionViewController { 

    // MARK: Properties 

    private let reuseIdentifier = "DayCell" 

    // MARK: CollectionViewDataSource 

    override func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int { 
     return 7 
    } 

    override func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { 
     return 1 
    } 

    override func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell { 
     let cell = collectionView.dequeueReusableCellWithReuseIdentifier(reuseIdentifier, forIndexPath: indexPath) as! DayViewCell 
     NSLog("%f — %f", cell.bounds.width, cell.content.bounds.width) 
     return cell 
    } 
} 

// MARK: CollectionViewDelegateFlowLayout 

extension DayViewController : UICollectionViewDelegateFlowLayout { 
    func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize { 
     // return CGSize(width: collectionView.bounds.width - 40.0, height: collectionView.bounds.height - 40.0) 
     return CGSize(width: collectionView.bounds.width - 40.0, height: collectionView.bounds.height - 40.0) 
    } 

    func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAtIndex section: Int) -> UIEdgeInsets { 
     return UIEdgeInsets(top: 20.0, left: 20.0, bottom: 20.0, right: 20.0) 
    } 
} 

CollectionViewCell:

class DayViewCell: UICollectionViewCell { 
    override var bounds: CGRect { 
     didSet { 
      contentView.frame = bounds 
     } 
    } 

    @IBOutlet weak var content: UIView! 
    @IBOutlet weak var progress: UIView! 
    @IBOutlet weak var rank: UILabel! 
    @IBOutlet weak var remainingRep: UILabel! 

    override func drawRect(rect: CGRect) { 
     super.drawRect(rect) 

     layer.cornerRadius = 5 

     layer.shadowOffset = CGSize(width: 0, height: 2) 
     layer.shadowOpacity = 0.5 
     layer.shadowColor = UIColor.blackColor().CGColor 
     layer.shadowRadius = 5 

     layer.masksToBounds = false 
     clipsToBounds = false 
    } 

    override func layoutSubviews() { 
     super.layoutSubviews() 

     content.layer.cornerRadius = 5 
     content.clipsToBounds = true 

     progress.frame = CGRect(x: 0, y: 0, width: 100, height: 22) 
    } 
} 

運行:(奇細胞/甚至細胞上第一渲染/偶小區上第二渲染)

enter image description here enter image description here enter image description here

回答

1

感謝您使源代碼可用。一些想法:

它看起來像你,支持自動佈局尺寸類搞亂。我不確定你是否有意這樣做。

選擇容器視圖,然後選擇屬性檢查器。在底部你會看到一些複選框。這是向您顯示您僅爲某些尺寸類別設置了自動佈局設置。

Attributes Inspector

將進入文件檢查器,然後禁用大小類。

Size Classes here

你會發現,事情開始工作。

如果你只是爲iPhone(iPad上不),只是在縱向方向發展,你應該只是禁用大小類。如果你想爲其他事情設計,這可能有助於研究大小班。

https://developer.apple.com/library/ios/recipes/xcode_help-IB_adaptive_sizes/chapters/AboutAdaptiveSizeDesign.html

1

你提到的UICollectionViewController是在容器圖。是否設置正確,以便獲得所有預期的UIViewController呼叫,例如viewWillAppear()

如果您可以發佈演示問題的示例項目,我很樂意嘗試調試它。

您在這裏發佈的代碼的一些想法:

  • 在DayViewCell代碼,這是極不尋常的被覆蓋 bounds設定框架。這關係到我。

  • drawRect()是不是要設置陰影和角落
    半徑的地方。這應該在init(frame:)和/或init?(coder:)完成。 在drawRect()中這樣做很昂貴,並且在滾動時可能會影響幀率 。

  • 我也想將所有的你layoutSubviews()有東西進入
    init方法。有沒有優勢,運行的代碼的每一
    時間的視圖佈局。

+0

非常感謝您的意見。我仍然在學習一些零碎的東西,以至於應該去哪些地方非常感謝。我在這裏上傳了這個項目:https://www.dropbox.com/s/8w9vzww72ghrl3r/Wolfswood%20Companion.zip?dl=0。 – Sacha

相關問題