Xib(storyboard)에서 AutoLayout을 설정한 다음 코드에서 AutoLayout을 설정하면 Unable to simultansly satisfy constraints.

12957 단어 AutoLayoutSwiftiOS
Xib(storyboard)에서 오토Layout을 설정한 뒤 코드에서 제약을 추가하려면 이런 경고가 출력돼 원활하게 돌아가지 못하고 작동하지 않을 가능성이 있다.
나는 이 문제를 고려할 것이다.
2016-02-01 01:14:22.181 TestAutoLayout[3159:1247734] 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:0x7ffc61c43270 H:|-(100)-[UIButton:0x7ffc61c33da0'Button']   (Names: '|':UIView:0x7ffc61c355c0 )>",
    "<NSLayoutConstraint:0x7ffc61d90740 H:|-(200)-[UIButton:0x7ffc61c33da0'Button']   (Names: '|':UIView:0x7ffc61c355c0 )>"
)

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x7ffc61d90740 H:|-(200)-[UIButton:0x7ffc61c33da0'Button']   (Names: '|':UIView:0x7ffc61c355c0 )>

Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger.
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKit/UIView.h> may also be helpful.

개요


예를 들어'버튼을 누르면 가장자리를 열고 다른 제어를 설정하려고 한다'.
구체적으로 말하면interfacebuilder(storyboard)에서 기본적인 디자인을 한 다음에 버튼을 눌러서 이윤을 조정하려고 하는 등이다.
아무것도 하기 싫다면 제목에 있는 경고가 나오고 제대로 움직이지 못할 수도 있다.

예제



초기 상태.버튼의 위아래 좌우 여백은 0입니다.
인터페이스 메이커에서 봤어요.

클릭하면 좌우 거리가 넓어집니다.
다시 한 번 누르면 보증금 0으로 돌아간다.

뭘 경고했어?


NSAutoLayout의 인터페이스는 추가, 삭제만 가능합니다. (업데이트된 인터페이스가 있으면 알려주세요!)단추를 눌렀을 때의 제약을 추가하려면 기본 제약과 충돌합니다. 어느 것이 정확한지 경고합니다. (로그와 같습니다.)

어떻게 하면 좋을까요?


프로젝트 0IBOutlet에서 인터페이스 Builder와 미리 결합하여 constant 변경 (압도적인 감사 to@woxtu)


이렇게...
@IBOutlet weak var constraintMargin: NSLayoutConstraint!
여기서 결합.

그렇구나.
self.constraintMargin.constant = 40

프로젝트 1 코드 설정만 사용


Xcode에서 충돌하는 구속을 제거합니다.
이번에는 좌우 테두리 설정을 삭제했다.
Interface Builder에서 제한이 충분하지 않습니다!이런 경고가 있다. "시끄러워!"강한 의지를 가지고 무시하다.
class ViewController: UIViewController {
    @IBOutlet weak var button: UIButton!
    private var on: Bool = false
    var contraintsOn: [NSLayoutConstraint]! // 強気の!
    var contraintsOff: [NSLayoutConstraint]!

    override func viewDidLoad() {
        super.viewDidLoad()
        loadContraints()
        applyConstraint()
    }

    private func loadContraints() {
        let viewDictionary:Dictionary = ["button": button]
        contraintsOn = NSLayoutConstraint.constraintsWithVisualFormat(
            "H:|-\(100)-[button]-\(100)-|",
            options : NSLayoutFormatOptions(rawValue: 0),
            metrics: nil,
            views: viewDictionary)
        contraintsOff = NSLayoutConstraint.constraintsWithVisualFormat(
            "H:|-\(0)-[button]-\(0)-|",
            options : NSLayoutFormatOptions(rawValue: 0),
            metrics: nil,
            views: viewDictionary)
    }

    @IBAction func buttonAction() {
        applyConstraint()
    }
    private func applyConstraint() {
        on = !on
        // clear constraints. 三項演算子を使ってもいいけどこっちのが見やすいと僕は思いました。
        NSLayoutConstraint.deactivateConstraints(contraintsOff)
        NSLayoutConstraint.deactivateConstraints(contraintsOn)
        // apply
        NSLayoutConstraint.activateConstraints(on ? contraintsOn! : contraintsOff!)
    }
}
viewDidLoad 이후 ON/OFF에 대한 제약을 미리 세우고 제거 후 제약을 추가하는 방안이다.
지루하게 느껴지지만 없진 않나...

2UIStackView 고려 사항


UIStackView는 iOS 9에서 사용할 수 있습니다.
이번처럼 이윤이 동태적으로 바뀐 것은 다른 통제를 보여주거나 숨기거나 숨기려는 경우가 많다.
이 경우 UIStackView는 좋은 느낌을 받을 수 있습니다.
안천 선생의 슬라이드 아주 좋아요.
코드를 통해 디스플레이와 숨김을 전환하면view를 조정할 수 있습니다.
나는 iOS 9로 2016년을 속박하는 것이 아직도 심각하다고 생각한다.
슬라이드도 있지만 iOS 7 이후port도 있다OAStackView.
인터페이스 빌더도 커스텀 클래스 막대에 기재하면 설정도 가능하고 할 수도 있다.
하지만 인터페이스 빌더에서 예쁜 미리보기는 포기하고 부품만 배치하는 게 좋을 것 같다(미리보기를 예쁘게 하기 위해 AutoLayout을 추가하면 출발점으로 돌아간다).

총결산


출시 예정어쨌든 쉽게 고치고 싶다면 조언1.
예쁘게 하려면 방안2로 하자.
다른 해결책이 있다면 알려주세요.

좋은 웹페이지 즐겨찾기