Центр UIImegaeView в ячейке CollectionViewCell

#ios #swift #view #uiview #uiimageview

Вопрос:

Я пытаюсь создать ячейку CollectionView с изображением в центре

Мой класс выглядит так:

 import Foundation
import UIKit

class MenuCell: UICollectionViewCell{
    

    let image:UIImageView = {
        
        let i = UIImageView()
        i.image = (UIImage(named: "mainMenu"))
        i.contentMode = .scaleAspectFit
        return i
        
    }()
    
    override init(frame: CGRect) {
        super.init(frame: frame)
        

    }
    
    required init?(coder: NSCoder) {
        fatalError()
    }
    
    func setupCell(){
        addSubview(image)

        let centerXConst = NSLayoutConstraint(item: image, attribute: .centerX, relatedBy: .equal, toItem: self.contentView, attribute: .centerY, multiplier: 1.0, constant: 0.0)
        let centerYConst = NSLayoutConstraint(item: image, attribute: .centerY, relatedBy: .equal, toItem: self.contentView, attribute: .centerY, multiplier: 1.0, constant: 0.0)
        
    
        image.addConstraints([centerXConst, centerYConst])
        NSLayoutConstraint.activate([image.centerYAnchor.constraint(equalTo: self.contentView.centerYAnchor), image.centerXAnchor.constraint(equalTo: contentView.centerXAnchor)])


    }
    
}
 

Но когда я запускаю его, он выдает мне ошибку

При добавлении в представление элементы ограничения должны быть потомками этого представления (или самого представления). Это приведет к сбою, если ограничение необходимо устранить до того, как будет собрана иерархия представлений. Перерыв на

Как я вижу, я обычно добавляю константу.

UPD: Измените код функции. Не вотк =(

 func setupCell(){
    contentView.addSubview(image)

    let centerXConst = NSLayoutConstraint(item: image, attribute: .centerX, relatedBy: .equal, toItem: self.contentView, attribute: .centerX, multiplier: 1.0, constant: 0.0)
    let centerYConst = NSLayoutConstraint(item: image, attribute: .centerY, relatedBy: .equal, toItem: self.contentView, attribute: .centerY, multiplier: 1.0, constant: 0.0)

    NSLayoutConstraint.activate([centerXConst, centerYConst])


}
 

Комментарии:

1. Для centerXConst атрибутом var является centerX вместо centerY. Также добавьте только строку NSLayoutConstraint.activate. Нет необходимости в изображении.код addConstraints.

Ответ №1:

Как я вижу, я обычно добавляю константу.

Ну, ты видишь это неправильно. Вы прикрепляете представление изображения к представлению содержимого ячейки, но не помещаете представление изображения в представление содержимого. Вам нужно. Изменить

 addSubview(image)
 

Для

 contentView.addSubview(image)
 

Кроме того, как было указано в комментарии, нет смысла прикреплять центр x к центру y. Исправьте следующее:

 let centerXConst = NSLayoutConstraint(item: image, attribute: .centerX, relatedBy: .equal, toItem: self.contentView, attribute: .centerX, multiplier: 1.0, constant: 0.0)
let centerYConst = NSLayoutConstraint(item: image, attribute: .centerY, relatedBy: .equal, toItem: self.contentView, attribute: .centerY, multiplier: 1.0, constant: 0.0)
 

Кроме того, вы забыли предупредить представление изображения о том, чтобы оно не переводило свою маску автоматической настройки в ограничения.

Наконец, не добавляйте и не активируйте ограничения одновременно. Активация добавляет, и вы, очевидно, не знаете, в какое представление добавить ограничения. Поэтому удалите эту строку:

 image.addConstraints([centerXConst, centerYConst])
 

Комментарии:

1. Измените его, но то же самое. =((. функция setupCell(){ contentView.addSubview(изображение) пусть centerXConst = NSLayoutConstraint(элемент: изображение, атрибут: .centerX, связанный: .равно, элемент: self.contentView, атрибут: .centerX, множитель: 1,0, константа: 0,0) пусть centerYConst = NSLayoutConstraint(элемент: изображение, атрибут: .centerY, связанный: .равно, элемент: self.Представление содержимого, атрибут: .Центр, множитель: 1,0, константа: 0,0) NSLayoutConstraint.активировать([centerXConst, centerYConst]) }

2. извините, я не знаю, как отправить код в комментарии

3. обновили информацию по вопросу

4. Вам нужно остановить компилятор, создающий свои собственные ограничения по слою из маски автоматического изменения размера. Добавьте image.translatesAutoresizingMaskIntoConstraints = false перед применением ограничений.