将 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
添加到UICollectionViewController
的view
而不是集合视图本身。这是您遇到的问题的一部分。
您还尝试使用来自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 的底部的主要内容,如果未能解决你的问题,请参考以下文章