冲突约束(不存在)(迅速4) [英] Conflicting Constraints (that do not exist) (Swift 4)

查看:63
本文介绍了冲突约束(不存在)(迅速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)>

通过反复试验,我发现如果cv1Heightcv2Height的总和超过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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆