ios - 将 UIView 添加到 UICollectionViewController 的底部

标签 ios swift uiview uicollectionview

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

enter image description here

我想将一个UIView添加到标签栏上方的UICollectionViewController(由红色矩形显示)。

enter image description here

我将 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 位置而不对其进行硬编码?

Example demo project

最佳答案

我建议将 BottomView 添加到 UICollectionViewControllerview 而不是 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() 中应用自动布局逻辑,它应该可以正常工作。

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

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

关于ios - 将 UIView 添加到 UICollectionViewController 的底部,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45816206/

相关文章:

ios - UIScrollView 不使用自动布局滚动(内容 View 框架大小以编程方式更改)

iphone - 状态栏轮换通知

ios - Swift 3 转换

string - Swift - 查找字符串中两个位置之间的子字符串

ios - 如何在3D Touch下注册预览单个单元格?

ios - 将用户注册到 firebase 并登录(如果已注册)

iOS 导航栏 VS UIToolBar

objective-c - xcodebuild 存档配置不起作用

iOS:使用 LaunchImage 作为应用背景

ios - 是否可以隐藏类的继承?