在 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 |自动布局的主要内容,如果未能解决你的问题,请参考以下文章
添加专用 UIViewController(例如 Monotouch 中的 UIPageViewController)的正确方法是啥?
UITabBarController 自定义按钮在移动到下一个 ViewController 时不隐藏
使用多个 ViewController、Xcode 将代码连接到情节提要中的 UI
如何在 ViewController 及其 NavigationController 上添加 UIview