【问题标题】:Adding UIView in Centre of ViewController | AutoLayout在 ViewController 的中心添加 UIView |自动布局
【发布时间】: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 游乐场尝试一下。

标签: ios swift uiview


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多