Ios UICollectionViewCell布局与SnapKit

Ios UICollectionViewCell布局与SnapKit,ios,swift3,uicollectionviewcell,snapkit,Ios,Swift3,Uicollectionviewcell,Snapkit,我有一个简单的UICollectionViewCell,它是全宽的,我正在使用SnapKit来布局它的子视图。我将SnapKit用于我的另一个视图,它工作得很好,但不在collectionViewCell中。这是我试图实现的布局: collectionViewCell的代码为: lazy var imageView: UIImageView = { let img = UIImageView(frame: .zero) img.contentMode = UIViewConte

我有一个简单的UICollectionViewCell,它是全宽的,我正在使用SnapKit来布局它的子视图。我将SnapKit用于我的另一个视图,它工作得很好,但不在collectionViewCell中。这是我试图实现的布局:

collectionViewCell的代码为:

lazy var imageView: UIImageView = {
    let img = UIImageView(frame: .zero)
    img.contentMode = UIViewContentMode.scaleAspectFit
    img.backgroundColor = UIColor.lightGray
    return img
}()

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

    let imageWidth = CGFloat(frame.width * 0.80)
    let imageHeight = CGFloat(imageWidth/1.77)
    backgroundColor = UIColor.darkGray

    imageView.frame.size.width = imageWidth
    imageView.frame.size.height = imageHeight
    contentView.addSubview(imageView)

    imageView.snp.makeConstraints { (make) in
        make.top.equalTo(20)
        //make.right.equalTo(-20)
        //make.right.equalTo(contentView).offset(-20)
        //make.right.equalTo(contentView.snp.right).offset(-20)
        //make.right.equalTo(contentView.snp.rightMargin).offset(-20)
        //make.right.equalToSuperview().offset(-20)
    }
}

required init?(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
}
在不应用任何约束的情况下,imageView显示在单元格的左上角,但应用任何约束会使图像消失。在调试视图中检查collectionViewCell会显示imageView和约束,但“UIImageView的大小和水平位置不明确”

我还尝试过设置contentView.translatesAutoResizezingMASKINTOCONSTRAINTS=false以及其他设置,但结果相同

我使用的是所有代码,没有故事板UI或布局


谢谢你的帮助

我对SnapKit了解不多,但看起来您缺少了一个约束。你需要高度,宽度,x和y。可以很好地处理ios9约束

let imageView: UIImageView = {
        let view = UIImageView()
        view.translatesAutoresizingMaskIntoConstraints = false
        view.contentMode = .scaleAspectFit
        view.backgroundColor = .lightGray
        return view
    }()

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

    func setupViews() {
        self.addSubview(imageView)

        imageView.topAnchor.constraint(equalTo: self.topAnchor, constant: 10).isActive = true
        imageView.rightAnchor.constraint(equalTo: self.rightAnchor, constant: -10).isActive = true
        imageView.widthAnchor.constraint(equalTo: self.widthAnchor, multiplier: 2/3, constant: -10).isActive = true
        imageView.heightAnchor.constraint(equalTo: self.heightAnchor, multiplier: 1/2, constant: -10).isActive = true
    }

不能同时使用自动布局(SnapKit)和手动布局(设置帧)。通常,使用自动布局会导致手动布局失败。然而,snp闭包中的约束代码并不完整。无论是使用自动布局还是手动布局,最后视图都应该获得位置和大小

因此,您可以这样尝试:

imageView.snp.makeConstraints { make in
   // set size
   make.size.equalTo(CGSize(width: imageWidth, height: imageHeight))
   // set position
   make.top.equalTo(20)
   make.centerX.equalTo(contentView)
}

那起作用了-太棒了。对于x位置,我必须将代码更新为-make.centerX.equalTo(contentView.snp.centerX)。不过,在我的布局中,我希望图像紧靠单元格的右侧,所以我使用make.right.equalTo(contentView.snp.rightMargin)。