冲突约束(不存在)(迅速4) [英] Conflicting Constraints (that do not exist) (Swift 4)
问题描述
旋转手机时,我正在重新排列以下三个视图:
I am rearranging three views like this when the phone is rotated:
我将约束设置如下:
var narrowConstraints: [NSLayoutConstraint] = []
var wideConstraints: [NSLayoutConstraint] = []
func setConstraints1() {
let cv1Height: CGFloat = 325
let cv3Height: CGFloat = 125
cv1.translatesAutoresizingMaskIntoConstraints = false
cv2.translatesAutoresizingMaskIntoConstraints = false
cv3.translatesAutoresizingMaskIntoConstraints = false
let g = view.safeAreaLayoutGuide
// wh
narrowConstraints = [
// set cv1 height
cv1.heightAnchor.constraint(equalToConstant: cv1Height),
// lock top, left and right to safe area
cv1.topAnchor.constraint(equalTo: g.topAnchor),
cv1.leadingAnchor.constraint(equalTo: g.leadingAnchor),
cv1.trailingAnchor.constraint(equalTo: g.trailingAnchor),
// lock left and right to safe area
cv2.leadingAnchor.constraint(equalTo: g.leadingAnchor),
cv2.trailingAnchor.constraint(equalTo: g.trailingAnchor),
// lock top of cv2 to bottom of cv1
cv2.topAnchor.constraint(equalTo: cv1.bottomAnchor),
// lock bottom of cv2 to top of cv3
cv2.bottomAnchor.constraint(equalTo: cv3.topAnchor),
// set cv3 height
cv3.heightAnchor.constraint(equalToConstant: cv3Height),
// lock left, right and bottom to safe area
cv3.leadingAnchor.constraint(equalTo: g.leadingAnchor),
cv3.trailingAnchor.constraint(equalTo: g.trailingAnchor),
cv3.bottomAnchor.constraint(equalTo: g.bottomAnchor),
]
wideConstraints = [
// lock top, bottom, and left to safe area
cv1.topAnchor.constraint(equalTo: g.topAnchor),
cv1.bottomAnchor.constraint(equalTo: g.bottomAnchor),
cv1.leadingAnchor.constraint(equalTo: g.leadingAnchor),
// lock right side of cv1 to left side of cv2
cv1.trailingAnchor.constraint(equalTo: cv2.leadingAnchor),
// lock right side of cv2 to safe area
cv2.trailingAnchor.constraint(equalTo: g.trailingAnchor),
// lock top of cv2 to safe area
cv2.topAnchor.constraint(equalTo: g.topAnchor),
// lock bottom of cv2 to top of cv3
cv2.bottomAnchor.constraint(equalTo: cv3.topAnchor),
// set cv3 height
cv3.heightAnchor.constraint(equalToConstant: cv3Height),
// lock bottom and right side of cv3 to safe area
cv3.trailingAnchor.constraint(equalTo: g.trailingAnchor),
cv3.bottomAnchor.constraint(equalTo: g.bottomAnchor),
// make them all equal widths
cv2.widthAnchor.constraint(equalTo: cv1.widthAnchor),
cv3.widthAnchor.constraint(equalTo: cv2.widthAnchor),
]
if view.frame.width > view.frame.height {
// if landscape
NSLayoutConstraint.deactivate(narrowConstraints)
NSLayoutConstraint.activate(wideConstraints)
}
else { // portrait
NSLayoutConstraint.deactivate(wideConstraints)
NSLayoutConstraint.activate(narrowConstraints)
}
}
override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
super.viewWillTransition(to: size, with: coordinator)
coordinator.animate(alongsideTransition: { _ in
if size.width > size.height {
// we're transitioning to wider than tall
NSLayoutConstraint.deactivate(self.narrowConstraints)
NSLayoutConstraint.activate(self.wideConstraints)
} else {
// we're transitioning to taller than wide
NSLayoutConstraint.deactivate(self.wideConstraints)
NSLayoutConstraint.activate(self.narrowConstraints)
}
}, completion: {
_ in
// if you want to do something after the transition
//self.cv2.setNeedsDisplay()
})
}
一切似乎都很正常-除了以下错误消息:
It all appears to work perfectly - except for the following error message:
2020-10-16 14:33:57.364778-0600 ViewPositions2[38358:6108060] [LayoutConstraints] Unable to simultaneously satisfy constraints.
Probably at least one of the constraints in the following list is one you don't want.
Try this:
(1) look at each constraint and try to figure out which you don't expect;
(2) find the code that added the unwanted constraint or constraints and fix it.
(
"<NSLayoutConstraint:0x6000033a9130 UIView:0x7fb41950ad90.height == 325 (active)>",
"<NSLayoutConstraint:0x6000033aa800 UIView:0x7fb41950ad90.top == UILayoutGuide:0x6000029bcb60'UIViewSafeAreaLayoutGuide'.top (active)>",
"<NSLayoutConstraint:0x6000033aa3f0 V:[UIView:0x7fb41950ad90]-(0)-[UIView:0x7fb41950dec0] (active)>",
"<NSLayoutConstraint:0x6000033a9ea0 UIView:0x7fb41950dec0.bottom == UIView:0x7fb41950e8f0.top (active)>",
"<NSLayoutConstraint:0x6000033a9c70 UIView:0x7fb41950e8f0.height == 125 (active)>",
"<NSLayoutConstraint:0x6000033aa2b0 UIView:0x7fb41950e8f0.bottom == UILayoutGuide:0x6000029bcb60'UIViewSafeAreaLayoutGuide'.bottom (active)>",
"<NSLayoutConstraint:0x60000339ff20 'UIView-Encapsulated-Layout-Height' UIView:0x7fb41950f1c0.height == 375 (active)>",
"<NSLayoutConstraint:0x60000339b840 'UIViewSafeAreaLayoutGuide-bottom' V:[UILayoutGuide:0x6000029bcb60'UIViewSafeAreaLayoutGuide']-(0)-| (active, names: '|':UIView:0x7fb41950f1c0 )>",
"<NSLayoutConstraint:0x60000339b7a0 'UIViewSafeAreaLayoutGuide-top' V:|-(0)-[UILayoutGuide:0x6000029bcb60'UIViewSafeAreaLayoutGuide'] (active, names: '|':UIView:0x7fb41950f1c0 )>"
)
Will attempt to recover by breaking constraint
<NSLayoutConstraint:0x6000033a9130 UIView:0x7fb41950ad90.height == 325 (active)>
通过反复试验,我发现如果cv1Height
和cv2Height
的总和超过375(横向视图高度),则会出现此错误消息.
Through trial and error, I figured out that this error message occurs if the sum of cv1Height
and cv2Height
exceeds 375 (the view height in landscape).
但是,不仅在风景中我不激活narrowConstraints
,而且cv1
永远不在风景中的cv3
之上!
But, not only am I deactivating narrowConstraints
when in landscape, cv1
is never on top of cv3
in landscape!
为什么会发生这种冲突?我该如何预防??
Why is this conflict occurring? How do I prevent it???
推荐答案
冲突是由过渡期间状态栏的出现引起的.虽然您可以忽略警告(它不会影响应用程序的操作或外观),但可以通过降低纵向配置中cv1
高度限制的优先级将其静音:
The conflict is caused by the appearance of the status bar during the transition. While you can ignore the warning (it doesn't affect the operation or appearance of your app), it can be silenced by lowering the priority of your cv1
height constraint in the portrait configuration:
let h1 = cv1.heightAnchor.constraint(equalToConstant: cv1Height)
h1.priority = .defaultHigh
narrowConstraints = [
// set cv1 height
h1,
// lock top, left and right to safe area
cv1.topAnchor.constraint(equalTo: g.topAnchor),
cv1.leadingAnchor.constraint(equalTo: g.leadingAnchor),
cv1.trailingAnchor.constraint(equalTo: g.trailingAnchor),
// lock left and right to safe area
cv2.leadingAnchor.constraint(equalTo: g.leadingAnchor),
cv2.trailingAnchor.constraint(equalTo: g.trailingAnchor),
// lock top of cv2 to bottom of cv1
cv2.topAnchor.constraint(equalTo: cv1.bottomAnchor),
// lock bottom of cv2 to top of cv3
cv2.bottomAnchor.constraint(equalTo: cv3.topAnchor),
// set cv3 height
cv3.heightAnchor.constraint(equalToConstant: cv3Height),
// lock left, right and bottom to safe area
cv3.leadingAnchor.constraint(equalTo: g.leadingAnchor),
cv3.trailingAnchor.constraint(equalTo: g.trailingAnchor),
cv3.bottomAnchor.constraint(equalTo: g.bottomAnchor),
]
这篇关于冲突约束(不存在)(迅速4)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!