我有一个 UICollectionViewController
嵌入在 UINavigationController
中,而 UINavigationController
又嵌入在 UITabBarController
中。
我想将一个UIView
添加到标签栏上方的UICollectionViewController
(由红色矩形显示)。
我将 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)
}
// ...
}
我想如果我从整个 View 的高度中减去底部 View 加上选项卡栏的组合高度,我应该能够获得正确的 y 位置值。但这并没有发生。 View 正在添加,但远离屏幕。
如何计算正确的 y 位置而不对其进行硬编码?
最佳答案
我建议将 BottomView
添加到 UICollectionViewController
的 view
而不是 Collection 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()
中应用自动布局逻辑,它应该可以正常工作。
您可以在此处找到有关以编程方式设置自动布局约束的更多信息:
关于ios - 将 UIView 添加到 UICollectionViewController 的底部,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45816206/