2017-04-11 29 views
0

我有一個基本的子類UICollectionView單元。我想添加一個UIImageView,所以每個單元格都顯示一個圖像。嘗試確定子類UICollectionViewCell中的單元格寬度

的圖像被適當地顯示,如果我添加顯式值X:Y:寬:高,但我不能使用self.contentView.frame.width來確定集合視圖小區的大小(用於將圖像上的x軸)

class SubclassedCell: UICollectionViewCell { 
    var myImageView: UIImageView! 
    required init?(coder aDecoder: NSCoder) { 
     super.init(coder:aDecoder) 
     myImageView = UIImageView(frame: CGRect(x: (self.frame.width - 10.0), y: 50.0, width: 20.0, height: 20.0)) 
     myImageView.image = UIImage(named: "JustinBieber") 
     self.contentView.addSubview(myImageView) 
    } 
} 

在上文中,(self.contentView.frame.width - 10.0)是沒有得到集合視圖單元的尺寸,因此圖像不顯示在所有。如果我明確地輸入一個x的值,比如0,它就會顯示出來。

我怎樣才能確定子類的集合視圖小區的大小(寬度)?

+0

你能否提供你想要完成的更多細節?例如。你想從單元格的右側將圖像定位10點嗎? – kevin

+0

正確。我試圖從單元右側10點定位圖像。這就是爲什麼我需要確定的單元格的寬度動態(他們不是一樣的大小)。 – Joe

回答

1

初始化器被調用以在視圖生命週期的早期準確地對尺寸提供值。

更慣用的方法是佈局在layoutSubviews生命週期法你的形象。一個簡單的例子如下

class SubclassedCell: UICollectionViewCell { 

    var myImageView: UIImageView! 
    var imageDisplayed = false 

    override func layoutSubviews() { 
     super.layoutSubviews() 
     if !imageDisplayed { 
      myImageView = UIImageView(frame: CGRect(x: (self.frame.width - 10.0), y: 50.0, width: 20.0, height: 20.0)) 
      myImageView.image = UIImage(named: "JustinBieber") 
      self.contentView.addSubview(myImageView) 
      imageDisplayed = true 
     } 
    } 
} 

說明如果在你的應用程序中使用的自動佈局,你也可以考慮把圖象和提供的約束,而不是明確地設置圖像的幀。

在本answer說明 - 這取決於你的使用情況 - 他們可能是更好的方法來設置你的細胞。

+1

只是要注意,'layoutSubviews'可以認爲 – sooper

+0

感謝您的幫助的生命週期中被調用一次以上,但像提到@sooper,layoutSubviews被調用幾次,所以這會導致細胞基本上噴涌imageViews無處不在。 – Joe

+0

@joe - 我已經修改了這個例子的圖像上的初始調用添加到視圖只有一次'layoutSubviews' - 有許多方法來完成你正在尋找做什麼 - 要考慮的主要事情是的意見是什麼性質在他們的生命週期中的哪一點是有用的 – syllabix

1

有很多種方法來實現這一佈局,約束你不需要知道的寬度。你定義你想要的關係,而佈局系統管理剩下的關係。

class SubclassedCell1: UICollectionViewCell { 
    var myImageView: UIImageView! 

    private func commonInit() { 
     myImageView = UIImageView() 
     myImageView.image = UIImage(named: "JustinBieber") 
     myImageView.translatesAutoresizingMaskIntoConstraints = false 
     self.contentView.addSubview(myImageView) 

     NSLayoutConstraint.activate([ 
      myImageView.widthAnchor.constraint(equalToConstant: 20), 
      myImageView.heightAnchor.constraint(equalToConstant: 20), 
      myImageView.topAnchor.constraint(equalTo: self.topAnchor, constant: 50), 
      myImageView.rightAnchor.constraint(equalTo: self.rightAnchor, constant: 10), 
      ]) 
    } 

    override init(frame: CGRect) { 
     super.init(frame: frame) 
     commonInit() 
    } 

    required init?(coder aDecoder: NSCoder) { 
     super.init(coder:aDecoder) 
     commonInit() 
    } 
} 

您還可以使用layoutSubviews,作爲@syllabix提及。在執行此操作時,請務必在每次調用layoutSubviews時更新框架,否則如果調整大小,視圖將無法正確更新。在佈置子項時,還要使用父視圖邊界,而不是框架。

class SubclassedCell2: UICollectionViewCell { 
    var myImageView: UIImageView! 

    private func commonInit() { 
     myImageView = UIImageView() 
     myImageView.image = UIImage(named: "JustinBieber") 
     self.contentView.addSubview(myImageView) 
    } 

    override init(frame: CGRect) { 
     super.init(frame: frame) 
     commonInit() 
    } 

    required init?(coder aDecoder: NSCoder) { 
     super.init(coder:aDecoder) 
     commonInit() 
    } 

    override func layoutSubviews() { 
     super.layoutSubviews() 
     myImageView.frame = CGRect(x: (self.bounds.maxX - 10.0), y: 50.0, width: 20.0, height: 20.0) 
    } 
}