Невозможно привязать UIImageVIew в UICollectionViewCell (программно) - PullRequest
0 голосов
/ 05 августа 2020

Работаем над определением представления в Playground и не могу понять, почему UIIMageView помещается в центр UICollectionViewCell.

Соответствующий код:

class BookCell: UICollectionViewCell {
    
    static let identifier = "bookCell"
    
    override init(frame: CGRect) {
        super.init(frame: .zero)
        self.layer.cornerRadius = 12
        self.backgroundColor = .brown
        addAllSubviews()
        addAllConstraints()
    }
    
    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    lazy var cover: UIImageView = {
        let imageview = UIImageView()
        imageview.translatesAutoresizingMaskIntoConstraints = false
        var largeImage = UIImage(named: "medium.jpg")
        imageview.image = largeImage
        imageview.contentMode = .scaleAspectFit
        //imageview.contentMode = .scaleToFill
        return imageview
    }()
    
    func coverConstraints(){
        NSLayoutConstraint.activate([
            cover.leadingAnchor.constraint(equalTo: self.safeAreaLayoutGuide.leadingAnchor, constant: 0),
            
            /**widthConstraint*/
            NSLayoutConstraint(item: cover,
                               attribute: .width,
                               relatedBy: .equal,
                               toItem: self,
                               attribute: .width,
                               multiplier: 1.0, constant: 0.0),

            /**heightConstraint*/
            NSLayoutConstraint(item: cover,
                               attribute: .height,
                               relatedBy: .equal,
                               toItem: self,
                               attribute: .height,
                               multiplier: 0.75, constant: 0.0)
        ])
    }
    
    
    let wordLabel: UILabel = {
        let label = UILabel()
        label.translatesAutoresizingMaskIntoConstraints = false
        label.text = "test"
        return label
    }()
    
    func wordLabelConstraints() {
        NSLayoutConstraint.activate([
            wordLabel.leadingAnchor.constraint(equalTo: leadingAnchor),
            wordLabel.trailingAnchor.constraint(equalTo: trailingAnchor),
            wordLabel.topAnchor.constraint(equalTo: cover.bottomAnchor, constant: 2)
        ])
    }

    // MARK: - Add Subviews
    func addAllSubviews() {
        self.addSubview(cover)
        self.addSubview(wordLabel)
    }
    
    // MARK: - SubViews Constraints
    func addAllConstraints() {
        coverConstraints()
        wordLabelConstraints()
    }
}

* Затем 1006 * используется в UICollectionViewController следующим образом:

class ViewController: UIViewController {

    fileprivate let collectionView: UICollectionView = {
        let layout = ColumnFlowLayout()
        let cv = UICollectionView(frame: .zero, collectionViewLayout: layout)
        cv.backgroundColor = .blue
        cv.translatesAutoresizingMaskIntoConstraints = false
        return cv
    }()

    var data: [Int] = Array(0..<10)

    override func loadView() {
        super.loadView()
        view.addSubview(collectionView)
        
        NSLayoutConstraint.activate([
            collectionView.topAnchor.constraint(equalTo: view.topAnchor),
            collectionView.bottomAnchor.constraint(equalTo: view.bottomAnchor),
            collectionView.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 16),
            collectionView.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -16)
        ])

    }

    override func viewDidLoad() {
        super.viewDidLoad()
        self.collectionView.dataSource = self
        self.collectionView.delegate = self
        self.collectionView.register(BookCell.self, forCellWithReuseIdentifier:     BookCell.identifier)
        self.collectionView.alwaysBounceVertical = true
        self.collectionView.backgroundColor = .yellow
    }
}

Результат:

enter image description here

I noticed that using scaleToFill instead of scaleAspectFit results in image covering the entire width of the cell. The result (see image below) fits what I am aiming for but ... see question below введите описание изображения здесь

Вопрос:

  1. Использует scaleToFill единственный способ прикрепить изображение к краям (ведущим и конечным) UICollectionViewCell. Если да, то почему?
  2. Я также пробовал добавить UIImageView в UIStackView, и я считаю, что получил те же результаты.
  3. Обратите внимание, что мне не интересно делать это через раскадровку.

Спасибо за отзыв

1 Ответ

0 голосов
/ 05 августа 2020

Есть еще один вариант: .scaleAspectFill, но содержимое вашего изображения может быть обрезано.

The option to scale the content to fill the size of the view.
Some portion of the content may be clipped to fill the view’s bounds.

Подумайте о соотношении размеров изображения (ширина / высота), у вас есть фиксированная ширина на основе супервизора , а высота будет зависеть от соотношения сторон изображения.

...