У меня есть два представления, B и C, и B наследуется от C.
C содержит CollectionView.Каждая ячейка имеет тип ProductsCollectionViewCell
(код ниже)
Когда представление C загружает свои продукты, я получаю следующее:
В представлении B я хочу, чтобы ячейки выглядели так:
в представлении C, у меня есть это:
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize
{
return GetViewCGSize(collectionView)
}
Как видите, я использовал GetViewCGSize
(мой собственный метод), поэтому я могу переопределить его в других представлениях, чтобы получить другой размер ячейки.
Поэтому я использовал переопределение для этой функции в представлении B:
override func GetViewCGSize(_ collectionView: UICollectionView) -> CGSize
{
return CGSize(width: self.ProductsCollection.frame.width, height: 10)
}
но вид для B остается таким же, как и для C.
Чего мне не хватает?
Это код для ячейки:
class ProductsCollectionViewCell: UICollectionViewCell
{
var ProductImageView: UIImageView!
var ProductName: UILabel!
var ProductPrice: UILabel!
var productUniqueID: String!
// Initialization from here
override init(frame: CGRect)
{
super.init(frame: frame)
commonInit()
}
required init?(coder aDecoder: NSCoder)
{
super.init(coder: aDecoder)
commonInit()
}
func commonInit()
{
ProductImageView = UIImageView()
ProductPrice = UILabel()
ProductName = UILabel()
ProductImageView.translatesAutoresizingMaskIntoConstraints = false
ProductName.translatesAutoresizingMaskIntoConstraints = false
self.addSubview(ProductImageView)
self.addSubview(ProductName)
self.addSubview(ProductPrice)
ProductImageView.image = #imageLiteral(resourceName: "DefaultProductImage")
ProductImageView.contentMode = .scaleAspectFit
ProductImageView.layer.borderColor = UIColor.black.cgColor
ProductImageView.layer.borderWidth = 1
self.layer.borderColor = UIColor.black.cgColor
self.layer.borderWidth = 1
}
override func layoutSubviews()
{
let margins = self.contentView.layoutMarginsGuide
//Add top, left, right constraint relative to cell content view like below
ProductImageView.topAnchor.constraint(equalTo: margins.topAnchor,constant:5).isActive = true
ProductImageView.centerXAnchor.constraint(equalTo: margins.centerXAnchor).isActive = true
ProductImageView.widthAnchor.constraint(equalTo: margins.widthAnchor).isActive = true
ProductImageView.bottomAnchor.constraint(equalTo: margins.bottomAnchor, constant: -50).isActive = true
//Now set your label top anchor to display it below your image view
ProductName.topAnchor.constraint(equalTo: ProductImageView.bottomAnchor,constant:5).isActive = true
//To center align
ProductName.centerXAnchor.constraint(equalTo: margins.centerXAnchor).isActive = true
ProductPrice.translatesAutoresizingMaskIntoConstraints = false
ProductPrice.topAnchor.constraint(equalTo: ProductName.bottomAnchor,constant:5).isActive = true
ProductPrice.bottomAnchor.constraint(equalTo: margins.bottomAnchor).isActive = true
//To center align
ProductPrice.centerXAnchor.constraint(equalTo: margins.centerXAnchor).isActive = true
}
}
extension UIImageView
{
func loadImageUsingUrlString(urlString: String)
{
let url = NSURL(string: urlString)
URLSession.shared.dataTask(with: url! as URL, completionHandler:
{
(data, response, error) in
if error != nil
{
print (error!)
return
}
DispatchQueue.main.async
{
self.image = UIImage(data: data!)
}
}).resume() // Closes URLSession.shared
}
}
Хотя я понимаю, что содержимое ячейки не изменится, так как я ничего не изменил, я по крайней мере ожидаю, что сама ячейкаизменить размер.
Я не хочу использовать табличное представление, но оставайтесь с моим UICollectionView
C, так как он имеет много необходимых функций.