UIScrollView는 자동 레이아웃 제약 조건을 사용하지 않습니다.


78

스크롤 뷰와 그 뒤에 이미지 뷰가 있고 펜촉으로 채 웁니다. 자동 레이아웃을 사용하고 있습니다. 나는 두 뷰 모두에서 슈퍼 뷰를위한 하단 공간과 슈퍼 뷰를위한 상단 공간이 있습니다. 이미지보기는 내가 원하는 작업을 정확히 수행합니다. 아이폰 5의 경우 내가 원하는 곳입니다. 그리고 다른 아이폰의 경우 화면 하단에 유지되므로 크기가 올바르게 조정됩니다. 스크롤보기는 아이폰 5에서 오른쪽으로 보이지만 다른 휴대폰에서는 크기가 조정되지 않으므로 앱보기 아래로 스크롤됩니다. 로그에 다음 메시지가 표시됩니다.

 2012-11-21 10:42:38.576 LCHApp[12604:907] 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:0x1d8ea080 UIScrollView:0x1d8413b0.bottom == UIImageView:0x1d892110.bottom>",
"<NSAutoresizingMaskLayoutConstraint:0x1d8cca10 h=-&- v=-&- ScheduleViewNib:0x1d853630.height == UIScrollView:0x1d8413b0.height - 386>",
"<NSLayoutConstraint:0x1d8e5340 V:[UIImageView:0x1d892110]-(64)-|   (Names: '|':ScheduleView:0x1d8efc30 )>",
"<NSAutoresizingMaskLayoutConstraint:0x1d8cf520 h=--& v=--& V:[ScheduleView:0x1d8efc30(480)]>",
"<NSLayoutConstraint:0x1d8eaed0 V:|-(45)-[UIScrollView:0x1d8413b0]   (Names: '|':ScheduleView:0x1d8efc30 )>"


 Will attempt to recover by breaking constraint 
 <NSLayoutConstraint:0x1d8ea080 UIScrollView:0x1d8413b0.bottom ==      UIImageView:0x1d892110.bottom>

나는 이미 시도했다

[self setTranslatesAutoresizingMaskIntoConstraints:YES];

[self.myScrollView setTranslatesAutoresizingMaskIntoConstraints:YES];

내가 볼 수 있듯이 이것은 뷰에서 모든 제약을 제거합니다. 그리고 내가 원하는 것이 아닙니다.


2
Apple의 기술 노트 TN2154 : UIScrollView 및 Autolayout 은이 문제를 매우 자세히 다룹니다.
smileyborg 2014 년

답변:


177

UIScrollView와 자동 레이아웃의 관계는 자동 레이아웃의 다른 측면과 다릅니다. 기본적으로 간단한 자동 레이아웃이 작동하도록 허용되면 아무것도 스크롤되지 않습니다. 예를 들어, 스크롤 뷰의 하위 뷰가 스크롤 뷰의 상단에서 10 개 지점에 대한 제약 조건에 의해 정상적인 방식으로 고정 된 경우 해당 위치에 절대적으로 고정됩니다. 스크롤 뷰가 어떻게 스크롤 되더라도 절대 움직이지 않습니다.

이 문제를 해결하기 위해 자동 레이아웃을 사용하는 UIScrollView는 완전히 새로운 방식으로 작동합니다. 따라서 "자동 레이아웃을 사용하고 있습니다"라고 말할 때 이전과 매우 다르게 작동 할 수 있도록 준비해야합니다. 와 함께 단일 스크롤보기 하위보기 translatesAutoresizingMaskIntoConstraints = YES및 명시 적 콘텐츠 크기를 사용해야합니다. 그렇지 않으면 모든 항목이 있어야 translatesAutoresizingMaskIntoConstraints = NO하며 콘텐츠 크기는 하위보기의 제약 조건에 따라 암시 적으로 추론됩니다.

이것은 https://developer.apple.com/library/content/releasenotes/General/RN-iOSSDK-6_0/index.html에 매우 잘 설명되어 있습니다.


5
이 질문에 관심이있을 수 있습니다 : stackoverflow.com/questions/14307037/… (적어도 현상금 때문에!) 나는 이것이 scrollview / autolayout 문제라고 생각하지만 내 마음에는 버그처럼 읽습니다-이 경우 스크롤 뷰는 테이블 뷰이며 회전시 콘텐츠 크기가 제대로 조정되지 않습니다.
jrturton 2013 년

3
@matt이 동작을 본 적이 있는지 모르겠지만 레이아웃 제약 조건 만 사용하여 스크롤 뷰의 콘텐츠 크기를 정의하는 경우 버그가 있습니다. 콘텐츠 오프셋을 (0, 0)에서 다른 탭으로 이동합니다. 또는 모달 뷰 컨트롤러로 돌아 오면 스크롤 뷰의 하위 뷰가 모두 콘텐츠 오프셋만큼 이동되어 돌아갈 수 없습니다. 이것을 확인하고 내 레이더를 속일 수 있다면 감사하겠습니다. openradar.appspot.com/radar?id=2932404
edelaney05

3
@ edelaney05 버그를 확인할 수 있다고 생각하지만 Apple에 제출하기 전에 데모 프로젝트를 만들어야합니다. openradar.appspot.com/radar?id=2932404의 복사 및 붙여 넣기 코드가 컴파일되지 않기 때문에 (이름을 constraintsWithVisualFormat:options:metrics:views:잘못 입력했습니다 ). 항상 실제로 작동하는 실제 코드를 사용하십시오. 게다가 실제 프로젝트에서는 실제 이미지를 포함 할 수 있습니다. Apple 사람들에게는 상상력도 시간도 없습니다. 당신은 그들을 위해 모든 일을 미리해야합니다.
matt

3
@ edelaney05 "어깨 consectetur pancetta"???? :) 그래 좋아. 나는 실제로 큰 그림 크기의 이미지 뷰로 코드를 기반으로 훨씬 더 밀접하게 작업했습니다. 스크롤 뷰에 빨간색 배경색을 지정하고 로깅을 사용하면 스크롤 뷰가 모든 것이 옳다고 생각했지만 (콘텐츠 크기, 콘텐츠 오프셋) 잘못된 위치에 이미지 뷰를 그립니다. 뷰를 떠났을 때부터의 콘텐츠 오프셋입니다.
매트

2
@matt baconipsum.com ! :-) 대박. 내가 본 것과 똑같은 행동. 스크롤 뷰는 모든 것을 "일반"으로보고했지만 오프셋 요인으로 인해 도면이 잘못되었습니다. 내가 미쳤다는 것을 확인 해주셔서 감사합니다 (하지만이 버그에 대해서만!).
edelaney05

162

자동 레이아웃을 사용할 때 매우 중요합니다. 마지막 하위보기의 오른쪽 및 / 또는 아래쪽을 스크롤보기의 오른쪽 및 / 또는 아래쪽에 고정해야합니다. 이것이 스크롤 뷰가 콘텐츠 크기를 아는 방법입니다. 예를 들면 :

[scrollView addConstraint:[NSLayoutConstraint constraintWithItem:lastSubView
                                                 attribute:NSLayoutAttributeRight
                                                 relatedBy:NSLayoutRelationEqual
                                                    toItem:scrollView
                                                 attribute:NSLayoutAttributeRight
                                                multiplier:1.0
                                                  constant:0]];

완벽한 예를 제공 한이 사이트 에 감사드립니다 .

이 때문에 시간을 잃었고 다른 사람들에게 내 고통을 아끼고 싶습니다.


4
이것은 완벽 해요. 링크에있는 것과 같은 간단한 예를 찾고 있습니다. 감사합니다!!!
pgpb.padilla 2013-04-20

Matt의 답변은 좋지만이 답변은 제가 사용하던 문제를 해결하는 데 훨씬 더 실질적으로 도움이됩니다.
dmur

22
@dmur "맷의 대답은 좋지만이 질문은 훨씬 더 실질적으로 도움이됩니다."-야, 이건 내 대답 이기도하다 . 그는 내 책에서 코드 / 설명을 얻었습니다! 두 번 도울 수있어서 다행입니다. :)))
매트

scrollView 및 하위보기를 배치하는 방법에 따라 항목을 왼쪽 또는 상단에 고정해야 할 수 있습니다. 제 경우에는 모든 것을 왼쪽에 고정해야했습니다.
ArtSabintsev

Interface Builder를 통해 제약 조건을 추가 할 수도 있습니다. 좋은 대답입니다!
Moisés Olmedo

0

UIScrollviews가 제약 조건과 잘 작동하도록하려면 여기에 대답 한이 접근 방식을 사용합니다 . 그 대답에서 나는 장치 회전과 함께 작동 하는 수직 스크롤 스크롤 뷰 를 얻는 방법을 다룹니다. 가로로 스크롤하는 스크롤 뷰로 작업하도록 접근 방식을 조정할 수도 있습니다. 양방향으로 스크롤되는 scrollview의 경우 크기 일치 너비 제약 트릭을 추가 하지 마십시오 . 그러나 다른 모든 것을 동일하게하십시오.


-3

몇 가지.

  1. 자동 레이아웃이 켜져 있는지 확인합니다 ( "파일 검사기 탭"의 IB).
  2. 경계, 프레임 등을 포함하는 변경 사항이 없는지 확인하십시오.이 모든 작업은 이제 자동 제약 조건에 의해 수행됩니다.
  3. AutoResizingMask에서 멀리 떨어져 있는지 확인하십시오. 이것은 새로운 설정과 경쟁합니다. 이 작업이 올바르게 수행되면 이제 버튼을 레이아웃 할 수 있으며 훌륭하게 작동합니다. 방법은 다음과 같습니다.

이 오류는 펜촉 또는 해당 펜촉 내의 컨트롤이 자동 레이아웃을 사용하지 않음을 나타냅니다.


1
그러나 UIScrollView는 특별하며 귀하의 답변은 그 사실을 고려하지 않습니다.
matt
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.