当您尝试为 UIView 提供约束时,SnapKit 会抛出错误

SnapKit throws an error when you try to give constraints to UIView

我有一个作为 IBOutlet 连接到我的视图控制器的 UIView。我在我的 ViewDidLoad 方法中为这个 属性 分配了一个 AnimationView class 实例,并使用 animationView.snp.makeConstraints { (make) in make.width.equalTo(view).multipliedBy(0.5) }

对其设置了约束

但是当我 运行 我的项目时,我收到此错误消息,指出“约束或其锚点是否引用不同视图层次结构中的项目?这是非法的”

我不知道为什么会收到此错误消息。谁能解释我做错了什么?

下面是我的项目图片:

以及正文中的源代码:

import UIKit
import SnapKit
import Lottie

class ViewController: UIViewController {

    @IBOutlet var myView: UIView!
    
    override func viewDidLoad() {
        myView = AnimationView()
        myView.snp.makeConstraints { (make) in
            make.width.equalTo(view).multipliedBy(0.5)
            make.height.equalTo(view).multipliedBy(0.5)
        }
    }
    
}

更新:

我是如何通过以下步骤解决这个问题的:

  1. 在 Storyboard 中创建占位符视图并将其作为 IBOutlet 添加到您的文件所有者(确保在最右侧面板中键入 AnimationView 作为其 class)。
  2. 以编程方式创建动画视图并将其添加到其直接超级视图中。
  3. 为该动画视图提供与占位符视图相同的帧 animationView.frame = placeholderView.frame
  4. 为占位符视图提供您想要的约束条件(placeholderView.snp.makeConstraints { (make) in ... })

现在您已将以编程方式创建的视图连接到 Storyboard 中的占位符视图。您的编程视图将随着占位符视图的大小而改变大小。

1- 你不应该改变视图的类型

 @IBOutlet var myView:UIView!
 var animationV:AnimationView!

然后

animationV = AnimationView()
view.addSubview(animationV)

2- 添加 centerX/Y 约束到 animationV

BTW you don't have to set a view in IB , make it programmatic one only and give it all suitable constraints

首先,在您的代码中,您没有调用 super.viewDidLoad() 这非常重要,而且 tbh 可能会导致问题。

其次,将 @IBOutlet 更改为 var,因此 var myView: AnimationView!

第三,在添加约束之前,您可能需要将 myView 添加到您的视图或其父级,例如 view.addSubView(myView)

var myView: AnimationView!

override func viewDidLoad() {
    super.viewDidLoad()
    myView = AnimationView()
    view.addSubView(myView)

    myView.snp.makeConstraints { (make) in
        make.width.equalTo(view).multipliedBy(0.5)
        make.height.equalTo(view).multipliedBy(0.5)
        make.centerY.equalTo(self.view)
        make.centerX.equalTo(self.view)
    }
}

如果您想将其保留在 Storyboard 中:

@IBOutlet weak var myView: AnimationView!

override func viewDidLoad() {
    super.viewDidLoad()

    myView.snp.makeConstraints { (make) in
        make.width.equalTo(view).multipliedBy(0.5)
        make.height.equalTo(view).multipliedBy(0.5)
        make.centerY.equalTo(self.view)
        make.centerX.equalTo(self.view)
    }
}

要将其保留为情节提要,您需要将情节提要中视图的 class 设置为 AnimationView