尝试确定子类UICollectionViewCell中的单元格宽度

时间:2017-04-11 00:05:16

标签: ios swift uicollectionview uicollectionviewcell

我有一个基本的子类UICollectionView Cell。我想为它添加一个UIImageView,因此每个单元格都会显示一个图像。

如果我向x:y:width:height添加显式值,则图像正常显示,但我不能使用self.contentView.frame.width来确定Collection View单元格的大小(用于将图像放在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,它会显示出来。

如何确定子类集合视图单元格的大小(宽度)?

2 个答案:

答案 0 :(得分: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 :(得分: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)
    }
}