Programing

제약 조건을 동시에 충족 할 수 없습니다. 제약 조건이 없습니다.

lottogame 2020. 12. 29. 06:39
반응형

제약 조건을 동시에 충족 할 수 없습니다. 제약 조건이 없습니다.


모든 단일 사용자 제약을 통과하고 제거했지만 장치를 회전 한 후에 다음 오류가 계속 발생합니다 . 나는 왜 그런지 전혀 모른다. 누구에게 아이디어가 있습니까?

2013-01-14 21:30:31.363 myApp[35869:c07] 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:0x84543d0 h=--& v=--& V:[UIView:0xa330270(768)]>",
    "<NSLayoutConstraint:0xa338350 V:[UIView:0xa331260]-(-1)-|   (Names: '|':UIView:0xa330270 )>",
    "<NSLayoutConstraint:0xa338390 V:|-(841)-[UIView:0xa331260]   (Names: '|':UIView:0xa330270 )>"
)

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0xa338350 V:[UIView:0xa331260]-(-1)-|   (Names: '|':UIView:0xa330270 )>

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.

하나씩 살펴 보겠습니다.

"<NSAutoresizingMaskLayoutConstraint:0x84543d0 h=--& v=--& V:[UIView:0xa330270(768)]>"

이것은 뷰 0xa330270 ( A )이 768 포인트 높이 여야한다는 뜻입니다.

"<NSLayoutConstraint:0xa338350 V:[UIView:0xa331260]-(-1)-| (Names: '|':UIView:0xa330270 )>"

이것은 view 0xa331260 ( B )의 하단 가장자리가 superview A 의 하단에서 -1의 간격이어야 함을 의미합니다 .

"<NSLayoutConstraint:0xa338390 V:|-(841)-[UIView:0xa331260] (Names: '|':UIView:0xa330270 )>"

이것은 B 의 상단 가장자리가 수퍼 뷰 A 의 상단에서 841 포인트의 간격이어야 함을 의미합니다 .

이 세 가지가 모두 사실 일 수는 없습니다. A 는 768 포인트 높이가 될 수 없으며 상단 가장자리가 841 포인트 삽입되고 하단에서 -1 포인트 삽입 된 하위 뷰를 포함합니다. 이러한 각 제약을 어디에서 정의 했습니까?

달성하려는 레이아웃을 말하지 않았지만 수퍼 뷰에 자동 크기 조정 마스크가있어 장치를 회전 할 때 높이가 변경되는 것을 방지 할 수 있습니다. 내가 아는 한 자동 크기 조정 제약은 스토리 보드 나 xib가 모두 자동 레이아웃이거나 아니기 때문에 프로그래밍 방식으로 뷰를 추가 한 경우에만 나타납니다. 자동 레이아웃보기 (펜촉에서로드 된?)를 비 자동 레이아웃 펜촉의 다른보기에 추가하는 것과 같은 작업을 수행하지 않는 한?


이 완전한 솔루션에 대해 http://useYourLoaf.com감사드립니다 .

http://useyourloaf.com/blog/using-identifiers-to-debug-autolayout.html

제약과 관련된 문제를 디버깅 할 때 도움이되는 자동 레이아웃에 대한 WWDC 2015 세션에 묻힌 빠른 팁

자동 레이아웃을 사용했다면 Xcode가 잘못되었을 때 내보내는 로그에 익숙 할 것입니다. 예제를 만들기 위해 Stack View 샘플 코드를 수정 하고 각 이미지에 제약 조건을 추가하여 240의 고정 너비를 제공했습니다 (우리가 보게 될 좋은 생각은 아닙니다).

여기에 이미지 설명 입력

이는 iPad와 같은 일반 너비보기에서 작동하지만 iPhone과 같은 컴팩트 너비보기에는 너무 넓습니다. 런타임에 콘솔 로그를 읽는 것은 재미가 없습니다. 상용구 텍스트를 건너 뛰면 문제가있는 제약 조건 목록이 표시됩니다.

"<NSLayoutConstraint:0x7fc1ab520360 H:[UIImageView:0x7fc1ab532650(240)]>",
"<NSLayoutConstraint:0x7fc1ab536ef0 H:[UIImageView:0x7fc1ab537380(240)]>",
"<NSLayoutConstraint:0x7fc1ab545cc0 UIView:0x7fc1ab53d870.trailingMargin == UIStackView:0x7fc1ab53dae0.trailing>",
"<NSLayoutConstraint:0x7fc1ab545d10 UIStackView:0x7fc1ab53dae0.leading == UIView:0x7fc1ab53d870.leadingMargin>",
"<NSLayoutConstraint:0x7fc1ab54e240 'UISV-alignment' UIStackView:0x7fc1ab53dc70.centerX == UIStackView:0x7fc1ab531a10.centerX>",
"<NSLayoutConstraint:0x7fc1ab5167c0 'UISV-canvas-connection' UIStackView:0x7fc1ab531a10.leading == UIImageView:0x7fc1ab532650.leading>",
"<NSLayoutConstraint:0x7fc1ab54ad80 'UISV-canvas-connection' H:[UIImageView:0x7fc1ab537380]-(0)-|   (Names: '|':UIStackView:0x7fc1ab531a10 )>",
"<NSLayoutConstraint:0x7fc1ab5397d0 'UISV-canvas-connection' UIStackView:0x7fc1ab53dae0.leading == _UILayoutSpacer:0x7fc1ab54c3c0'UISV-alignment-spanner'.leading>",
"<NSLayoutConstraint:0x7fc1ab54a4a0 'UISV-canvas-connection' UIStackView:0x7fc1ab53dae0.centerX == UIStackView:0x7fc1ab53dc70.centerX>",
"<NSLayoutConstraint:0x7fc1ab54b110 'UISV-spacing' H:[UIImageView:0x7fc1ab532650]-(16)-[UIImageView:0x7fc1ab537380]>",
"<NSLayoutConstraint:0x7fc1ab548210 'UISV-spanning-boundary' _UILayoutSpacer:0x7fc1ab54c3c0'UISV-alignment-spanner'.leading <= UIStackView:0x7fc1ab531a10.leading>",
"<NSLayoutConstraint:0x7fc1ab551690 'UIView-Encapsulated-Layout-Width' H:[UIView:0x7fc1ab53d870(375)]>"

그런 다음 로그는 위의 제약 조건 중 중단하기로 결정한 것을 알려줍니다.

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x7fc1ab536ef0 H:[UIImageView:0x7fc1ab537380(240)]>

로그 출력은 자동 레이아웃 시각적 형식 언어를 사용하지만 시스템에서 생성 된 제약 조건에서 내 제약 조건을 선택하기가 어렵습니다. 이것은 특히 대부분의 제약 조건을 생성하도록 의도 된 스택 뷰의 경우입니다. 이 사소한 예제에서 방금 추가 한 고정 너비 제약 조건이 깨 졌음을 알고 있지만 로그에서보기가 어렵고보기가 복잡할수록보기가 어려워집니다.

제약 조건에 식별자 추가

각 제약 조건 ( NSLayoutConstraintiOS 7부터 식별자 속성이 있음)에 식별자를 추가하면 로그를 훨씬 쉽게 이해할 수 있습니다 . Interface Builder에서 제약 조건을 찾고 Attributes inspector에서 식별자를 추가하십시오 ($를 접두사 / 접미사로 사용하여 로그에서 눈에 띄게 만듭니다).

여기에 이미지 설명 입력

2015 년 8 월 18 일 업데이트 : 주석에서 지적했듯이 식별자는 Xcode 7로 시작하는 Interface Builder에서만 편집 할 수 있습니다. Xcode 6.4에서는 볼 수 없습니다.

코드에 제약 조건을 추가하는 경우 :

constraint.identifier = "$HeartImageFixedWidth$"

제약 조건 배열을 사용하는 시각적 형식 언어를 사용하는 경우 더 까다 롭습니다. 예를 들어, 하트 이미지보기에 대한 고정 너비 제약을 생성하기 위해 Swift 코드 조각을 고려하십시오.

let heartWidth = NSLayoutConstraint.constraintsWithVisualFormat("[heart(240)]", 
                 options:[], metrics:nil, views:viewsDictionary)

heartWidth는 [NSLayoutConstraint] 유형의 배열이기 때문에 식별자 설정은 조금 더 작업이 필요합니다.

for constraint in heartWidth {
  constraint.identifier = "$HeartImageFixedWidth$"
}
heartImage.addConstraints(heartWidth)

제약 조건에 대한 식별 설정을 사용하면 이제 로그 파일에서 훨씬 쉽게 찾을 수 있습니다 (처음 네 줄 참조).

"<NSLayoutConstraint:0x7f92a305aeb0 '$ContainerStackViewLeading$' UIStackView:0x7f92a3053220.leading == UIView:0x7f92a3052fb0.leadingMargin + 32>",
"<NSLayoutConstraint:0x7f92a305b340 '$ContainerStackViewTrailing$' UIView:0x7f92a3052fb0.trailingMargin == UIStackView:0x7f92a3053220.trailing + 32>",
"<NSLayoutConstraint:0x7f92a301cf20 '$HeartImageFixedWidth$' H:[UIImageView:0x7f92a3047ef0(240)]>",
"<NSLayoutConstraint:0x7f92a3009be0 '$StarImageFixedWidth$' H:[UIImageView:0x7f92a304d190(240)]>",
"<NSLayoutConstraint:0x7f92a3060cc0 'UISV-alignment' UIStackView:0x7f92a30533b0.centerX == UIStackView:0x7f92a30472b0.centerX>",
"<NSLayoutConstraint:0x7f92a301c590 'UISV-canvas-connection' UIStackView:0x7f92a30472b0.leading == UIImageView:0x7f92a3047ef0.leading>",
"<NSLayoutConstraint:0x7f92a305f680 'UISV-canvas-connection' H:[UIImageView:0x7f92a304d190]-(0)-|   (Names: '|':UIStackView:0x7f92a30472b0 )>",
"<NSLayoutConstraint:0x7f92a3064190 'UISV-canvas-connection' UIStackView:0x7f92a3053220.leading == _UILayoutSpacer:0x7f92a30608a0'UISV-alignment-spanner'.leading>",
"<NSLayoutConstraint:0x7f92a30415d0 'UISV-canvas-connection' UIStackView:0x7f92a3053220.centerX == UIStackView:0x7f92a30533b0.centerX>",
"<NSLayoutConstraint:0x7f92a305fa10 'UISV-spacing' H:[UIImageView:0x7f92a3047ef0]-(16)-[UIImageView:0x7f92a304d190]>",
"<NSLayoutConstraint:0x7f92a30508c0 'UISV-spanning-boundary' _UILayoutSpacer:0x7f92a30608a0'UISV-alignment-spanner'.leading <= UIStackView:0x7f92a30472b0.leading>",
"<NSLayoutConstraint:0x7f92a3063240 'UIView-Encapsulated-Layout-Width' H:[UIView:0x7f92a3052fb0(375)]>"

또한 시스템이 중단하기 위해 선택한 제약 조건이 훨씬 더 명확합니다.

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x7f92a3009be0 '$StarImageFixedWidth$' H:[UIImageView:0x7f92a304d190(240)]>

제약 조건에 식별자를 추가하는 것은 노력 없이는 아니지만 다음에 복잡한 레이아웃의 디버그 로그를 정렬해야 할 때 보상을받을 수 있습니다.

추가 읽기


I guess this is not a common error, but I solved it somewhat in a layman way. I was getting cryptic messages like the one above. To make sense of it, I created dummy view classes and attached it to the views in my storyboard. For example, if I had a UIView, I created a class called AddressView and attached it to this view in story board. Its a bit time consuming, but it worked for me. After that instead of object-ids, I got class names which helped me zero in on the views that were causing the issue very easily. My error message now read,

2013-07-02 04:16:20.434 Myproject [2908:c07] 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) 
(
    "<NSLayoutConstraint:0x9edeae0 V:|-(0)-[AddressView:0x143ee020]   (Names: '|':MainView:0x129eb6a0 )>",
    "<NSAutoresizingMaskLayoutConstraint:0x11e998c0 h=--& v=--& V:[MainView:0x129eb6a0(704)]>",
    "<NSLayoutConstraint:0x156720b0 V:[AddressView:0x143ee020]-(896)-|   (Names: '|':MainView:0x129eb6a0 )>"
)

Here you can see, the names of my views MainView and Address view are causing the issue.

To resolve it, I just moved my subview (in this case Address view) and repositioned it back. I think the issue began as I was using a mix of new Automatic Layour in Xcode 4.5 and old skills or manually positioning the views.

Anyways, not sure if it was more luck than diligence, but nevertheless this could be a different way of debugging. Maybe this helps someone!


Its worth knowing the basics, and understand what Apple/Xcode is trying to tell you through the logs

H = Horizontal constraint(for leading and Trailing)
V = Vertical constraint(top and bottom edge)
h = height
w = width

TopEdge    -> V:|-(points)-[VIEW:memoryAddress] 
BottomEdge -> V:[VIEW:memoryAddress]-(points)-|
Leading    -> H:|-(points)-[VIEW:memoryAddress] 
Trailing   -> H:[VIEW:memoryAddress] -(points)-|
height     -> h= --& v=--& V:[VIEW:memoryAddress((points)] 
width      -> VIEW:memoryAddress.width == points 
between    -> H:[VIEW 1]-(51)-[VIEW 2] 

Once you understand this, reading your specific error is pretty easy


YourConstraintView.translatesAutoresizingMaskIntoConstraints = NO;

Did it for me.


I've fixed this problem be deleting all translatesAutoresizingMaskIntoConstraints properties from xib file (Open xib as a source code).


One note. You get this error in logs if you are testing using a personal hotspot connection, and the hotspot status bar is at the top. It throws off the constraints.

Hope this helps someone.. was driving me nuts.


For me this error was spitted when I gave tableView.estimatedRowHeight = UITableViewAutomaticDimension

This should have been tableView.estimatedRowHeight = "Some hardcoded value"


I had this problem and took me 2 days to figure out the source of the problem....

If you open a storyboard programmatically in you code just make sure you do it like this:

UIStoryboard *story = [UIStoryboard storyboardWithName:@"MovieMaker" bundle:nil];
    UIViewController *vc = [story instantiateInitialViewController];
    //this causes layout to break [self presentViewController:vc animated:YES completion:nil];
    [self showViewController:vc sender:nil];

I was using the commented line (using presentViewController) and the orientation bug has happening throwing constraints conflicts that weren't my constraints... changing to showViewController all constraints conflicts were gone and orientation works...... (I don't really know why it works with show and not present... still thinking it's... ALIENS...)


This issue of the generated message "Unable to simultaneously satisfy contraints" in the debug console, is also experienced in XCode 9.4.
In my particular instance on the iPad simulator, the message would generate:
1) Only when placing the focus on a particular UITextField.
2) Even with all view contraints removed.
2) Even with all view contraints "Reset to Suggested Contraints".

However, when the software keyboard was toggled on to display, the message would not be generated. Therefore, how much time should I spend on this issue, that in my instance is only generated when the software keyboard is toggled off.

ReferenceURL : https://stackoverflow.com/questions/14327145/unable-to-simultaneously-satisfy-constraints-no-constraints-in-place

반응형