将 UIView 添加到 UICollectionViewController 的底部

Posted

技术标签:

【中文标题】将 UIView 添加到 UICollectionViewController 的底部【英文标题】:Adding a UIView to the bottom of a UICollectionViewController 【发布时间】:2017-08-22 11:19:49 【问题描述】:

我有一个 UICollectionViewController 嵌入在 UINavigationController 中,而 UINavigationController 又嵌入在 UITabBarController 中。

我想在标签栏上方的UICollectionViewController 中添加一个UIView(以红色矩形显示)。

我将 UIView 单独创建为 nib 文件。

import UIKit

class BottomView: UIView 

    @IBOutlet var view: UIView!

    required init?(coder aDecoder: NSCoder) 
        super.init(coder: aDecoder)
        commonInit()
    

    override init(frame: CGRect) 
        super.init(frame: frame)
        commonInit()
    

    fileprivate func commonInit() 
        Bundle.main.loadNibNamed("BottomView", owner: self, options: nil)
        view.frame = self.frame
        view.autoresizingMask = [.flexibleHeight, .flexibleWidth]
        addSubview(view)
    

我像这样初始化并添加到UICollectionViewController中。

class CollectionViewController: UICollectionViewController 

    fileprivate var bottomView: BottomView!

    override func viewDidLoad() 
        super.viewDidLoad()

        let yPos = view.bounds.height - (tabBarController!.tabBar.frame.size.height + 44)
        bottomView = BottomView(frame: CGRect(x: 0, y: yPos, width: view.bounds.width, height: 44))
        collectionView?.addSubview(bottomView)
    

    // ...


我想如果我从整个视图的高度中减去底部视图加上标签栏的组合高度,我应该能够得到正确的y 位置值。但它没有发生。视图正在添加,但离屏幕很远。

如何在不进行硬编码的情况下计算正确的 y 位置?

Example demo project

【问题讨论】:

从 UICollectionView 创建 BottomView 怎么样? 我不确定你的意思.. 您可以将底部视图添加为 CollectionView 的 footerView 你的BottomView应该和collectionView一起滚动吗? @AravindAR 它会随着收藏视图滚动吗? 【参考方案1】:

我建议将BottomView 添加到UICollectionViewControllerview 而不是集合视图本身。这是您遇到的问题的一部分。

您还尝试使用来自view.bounds 的值在viewDidLoad() 方法中设置BottomView 的框架。此时 CGRect 将返回(0.0, 0.0, 0.0, 0.0),因为布局尚未发生,这很可能是您的定位关闭的原因。尝试将布局逻辑移至 viewWillLayoutSubviews() 方法,看看是否有帮助。

更好的方法是设置自动布局约束而不是手动定义框架,这将花费您大量的精力。

这是一个简单的例子:

self.bottomView.translatesAutoresizingMaskIntoConstraints = false
self.view.insertSubview(self.bottomView, at: 0)
self.bottomView.bottomAnchor.constraint(equalTo: self.view.layoutMarginsGuide.bottomAnchor).isActive = true
self.bottomView.leadingAnchor.constraint(equalTo: self.view.leadingAnchor).isActive = true
self.bottomView.trailingAnchor.constraint(equalTo: self.view.trailingAnchor).isActive = true
self.bottomView.heightAnchor.constraint(equalToConstant: 100.0).isActive = true

您可以在 viewDidLoad() 中应用自动布局逻辑,它应该可以正常工作。

您可以在此处找到有关以编程方式设置自动布局约束的更多信息:

https://developer.apple.com/library/content/documentation/UserExperience/Conceptual/AutolayoutPG/ProgrammaticallyCreatingConstraints.html

【讨论】:

【参考方案2】:

听起来你想要实现的正是 UICollectionView 的页脚视图。

footerView 就像一个视图,它会粘在 collectionView 的底部,不会随单元格一起移动。

这将帮助您添加页脚视图:https://***.com/a/26893334/3165112

希望有帮助!

【讨论】:

以上是关于将 UIView 添加到 UICollectionViewController 的底部的主要内容,如果未能解决你的问题,请参考以下文章

将 UIView 添加到情节提要

如何将 UIView 添加到 UINavigationController 堆栈

将滚动视图添加到 UIView

如何将 UIView 添加到 CALayer

将 TabBArController 添加到 UIView

无法将 pageViewController 添加到 UIView