如何在 swift 中创建具有自动高度的水平集合视图?

问题描述 投票:0回答:1

我创建了一个水平集合视图,它计算自己的高度,但高度没有按预期计算。

我的flowlayout和高度约束代码如下:

 if let flowLayout = collectionViewAppName.collectionViewLayout as? UICollectionViewFlowLayout {
            flowLayout.estimatedItemSize = UICollectionViewFlowLayout.automaticSize
            flowLayout.scrollDirection = .horizontal
            flowLayout.sectionInset = .init(top: 0, left: 0, bottom: 0, right: 32)
            flowLayout.minimumLineSpacing = 8
            flowLayout.minimumInteritemSpacing = 0
        }

let height = collectionViewAppName.contentSize.height
collectionViewAppName.heightAnchor.constraint(equalToConstant: height).isActive = true

集合视图单元格类:

final class AppTypeCollectionViewCell: UICollectionViewCell {
        @IBOutlet private weak var viewContainer: UIView!
        @IBOutlet private weak var stackViewContent: UIStackView!
        @IBOutlet private weak var imageViewAppLogo: UIImageView!
        @IBOutlet private weak var labelAppType: UILabel!
        @IBOutlet private weak var viewContainerOfImageView: UIView!
    
        override func awakeFromNib() {
            super.awakeFromNib()
            initViews()
        }
    
        private func initViews() {
            viewContainer.backgroundColor = .systemGray6
            labelAppType.font = UIFont.prepareGillSansSemiBoldFont(size: 15)
            viewContainer.clipsToBounds = true
            viewContainer.layer.cornerRadius = 16
            imageViewAppLogo.layer.cornerRadius = 8
            viewContainer.layer.borderColor = UIColor.Custom.foregroundColor.cgColor
            viewContainer.layer.borderWidth = 1.5
            imageViewAppLogo.contentMode = .scaleAspectFill
            imageViewAppLogo.clipsToBounds = true
        }
        
        func configure(with model: AppTypeCellModel) {
            let appType = model.appType
            imageViewAppLogo.image = appType.appLogo
            labelAppType.text = appType.appName
            if appType == .allApps {
                viewContainerOfImageView.isHidden = true
            }
        }
        
        func configureSelectedItem() {
            viewContainer.backgroundColor = UIColor.Custom.foregroundColor
            labelAppType.textColor = .black
        }
        
        func clearPreviousSelectedItem() {
            viewContainer.backgroundColor = .clear
            labelAppType.textColor = .label
        }
    
        override func prepareForReuse() {
            super.prepareForReuse()
            labelAppType.textColor = .label
            viewContainer.backgroundColor = .clear
            viewContainerOfImageView.isHidden = false
        }
    }

我通过给它一个固定值来实现我想要的高度,例如55。我附上了我想要的结果和我编写的代码的屏幕截图。

那么,这里有什么问题吗?

fixed 55 height constraint and the result I want

collection view automatic height calculation result

我使用“contentsize”来计算其自身的高度,但它不能按预期工作。

swift uicollectionview uikit uicollectionviewcell uicollectionviewlayout
1个回答
0
投票

具有流布局的

UICollectionView
根据 YOU 分配的集合视图框架大小来排列其单元格。

如果您在设置集合视图的框架时不知道单元格的高度(或者单元格高度可能在应用程序运行时发生变化),那么您将需要计算单元格高度并在运行时更新集合视图框架。

© www.soinside.com 2019 - 2024. All rights reserved.