在 ViewController 中显示自定义 UIView

Posted

技术标签:

【中文标题】在 ViewController 中显示自定义 UIView【英文标题】:Displaying custom UIView in a ViewController 【发布时间】:2019-02-25 08:17:42 【问题描述】:

我正在创建一个要在视图控制器中显示的 UIView。我创建了 UIView 并显示了,但我现在遇到的问题是:

    当我在视图控制器中调用 UIView 时,我无法再与视图控制器的元素进行交互。我创建的CustomView 完全阻止了与我的视图控制器的交互,我希望能够与 UIViewController 进行交互。

    我想隐藏状态栏,其中包括电池百分比和网络栏和其他内容,以便视图完全覆盖它们。我实现了一个代码来覆盖它们,但它返回一个错误。

下面是我的代码

class SliderView: CustomView 

    @IBOutlet weak var containerView: UIView!
    @IBOutlet weak var sliderImage: UIImageView!
    @IBOutlet weak var sliderText: UILabel!

    override func initialize() 
        super.initialize()

        let name = String(describing: type(of: self))
        let nib = UINib(nibName: name, bundle: .main)
        nib.instantiate(withOwner: self, options: nil)

        self.addSubview(self.containerView)
        self.containerView.translatesAutoresizingMaskIntoConstraints = false
        NSLayoutConstraint.activate([
            self.containerView.topAnchor.constraint(equalTo: self.topAnchor),
            self.containerView.leadingAnchor.constraint(equalTo: self.leadingAnchor),
            self.containerView.trailingAnchor.constraint(equalTo: self.trailingAnchor),
            ])
    

    override func point(inside point: CGPoint, with event: UIEvent?) -> Bool 
        return sliderImage.frame.contains(point)
    

    override var prefersStatusBarHidden: Bool 
        return true
    

  // THIS THROWS an error 'Property does not override any property from its superclass'

我的 UIView 在我的 Viewcontroller 中被调用

 weak var sliderView: SliderView!

    override func loadView() 
        super.loadView()

        let sliderView = SliderView()
        self.view.addSubview(sliderView)
        NSLayoutConstraint.activate([
            sliderView.topAnchor.constraint(equalTo: self.view.topAnchor),
            sliderView.bottomAnchor.constraint(equalTo: self.view.bottomAnchor),
            sliderView.leadingAnchor.constraint(equalTo: self.view.leadingAnchor),
            sliderView.trailingAnchor.constraint(equalTo: self.view.trailingAnchor),
            ])
        self.sliderView = sliderView
    

    override func viewDidLoad() 
        super.viewDidLoad()

        sliderView.sliderText.text = "HOOOOO WORKS"

【问题讨论】:

override var prefersStatusBarHidden: Bool return true 可能应该进入 viewcontroller 而不是 uiview。 至于第一点不确定。也许您的自定义视图覆盖了整个 uiviewcontroller 视图,因此捕获了用户触摸 正如@ioser 所说,prefersStatusBarHidden 是 UIViewController 的属性,而不是 UIView 的属性。这是您遇到的唯一问题,还是您实际上在处理 VC 和视图之间的交互时遇到了问题? 我认为override var prefersStatusBarHidden: Bool return true 是一个uiviewcontroller 属性,但第一个问题仍未解决@iOSer @JillevdW CustomView 类有什么作用? (您正在继承 SliderView) 【参考方案1】:
NSLayoutConstraint.activate([
            sliderView.topAnchor.constraint(equalTo: self.view.topAnchor),
            sliderView.bottomAnchor.constraint(equalTo: self.view.bottomAnchor),
            sliderView.leadingAnchor.constraint(equalTo: self.view.leadingAnchor),
            sliderView.trailingAnchor.constraint(equalTo: self.view.trailingAnchor),
            ])

您的自定义视图覆盖了整个UIViewController。因此,无法与UIViewController 进行交互。

只需尝试将第二个约束替换为以下内容,以仅覆盖屏幕高度的一半:

sliderView.topAnchor.constraint.bottomAnchor.constraint(equalTo: self.view.bottomAnchor, constant: -UIScreen.main.bounds.height*0.5)

这只是一个查看差异的建议,即不是解决方案。

【讨论】:

以上是关于在 ViewController 中显示自定义 UIView的主要内容,如果未能解决你的问题,请参考以下文章

IOS:将viewcontroller添加到ios中的自定义TabBar

IOS让返回按钮显示自定义标题而不是上个ViewController的title

使自定义viewcontroller覆盖导航栏

从 ViewController 设置自定义 UIView 的图像

使自定义viewcontroller覆盖导航栏

Interface Builder - 自定义类未显示