[ios] UIScrollView 스크롤 가능 컨텐츠 크기 모호성

동료 개발자, Interface Builder (Xcode 5 / iOS 7)의 AutoLayout에 문제가 있습니다. 매우 기본적이고 중요하므로 모든 사람들이 이것이 어떻게 작동하는지 알아야한다고 생각합니다. 이것이 Xcode의 버그 인 경우 중요한 버그입니다!

따라서 이와 같은 뷰 계층 구조가있을 때마다 문제가 발생합니다.

>UIViewController
>> UIView
>>>UIScrollView
>>>>UILabel (or any other comparable UIKit Element)

UIScrollView는 모든면에서 50 픽셀 (예 : 문제 없음)과 같은 견고한 제약 조건이 있습니다. 그런 다음 UILabel에 Top Space 제약 조건을 추가합니다 (문제 없음) (심지어 레이블의 높이 / 너비를 고정하고 아무것도 변경할 수는 없지만 레이블의 고유 크기로 인해 불필요해야합니다)

UILabel에 후행 제한 조건을 추가하면 문제점이 시작됩니다.

예 : 후행 공간 : Superview 같음 : 25

이제 두 가지 경고가 발생하며 이유를 이해하지 못합니다.

A) 스크롤 가능한 컨텐츠 크기 모호성 (스크롤보기에는 스크롤 가능한 컨텐츠 높이 / 너비가 모호함)

B) 잘못된 뷰 (라벨 예상 : x = -67 실제 : x = 207

나는 당신이 다운로드 할 수있는 갓 새로운 프로젝트 에서이 최소한의 예를했고 스크린 샷을 첨부했습니다. 보다시피 Interface Builder는 Label이 UIScrollView의 경계 (주황색 점선 사각형) 밖에있을 것으로 예상합니다. 문제 해결 도구를 사용하여 레이블의 프레임을 업데이트하면 바로 프레임이 이동합니다.

참고 : UIScrollView를 UIView로 바꾸면 예상대로 동작합니다 (레이블의 프레임이 정확하고 제약 조건에 따름). 따라서 UIScrollView에 문제가 있거나 중요한 것이 빠져 있습니다.

IB가 제안한대로 Label의 프레임을 업데이트하지 않고 앱을 실행하면 정확히 위치해야하며 UIScrollView는 스크롤 가능합니다. 프레임을 업데이트하면 Label이 보이지 않고 UIScrollView가 스크롤되지 않습니다.

오비완 케노비 도와주세요! 왜 모호한 레이아웃입니까? 왜 위치가 잘못 되었나요?

https://github.com/Wirsing84/AutoLayoutProblem : 여기에서 샘플 프로젝트를 다운로드하고 진행 상황을 알아낼 수 있는지 시도
하십시오.

인터페이스 빌더의 문제점 설명



답변

그래서 나는 이런 식으로 정렬했습니다.

  1. UIScrollView add a 안에 UIView(우리는 그것을 호출 할 수 있습니다 contentView);

  2. 이러한면에서 contentView, 세트 상하 0으로 오른쪽 여백을 왼쪽 (로부터 과정 scrollView은 IS한다 superView); 또한 중심을 수평 및 수직으로 정렬하십시오 .

완료되었습니다 .

이제 당신은 그 모든 귀하의 의견을 추가 할 수 있습니다 contentView, 그리고 contentSize의는 scrollView자동으로 따라 조정됩니다 contentView.

최신 정보:

일부 특수 사례는 아래 댓글 에 @Sergio 가 게시 한이 비디오 로 덮여 있습니다.


답변

이 오류는 추적하는 데 시간이 걸렸습니다. 처음에는 ScrollView의 크기를 고정하려고했지만 오류 메시지에 “콘텐츠 크기”라고 명확하게 표시되어 있습니다. ScrollView 상단에서 고정한 모든 항목도 하단에 고정되어 있는지 확인했습니다. 그렇게하면 ScrollView는 모든 객체 및 제약 조건의 높이를 찾아 내용 높이를 계산할 수 있습니다. 이것은 모호한 내용 높이를 해결하고 너비는 매우 비슷합니다. 처음에는 X 대부분의 ScrollView를 중심으로했지만 객체를 ScrollView의 측면에 고정해야했습니다. iPhone6의 화면이 더 넓을 수 있기 때문에 이것을 좋아하지 않지만 ‘모호한 내용 너비’오류를 제거합니다.


답변

Xcode 11 이상

사용하는 가장 간단한 방법 autolayout:

  1. 슈퍼 뷰 (또는 원하는 크기)에 추가 UIScrollView및 고정0,0,0,0
  2. 추가 UIView,있는 ScrollView에 핀 0,0,0,04 개 측면과 중앙 horizontallyvertically.
  3. 크기 관리자에서 변경 bottom하고 align center Y(수평 스크롤 변화에 대한 우선 순위 (250) trailingalign center X)
  4. 필요한 모든보기를이보기에 추가하십시오. 가장 낮은 뷰에서 하단 구속 조건을 설정하는 것을 잊지 마십시오 .
  5. 를 선택하고 UIScrollView크기 관리자를 선택한 다음 선택을 취소하십시오 Content Layout Guides.

답변

내 스스로 대답하는 질문에 대한 답변 UIScrollView + 중앙보기 + 모호한 스크롤 가능한 콘텐츠 크기 + 많은 iPhone 크기 .

그러나 그것은 당신의 경우도 완전히 포함합니다!

가장 간단한 경우의 초기 상태는 다음과 같습니다.

  1. 모든 가장자리에 0 제약 조건이있는 scrollView
  2. 버튼 수평 및 수직을 중심 으로 고정 너비 및 높이 제한
  3. 그리고 물론 성가신 경고 Has ambiguous scrollable content widthHas ambiguous scrollable content height.

1

우리가해야 할 일은 :

  • 뷰의 후미 및 / 또는 하단 공간에 대해 “0” 과 같은 2 개의 추가 구속 조건을 추가하십시오 (아래 스크린 샷의 예 참조).

중요 : 후행 및 / 또는 하단 제약 조건 을 추가해야합니다 . “최고와 최고”가 아닙니다-작동하지 않습니다!

2

예제 프로젝트 에서이 문제를 해결하는 방법을 보여주는 확인할 수 있습니다 .

추신

논리에 따르면-이 동작은 “충돌 제약”을 유발해야합니다. 하지만!

왜 작동하는지와 Xcode가 어떤 제약 조건이 더 우선 순위를 감지하는지 알 수 없습니다 (이 제약 조건에 우선 순위를 설정하지 않았기 때문에). 누군가 설명하면 왜 감사 할 것입니까, 왜 아래 의견에서 작동합니까?


답변

Xcode 11+, 스위프트 5

모든 답변이 더 이상 작동하지 않는 이유가 궁금한 경우 컨텐츠보기 (스크롤보기에 넣은 내용)를 스크롤보기의 컨텐츠 레이아웃 안내서 및 프레임 레이아웃 안내서가 아닌 컨텐츠 레이아웃으로 고정했는지 확인하십시오.

콘텐츠 뷰 가장자리 (리딩, 트레일 링, 상단, 하단)는 이미지의 리딩처럼 고정되지 않아야합니다.-프레임 레이아웃 안내서

이건 아니야

그러나 이것처럼-콘텐츠 레이아웃 안내서.

드롭 다운에서 컨텐츠 레이아웃 안내서를 선택하십시오.

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

그러면 대부분의 답변이 효과가 있습니다.

가장 간단한 방법은 다음과 같습니다.

  1. 루트보기에 스크롤보기를 넣으십시오.
  2. 스크롤보기의 모든 측면을 수퍼 뷰에 고정
  3. 다른 UIView를 가져 와서 (콘텐츠보기라고 부릅니다) 스크롤보기 안에 넣으십시오.
  4. 컨텐츠보기의 모든면을 고정하여보기의 컨텐츠 레이아웃 안내서를 스크롤하십시오.
  5. 컨텐츠 뷰의 너비를 스크롤 뷰의 프레임 레이아웃 안내서와 동일하게 고정
  6. 원하는 방식으로 컨텐츠 뷰 높이를 수정하십시오 (아래 예에서는 일정한 높이 제한을 사용했습니다)

가장 간단한 구현의 전체 구조는 다음과 같습니다.

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


답변

아래에 설명 된대로 UIView하위보기 로 작성해야 UIScrollView합니다.

  • UIViewController
  • UIView ‘메인 뷰’
    • UIScrollView
      • UIView ‘컨테이너 뷰’
        • [콘텐츠]

두 번째 단계는 UIScrollView제약 조건 을 만드는 것 입니다. 나는 superView에 대한 상단, 하단, 선행 및 후행 제약 조건 으로이 작업을 수행했습니다.

다음으로 컨테이너의 제약 조건을 추가했으며 UIScrollView여기에서 문제가 시작됩니다. 동일한 제약 조건 (위쪽, 아래쪽, 앞쪽 및 뒤쪽)을 넣으면 스토리 보드에 경고 메시지가 표시됩니다.

“모호한 스크롤 가능 컨텐츠 너비가 있습니다”및 “모호한 스크롤 가능 컨텐츠 높이가 있습니다”

위와 같은 제약 조건을 계속하고, 단지 제약 조건 추가 Equal HeightEqual Width사용자에 컨테이너보기를 받는 관련 홈페이지보기하지 않는 당신 UIScrollView. 즉, 컨테이너 뷰의 제약 조건은 UIScrollView의 슈퍼 뷰 와 연결되어 있습니다.

그 후에 스토리 보드에 경고가 표시되지 않고 하위 뷰에 대한 제약 조건을 계속 추가 할 수 있습니다.


답변

나는 같은 문제가 있었다. 이 확인란의 선택을 취소하십시오. 코드에서 컨텐츠 크기를 설정하고 있기 때문에.
여기에 이미지 설명을 입력하십시오