#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
перед применением ограничений.