ios - 约束 UICollectionView 高度以匹配内容的高度

标签 ios swift cocoa-touch

我有一个使用 UICollectionViewFlowLayout 的 UICollectionView。滚动方向是垂直的,但我只有少量(可变)单元格,不需要或不想滚动。 Collection View 的顶部、前导和尾随被限制于父 View 。我正在尝试让 Collection View 高度适合其内容。

如果我使用这个,初始高度看起来是正确的:

class ViewController: UIViewController, UICollectionViewDataSource, UICollectionViewDelegate {
    var collection: UICollectionView!
    var heightConstraint: NSLayoutConstraint!

    override func loadView() {
        super.loadView()
        self.collection = UICollectionView(frame: .zero, collectionViewLayout: UICollectionViewFlowLayout())
        self.collection.translatesAutoresizingMaskIntoConstraints = false
        self.view.addSubview(self.collection)
        // ...
        self.collection.topAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.topAnchor).isActive = true
        self.collection.leadingAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.leadingAnchor).isActive = true
        self.collection.trailingAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.trailingAnchor).isActive = true

        // Create placeholder constraint
        self.heightConstraint = self.collection.heightAnchor.constraint(equalToConstant: 1)
        self.heightConstraint.isActive = true
    }

    func collectionView(_ collectionView: UICollectionView, willDisplay cell: UICollectionViewCell, forItemAt indexPath: IndexPath) {
        // Update placeholder constraint
        self.heightConstraint.constant = self.collection.contentSize.height
    }

    // ...
}

但是,当内容布局发生变化(例如设备方向发生变化)时,这不会更新 Collection View 的高度。有没有办法在内容布局发生变化时更新约束常量?或者使用动态约束而不是常量的方法?

Swift 4.2、Xcode 10.0、目标 iOS 12。

最佳答案

更新约束的更好位置是 viewDidLayoutSubviews,它会在每次重新布局(方向更改、大小更改等)后调用。此外,向 Collection View 布局询问内容大小更可靠:

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()

    // Update placeholder constraint
    self.heightConstraint.constant = self.collection.collectionViewLayout.collectionViewContentSize.height
}

关于ios - 约束 UICollectionView 高度以匹配内容的高度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52463609/

相关文章:

objective-c - 发布版本中 rawValue 的重新声明无效

objective-c - iOS - cellForRowAtIndexPath SQLite 排序数据?

ios - 返回不同值的 NSCalendar 组件

ios - 我想放置具有不同标签文本颜色的选框标签

ios - 无法使用 iOS SDK 和 native Facebook 应用程序向 Facebook 进行身份验证

javascript - 如何在 iOS 的 UIWebView 中获取触摸图像数据

ios - TinyIoC、Xamarin.iOS、链接器设置

ios - 我应该使用委托(delegate)方法还是 UINotificationCenter

java - Swift 中的按位移位与 Java 不同

iphone - 自定义字体在我的应用程序中不起作用?