在 ViewController 的中心添加 UIView |自动布局

Posted

技术标签:

【中文标题】在 ViewController 的中心添加 UIView |自动布局【英文标题】:Adding UIView in Centre of ViewController | AutoLayout 【发布时间】:2020-05-26 09:17:36 【问题描述】:

所以我创建了一个进度指示器视图,用于在 API 调用中显示。我为它创建了一个自定义 UIView 类。

现在,一切正常。但是视图的位置应该在中心,但不是。

我认为我的限制是正确的,但仍然无法正常工作。

这是我的代码:

import Foundation
import UIKit
import UICircularProgressRing
import HGRippleRadarView


class ProgressIndicator : UIView 

    @IBOutlet weak var contentView : UIView!
    @IBOutlet weak var progressView : UICircularProgressRing!
    @IBOutlet weak var logoContainerView : UIView!
    @IBOutlet weak var rippleView : RippleView!

    static let shared = ProgressIndicator()

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

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

    func commonInit() 
        Bundle.main.loadNibNamed("ProgressIndicator", owner: self, options: nil)
        addSubview(contentView)

    

    public func show(controller : UIViewController) 
        setupLoadingView(controller : controller)
    

    public func hide() 
        removeLoadingView()
    

    private func setupLoadingView(controller : UIViewController) 

        controller.view.addSubview(self)

        // adding contrints on main view
        let leadingConstraint = NSLayoutConstraint(item: self, attribute: NSLayoutConstraint.Attribute.leading, relatedBy: NSLayoutConstraint.Relation.equal, toItem: controller.view, attribute: NSLayoutConstraint.Attribute.leading, multiplier: 1, constant: 0)

        let trailingConstraint = NSLayoutConstraint(item: self, attribute: NSLayoutConstraint.Attribute.trailing, relatedBy: NSLayoutConstraint.Relation.equal, toItem: controller.view, attribute: NSLayoutConstraint.Attribute.trailing, multiplier: 1, constant: 0)

        let topConstraint = NSLayoutConstraint(item: self, attribute: NSLayoutConstraint.Attribute.top, relatedBy: NSLayoutConstraint.Relation.equal, toItem: controller.view, attribute: NSLayoutConstraint.Attribute.top, multiplier: 1, constant: 0)

        let bottomConstraint = NSLayoutConstraint(item: self, attribute: NSLayoutConstraint.Attribute.bottom, relatedBy: NSLayoutConstraint.Relation.equal, toItem: controller.view, attribute: NSLayoutConstraint.Attribute.bottom, multiplier: 1, constant: 0)

        controller.view.addConstraints([leadingConstraint, trailingConstraint, topConstraint, bottomConstraint])

        // adding constraints on content view

        let leadingConstraint1 = NSLayoutConstraint(item: self.contentView!, attribute: NSLayoutConstraint.Attribute.leading, relatedBy: NSLayoutConstraint.Relation.equal, toItem: self, attribute: NSLayoutConstraint.Attribute.leading, multiplier: 1, constant: 0)

        let trailingConstraint1 = NSLayoutConstraint(item: self.contentView!, attribute: NSLayoutConstraint.Attribute.trailing, relatedBy: NSLayoutConstraint.Relation.equal, toItem: self, attribute: NSLayoutConstraint.Attribute.trailing, multiplier: 1, constant: 0)

        let topConstraint1 = NSLayoutConstraint(item: self.contentView!, attribute: NSLayoutConstraint.Attribute.top, relatedBy: NSLayoutConstraint.Relation.equal, toItem: self, attribute: NSLayoutConstraint.Attribute.top, multiplier: 1, constant: 0)

        let bottomConstraint1 = NSLayoutConstraint(item: self.contentView!, attribute: NSLayoutConstraint.Attribute.bottom, relatedBy: NSLayoutConstraint.Relation.equal, toItem: self, attribute: NSLayoutConstraint.Attribute.bottom, multiplier: 1, constant: 0)

        self.addConstraints([leadingConstraint1, trailingConstraint1, topConstraint1, bottomConstraint1])


        self.setNeedsLayout()
        self.reloadInputViews()
        self.layoutIfNeeded()


    


这是 m 得到的结果:

这里是xib文件截图

【问题讨论】:

不相关的代码太多了,为什么不用锚点? @Frankenstein 好吧,让我只放必要的代​​码......我确实使用了锚点,但仍然得到相同的结果,所以我切换到 NSLayoutConstraints。 如果你使用的是 xib 为什么不使用自动布局呢? @Frankenstein 你不明白我猜。 Content View 不在中间。查看我的上一张截图。 我明白了,我只是问您是否认为问题与自动布局有关,也许您可​​以解决。另外,请尝试提供minimal-reproducible-example。我可以在 xcode 游乐场尝试一下。 【参考方案1】:

您已添加约束,但未将 translatesAutoresizingMaskIntoConstraints 设置为 false

self.translatesAutoresizingMaskIntoConstraints = false
self.contentView.translatesAutoresizingMaskIntoConstraints = false

【讨论】:

以上是关于在 ViewController 的中心添加 UIView |自动布局的主要内容,如果未能解决你的问题,请参考以下文章

添加专用 UI​​ViewController(例如 Monotouch 中的 UIPageViewController)的正确方法是啥?

UITabBarController 自定义按钮在移动到下一个 ViewController 时不隐藏

使用多个 ViewController、Xcode 将代码连接到情节提要中的 UI

如何在 ViewController 及其 NavigationController 上添加 UIview

ios 7中的UI Popover ViewController?

故事板中的子类 viewController 并以编程方式从子类更改 UI