구속 조건을 동시에 만족시킬 수 없음, 구속 조건을 해제하여 복구 시도


145

아래는 디버그 영역에서 수신되는 오류 메시지입니다. 제대로 실행 되고이 오류를 수신하는 것 외에는 잘못된 것이 없습니다. 이것이 애플이 앱을 수락하지 못하게합니까? 어떻게 고치나요?

2012-07-26 01:58:18.621 Rolo[33597:11303] 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. (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints) 
(
    "<NSAutoresizingMaskLayoutConstraint:0x887d630 h=--& v=--& V:[UIButtonLabel:0x886ed80(19)]>",
    "<NSAutoresizingMaskLayoutConstraint:0x887d5f0 h=--& v=--& UIButtonLabel:0x886ed80.midY == + 37.5>",
    "<NSAutoresizingMaskLayoutConstraint:0x887b4b0 h=--& v=--& V:[UIButtonLabel:0x72bb9b0(19)]>",
    "<NSAutoresizingMaskLayoutConstraint:0x887b470 h=--& v=--& UIButtonLabel:0x72bb9b0.midY == - 0.5>",
    "<NSLayoutConstraint:0x72bf860 V:[UILabel:0x72bf7c0(17)]>",
    "<NSLayoutConstraint:0x72c2430 UILabel:0x72bfad0.top == UILabel:0x72bf7c0.top>",
    "<NSLayoutConstraint:0x72c2370 UILabel:0x72c0270.top == UILabel:0x72bfad0.top>",
    "<NSLayoutConstraint:0x72c22b0 V:[UILabel:0x72bf7c0]-(NSSpace(8))-[UIButton:0x886efe0]>",
    "<NSLayoutConstraint:0x72c15b0 V:[UILabel:0x72c0270]-(NSSpace(8))-[UIRoundedRectButton:0x72bbc10]>",
    "<NSLayoutConstraint:0x72c1570 UIRoundedRectButton:0x72bbc10.baseline == UIRoundedRectButton:0x7571170.baseline>",
    "<NSLayoutConstraint:0x72c21f0 UIRoundedRectButton:0x7571170.top == UIButton:0x886efe0.top>"
)

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x72bf860 V:[UILabel:0x72bf7c0(17)]>

Break on objc_exception_throw to catch this in the debugger.
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKit/UIView.h> may also be helpful.

1
이 오류는 Xcode 4.5에서만 발생하므로 App Store에 제출할 수 없습니다 (출시 될 때까지)
borrrden

그렇다면 잘못된 것이 있습니까? 그리고 다른 버전의 xcode를 사용하여 앱 스토어에 제출할 수 있습니까?
Johnny Cox

1
예, 문제가 있지만 공개 Xcode 버전에서는 아직 사용할 수없는 iOS 기능과 관련이 있기 때문에 관련이 없습니다. 4.4로 컴파일하면 해당 버전 (오늘 릴리스)을 사용하여 릴리스 할 수 있습니다.
borrrden

Xcode 4.4의 OS X 앱에 대해이 오류 메시지가 나타납니다. 이해가되지 않습니다.
Steve McLeod

@ Bartłomiej Semańczyk 우연히이 방에 들어올 수 있을까요 : chat.stackoverflow.com/rooms/92522/autolayout-and-ios ? 무작위로 죄송하지만 자동 레이아웃과 관련된 조언에 감사드립니다.
cheznead

답변:


275

디버깅하고 제약 조건을 찾는 것이 좋습니다. "원치 않는 것" . 다음과 같은 문제가 있다고 가정하십시오.

여기에 이미지 설명을 입력하십시오

항상 문제는 다음과 같은 제약 조건과 뷰를 찾는 방법입니다.

이 작업을 수행하는 방법에는 두 가지가 있습니다.

  1. 디버그 뷰 계층 구조 (이 방법은 권장하지 않음)

예상치 못한 제약 조건 (PBOUserWorkDayHeaderView)을 어디에서 찾을 수 있는지 알기 때문에이를 상당히 잘 수행 할 수있는 방법이 있습니다. 찾을 수 있습니다 UIViewNSLayoutConstraint빨간색 사각형으로. 우리 는 메모리에 자신의 ID를 알고 있기 때문에 매우 쉽습니다.

  • 디버그 뷰 계층을 사용하여 앱 중지 :

여기에 이미지 설명을 입력하십시오

  • 적절한 UIView를 찾으십시오.

여기에 이미지 설명을 입력하십시오

  • 다음은 NSLayoutConstraint를 찾는 것입니다.

여기에 이미지 설명을 입력하십시오

보다시피, 메모리 포인터는 동일합니다. 그래서 우리는 지금 무슨 일이 일어나고 있는지 알고 있습니다. 또한 NSLayoutConstraint뷰 계층 구조에서 찾을 수 있습니다 . View에서 선택되었으므로 Navigator에서도 선택되었습니다.

여기에 이미지 설명을 입력하십시오

필요한 경우 주소 포인터를 사용하여 콘솔에서 인쇄 할 수도 있습니다.

(lldb) po 0x17dce920
<UIView: 0x17dce920; frame = (10 30; 300 24.5); autoresize = RM+BM; layer = <CALayer: 0x17dce9b0>>

디버거가 지시하는 모든 제약 조건에 대해 동일한 작업을 수행 할 수 있습니다.

  1. 더 나은 인쇄 (이 방법은 Xcode 7입니다.)

    • 뷰의 모든 제약 조건에 대해 고유 식별자를 설정하십시오.

여기에 이미지 설명을 입력하십시오

  • 에 대한 간단한 확장을 만듭니다 NSLayoutConstraint:

스위프트 :

extension NSLayoutConstraint {

    override public var description: String {
        let id = identifier ?? ""
        return "id: \(id), constant: \(constant)" //you may print whatever you want here
    }
}

목표 -C

@interface NSLayoutConstraint (Description)

@end

@implementation NSLayoutConstraint (Description)

-(NSString *)description {
    return [NSString stringWithFormat:@"id: %@, constant: %f", self.identifier, self.constant];
}

@end
  • 다시 한 번 빌드하면 더 읽기 쉬운 출력을 얻을 수 있습니다.

여기에 이미지 설명을 입력하십시오

  • 일단 당신이 당신 id찾으면 찾기 네비게이터 에서 간단히 탭 할 수 있습니다 :

여기에 이미지 설명을 입력하십시오

  • 그리고 빨리 그것을 찾으십시오 :

여기에 이미지 설명을 입력하십시오

그 경우를 간단하게 수정하는 방법은 무엇입니까?

  • 제약 조건이 깨지 도록 우선 순위 를 변경하십시오 999.

이것은 단지 내 버그를 고쳤습니다 ... 고마워. 객관적인 c에 대해 어떻게 하시겠습니까? 카테고리를 추가 하시겠습니까?
cheznead

솔루션을위한 Thx이지만 객관적인 c에서 확장을 사용할 수 있습니까?
dev.nikolaz

해당 식별자는 프로그래밍 방식으로 UIView에서 사용할 수있는 accessibilityIdentifier와 동일합니까? 그렇지 않으면 어떻게 프로그래밍 방식으로 식별자를 설정할 수 있습니까?
Arunabh Das

@Das 아니오, 동일하지 않습니다. 이 답변을
Bartłomiej Semańczyk

3
나는 두 번째 방법이 마음에
들며

108

NSAutoresizingMaskLayoutConstraints가 없어야한다는 문제가 있습니다. 이것은 오래된 스프링과 스트럿 시스템입니다. 이를 제거하려면 제한하려는 각보기에서이 메소드를 실행하십시오.

[view setTranslatesAutoresizingMaskIntoConstraints:NO];

5
setTranslatesAutoresizingMaskIntoConstraints를 NO로 설정할 때 뷰가 전혀 나타나지 않는 이유는 무엇입니까?
topwik

1
예를 들어, SSBadgeView (UIView)를 만들고 imageView subView를 SSBadgeView에 추가 한 다음 SSBAdgeView를 UIReuseableView의 하위 뷰로 추가합니다. SSBadgeView에 제약 조건을 추가하고 SSBadgeView에 setTranslatesAutoresizingMaskIntoConstraints : NO를 추가합니다. SSBadgeView의 이미지 subView가 예상대로 배치되었지만 이미지의 SSBadgeView 부모가 표시되지 않습니다.
topwik 2016 년

1
하위 서브 뷰에서 TranslatesAutoresizingMaskIntoConstraints를 비활성화하는 것을 잊었습니다
Softlion

이 속성을 drive.google.com/file/d/0BxuYs8WHXCF7bV9ndHFrQ0dMYVE / ...로 설정하면 이런 상황이 발생 합니다.이 코드 줄을 사용하고 있습니다. [self.contentView setTranslatesAutoresizingMaskIntoConstraints : NO]; for (UIView * self.contentView.subviews의 뷰) {[view setTranslatesAutoresizingMaskIntoConstraints : NO]; } 이전에는 다음과 같이 사용되었습니다. drive.google.com/file/d/0BxuYs8WHXCF7OWlvZGQwN3FlbzQ/… 그래도 작동했습니다.
rptwsthi

28

같은 방향과 유형으로 둘 이상의 구속 조건을 사용하지 않도록주의하십시오 .

예 : 후행 = 15에 대한 수직 구속 조건과 다른 구속 조건은> = 10입니다.

때때로 Xcode 는 눈치 채지 못하는 제약을 만듭니다 . 중복 제약 조건을 제거 해야 하며 로그 경고가 사라집니다.

여기에 이미지 설명을 입력하십시오

또한 로그에서 직접 특정 이유를 읽고 감지 할 수 있습니다 .

NSLayoutConstraint : 0xa338390 V : |-(15)-[UILabel : 0xa331260] (이름 : '|': UILabel : 0xa330270)>

이것은 UILabel 제약 조건에서 문제로 읽을 수 있으며 세로 제약 조건은 15pt입니다.

NSLayout 제약 : 0x859ab20 H :-( 13)-| [UIView : 0x85a8fb0] ...

이것은 수평 제약 등이 될 것입니다.


6

나는이 예외를 상당히 많이 발생 시켰으며, 그것들을 해결하는 가장 빠르고 쉬운 방법은 스토리 보드 소스 코드에서 검색 한 예외에서 고유 한 값을 찾는 것입니다. 이것은 문제를 일으키는 실제보기와 제약 조건을 찾는 데 도움이되었습니다 (나는 모든보기에서 의미있는 userLabels를 사용하므로 제약 조건과보기를 훨씬 쉽게 추적 할 수 있습니다) ...

따라서 위의 예외를 사용하여 스토리 보드를 xcode (또는 다른 편집기)에서 "소스 코드"로 열고 찾을 수있는 것을 찾으십시오 ...

<NSLayoutConstraint:0x72bf860 V:[UILabel:0x72bf7c0(17)]> 

.. 이것은 (17)의 값을 가진 UILabel에 대한 수직 (V) 제약처럼 보입니다.

내가 찾은 예외를 살펴보면

<NSLayoutConstraint:0x72c22b0 V:[UILabel:0x72bf7c0]-(NSSpace(8))-[UIButton:0x886efe0]>

UILabel (0x72bf7c0)은 세로 간격 (8)이있는 UIButton (0x886efe0)에 가깝습니다.

스토리 보드 소스 코드에서 특정 뷰를 찾거나 (처음에는 "17"이라는 텍스트를 검색하여) 최소한 몇 개의 후보를 찾기에 충분할 것입니다. 거기에서 실제로 스토리 보드에 어떤 뷰가 있는지 파악할 수있어 문제를 쉽게 식별 할 수 있습니다 (크기 제한과 충돌하는 "중복 된"고정 또는 고정).


"의미있는 userLabels를 사용합니다"-이 맥락에서 userLabels는 무엇입니까? (설정 방법)
Stripes

신원 관리자의 문서 섹션에는 스토리 보드 소스 코드에서 "userLabel"값으로 변환되는 "Label"필드가 있습니다.
C James

왼쪽의 "개요"패널에서 선택한보기를 클릭하여 설정할 수도 있습니다 (파인더에서 파일 이름 바꾸기와 유사)
C James

1
아마도 "동시 제약 조건을 동시에 만족시킬 수 없습니다"라는 두려운 문제를 해결하기 위해 내가 읽은 가장 좋은 것입니다. 고통. 이 시점에서 보여지는 객체 "제약 조건 <NSLayoutConstraint :를 깨서 복구를 시도 할 것"은 일반적으로 범인이며 C James가 말한 것처럼 고정 구속 조건과 충돌하는 높이 또는 너비 제약 조건 일 수 있습니다. 높이를 제거하기가 어렵다는 것을 알았지 만 구속 조건이 정확하기 때문에 다른 구속 조건에서 높이를 얻을 수있었습니다. 높이 제약 조건을 추가하면 자동 레이아웃이 혼란 스럽습니다. 그래서 이것이 제가 찾는 것입니다.
latenitecoder

6

이 오류의 원인이 무엇인지 파악하기가 어려웠습니다. 여기에 간단한 방법이 있습니다.

Xcode 6.1.1을 사용하고 있습니다.

  1. 모든 UILabels, UIImages 등을 선택하는 "Command + A"
  2. 편집-> 핀> (선택 ...)을 클릭하여 Superview
  3. 다시 편집기-> 자동 레이아웃 문제 해결-> 누락 된 구속 조건 추가 또는 제안 된 구속 조건으로 재설정을 클릭하십시오. 귀하의 경우에 따라 다릅니다.

5

.xib파일에서 자동 레이아웃을 사용하고 있었기 때문에이 문제가 발생했습니다 .

파일 관리자에서 첫 번째 탭. "자동 레이아웃 사용"을 선택 해제하면 문제가 해결되었습니다.

자동 레이아웃 파일 관리자


그래서 그것을하고 문제를 해결했지만 화면 상단에있는 'UIImageView'(내비게이션 바로 사용)가 화면 하단으로 이동했습니다. 왜 그런 일이 있었는지 아십니까?
dietbacon

1
자동 레이아웃 은 구속 조건 을 사용 하여 객체의 레이아웃을 제어합니다. 자동 레이아웃을 비활성화했기 때문에 이러한 제약 조건이 사라 졌으므로 위치 UIImageView가 변경되었습니다. 프로그래밍 방식으로 또는 Interface Builder를 통해이 위치를 다시 설정해야합니다.
Stéphane Bruckert

5

여기 내 경험과 솔루션이 있습니다. 나는 코드를 만지지 않았다

  1. 보기 선택 (UILabel, UIImage 등)
  2. 편집자> 핀> (선택 ...)을 Superview로
  3. 편집기> 자동 레이아웃 문제 해결> 누락 된 구속 조건 추가

4

이 코드를 신속하게 사용하십시오.

view.translatesAutoresizingMaskIntoConstraints = false

1
이것은 objective-c-tagged 질문에 대한 신속한 답변입니다.
Tobi Nary

2
@SmokeDispenser 어쨌든 이것이 빠른 코드라고 언급했습니다. 그리고 그것은 나를 위해 일했습니다. 신속 / 목적 그것은 일반적인 코코아 터치 SDK입니다.
Arun Kumar P

2

각 검색어의 SO 질문과 답변을 따랐습니다. 그러나 그들은 모두 특정 것과 관련이 있습니다.

기본적으로 형식을 작성하기 전에 (단순한 형식 일 수 있음) 경고를 줄 것입니다.

iOS 8.0부터 기본적으로보기는 크기 클래스입니다. 크기 클래스를 비활성화하더라도 자동 레이아웃 제약 조건이 여전히 포함됩니다.

따라서 VFL을 사용하여 코드를 통해 제한을 설정하려는 경우. 그런 다음 아래 줄 하나를 처리해야합니다.

// Remove constraints if any.
[self.view removeConstraints:self.view.constraints];

SO에서 많이 검색했지만 해결책은 Apple 샘플 코드에 있습니다. 있습니다.

따라서 새 구속 조건을 추가하기 전에 기본 구속 조건을 제거해야합니다.


1

나 에게이 문제의 주된 이유 AutoLayoutXib편집기 에서 선택을 취소하는 것을 잊었 기 때문입니다 . 사실, 나는 XIB코드에서 많은 조정을했습니다 .


1
 for(UIView *view in [self.view subviews]) {
    [view setTranslatesAutoresizingMaskIntoConstraints:NO];
}

이를 통해 문제를 일으키는 견해를 파악할 수있었습니다.


1

위의 답변 중 어느 것도 내 상황에서 도움이되지 않습니다. XCode 10.1을 실행 중이며 시뮬레이터에서 "iPad (5 세대)"용 앱을 테스트하고 있습니다. 시뮬레이터는 iOS 12.1을 실행 중입니다.

내 스토리 보드에는 두 개의 UITextField 하위 뷰가있는 간단한 루트보기가 있습니다. 스토리 보드에는 제약 조건이 전혀 없습니다. 그리고 앱이나 스토리 보드에 UIButtonBarView 객체가 없습니다.

앱이 시작되고 루트 뷰를 배치 할 때 메시지가 인쇄되지 않습니다. 시뮬레이션 된 장치가 회전 할 때는 없습니다.

그러나 시뮬레이터에서 텍스트 필드 중 하나를 클릭하는 순간 키보드 확장은 화면 하단에서 발생하지만 전체 키보드는 아니지만 시뮬레이터에는 표시되지 않습니다. 그러나 터미널에는 다음이 인쇄됩니다.

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. 
(Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints) 
(
"<NSAutoresizingMaskLayoutConstraint:0x6000034e7700 h=--& v=--& UIKeyboardAssistantBar:0x7f9c7d714af0.height == 0   (active)>",
"<NSLayoutConstraint:0x6000034aba20 V:|-(0)-[_UIUCBKBSelectionBackground:0x7f9c7d51ec70]   (active, names: '|':_UIButtonBarButton:0x7f9c7d51de40 )>",
"<NSLayoutConstraint:0x6000034aba70 _UIUCBKBSelectionBackground:0x7f9c7d51ec70.bottom == _UIButtonBarButton:0x7f9c7d51de40.bottom   (active)>",
"<NSLayoutConstraint:0x6000034fb3e0 V:|-(0)-[_UIButtonBarStackView:0x7f9c7d715880]   (active, names: '|':UIKeyboardAssistantBar:0x7f9c7d714af0 )>",
"<NSLayoutConstraint:0x6000034fb750 V:[_UIButtonBarStackView:0x7f9c7d715880]-(0)-|   (active, names: '|':UIKeyboardAssistantBar:0x7f9c7d714af0 )>",
"<NSLayoutConstraint:0x6000034abc00 'UIButtonBar.maximumAlignmentSize' _UIButtonBarButton:0x7f9c7d51de40.height == UILayoutGuide:0x600002ef4e00'UIViewLayoutMarginsGuide'.height   (active)>",
"<NSLayoutConstraint:0x6000034d7cf0 'UIView-bottomMargin-guide-constraint' V:[UILayoutGuide:0x600002ef4e00'UIViewLayoutMarginsGuide']-(9)-|   (active, names: '|':_UIButtonBarStackView:0x7f9c7d715880 )>",
"<NSLayoutConstraint:0x6000034d7c50 'UIView-topMargin-guide-constraint' V:|-(10)-[UILayoutGuide:0x600002ef4e00'UIViewLayoutMarginsGuide']   (active, names: '|':_UIButtonBarStackView:0x7f9c7d715880 )>"
)

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x6000034aba70 _UIUCBKBSelectionBackground:0x7f9c7d51ec70.bottom == _UIButtonBarButton:0x7f9c7d51de40.bottom   (active)>

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

분명히이 모든 것이 내 응용 프로그램과 관련이 없으며 Apple이 자체 키보드보기를 만드는 방법과 관련이 있으며 내 작은 확장 프로그램과 결합 된 것으로 선언 된 경우에도 마찬가지입니다.

그래서 문제는 남아 있습니다. 앱 개발자로서 내가 책임을지는 일이 있습니까 (가정에 참석할 가치가있는 것으로 추정됩니다) 또는 Apple 자체의 문제 / 버그입니까?

FWIW에서이 제약 문제 메시지는 iPad Pro 12.9 형 (3 세대)과 같은 최신 iPad 모델을 시뮬레이션 할 때 발생하지 않습니다. 그러나 메시지는 iPad Pro 9.7 인치 "를 시뮬레이션 할 때 표시됩니다. 모두 iOS 12.1을 실행한다고 주장합니다.


1

이 같은 오류가 발생하지만 첫 번째 텍스트 필드를 터치 한 다음 다음 텍스트 필드를 터치하면 특정보기에서만 발생합니다.

iOS 13.4 용 SwiftUI로 작성 중입니다.

 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:0x2809b6760 'assistantHeight' TUISystemInputAssistantView:0x105710da0.height == 44   (active)>",
        "<NSLayoutConstraint:0x2809ccff0 'assistantView.bottom' TUISystemInputAssistantView:0x105710da0.bottom == _UIKBCompatInputView:0x10525ae10.top   (active)>",
        "<NSLayoutConstraint:0x2809cccd0 'assistantView.top' V:|-(0)-[TUISystemInputAssistantView:0x105710da0]   (active, names: '|':UIInputSetHostView:0x105215010 )>",
        "<NSLayoutConstraint:0x2809ca300 'inputView.top' V:|-(0)-[_UIKBCompatInputView:0x10525ae10]   (active, names: '|':UIInputSetHostView:0x105215010 )>"
    )

    Will attempt to recover by breaking constraint 
    <NSLayoutConstraint:0x2809ccff0 'assistantView.bottom' TUISystemInputAssistantView:0x105710da0.bottom == _UIKBCompatInputView:0x10525ae10.top   (active)>

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

0

또한 xib의 viewCircle에 대해 로그에서 제약 조건을 위반하는 것과 동일한 문제가 발생했습니다. 나는 위에 나열된 모든 것을 거의 시도했지만 아무것도 효과가 없었습니다. 그런 다음 로그에서 깨지는 높이 제약 조건의 우선 순위를 변경하려고했습니다 (xib에 제약 조건에 대한 식별자를 추가하여 확인) 여기에 이미지 설명을 입력하십시오.


-1

조심해야 할 한 가지는 (적어도 이것이 나를 넘어 뜨렸다) 잘못된보기에서 제약 조건을 제거했다는 것입니다. 내가 제거하려고 한 제약 조건은 내 견해의 하위 제약 조건이 아니기 때문에 내가 할 때

myView.removeConstraint(theConstraint)

전화해야했기 때문에 실제로 아무것도 제거하지 않았습니다.

myView.superView.removeConstraint(theConstraint)

제약이 기술적으로 형제의 제약이기 때문에.


-4

스위프트 4

viewDidLoad 에이 줄을 추가하고 나에게 잘 작동합니다.

view.removeConstraints(view.constraints)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.