当您尝试为 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)
}
}
}
更新:
我是如何通过以下步骤解决这个问题的:
- 在 Storyboard 中创建占位符视图并将其作为 IBOutlet 添加到您的文件所有者(确保在最右侧面板中键入
AnimationView
作为其 class)。
- 以编程方式创建动画视图并将其添加到其直接超级视图中。
- 为该动画视图提供与占位符视图相同的帧
animationView.frame = placeholderView.frame
- 为占位符视图提供您想要的约束条件(
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
我有一个作为 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)
}
}
}
更新:
我是如何通过以下步骤解决这个问题的:
- 在 Storyboard 中创建占位符视图并将其作为 IBOutlet 添加到您的文件所有者(确保在最右侧面板中键入
AnimationView
作为其 class)。 - 以编程方式创建动画视图并将其添加到其直接超级视图中。
- 为该动画视图提供与占位符视图相同的帧
animationView.frame = placeholderView.frame
- 为占位符视图提供您想要的约束条件(
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