programing

UIScroll View 스크롤 가능 콘텐츠 크기 모호성

minimums 2023. 4. 13. 20:43
반응형

UIScroll View 스크롤 가능 콘텐츠 크기 모호성

Dev 여러분, Interface Builder의 AutoLayout(Xcode 5/iOS 7)에 문제가 있습니다.이것은 매우 기본적이고 중요하기 때문에 모든 사람들이 이것이 어떻게 작동하는지 알아야 한다고 생각한다.Xcode의 버그라면 매우 중요합니다!

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

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

UIScrollView에는 예를 들어 모든 측면에서 50px의 견고한 구속조건이 있습니다(문제 없음).그런 다음 UILabel에 Top Space 구속조건을 추가합니다(문제 없음). (라벨의 높이/폭을 핀으로 고정할 수도 있지만 라벨의 고유한 크기 때문에 필요하지 않습니다.)

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

예: Trailing Space to: Superview Equals: 25

다음 두 가지 경고가 발생하는데, 그 이유를 알 수 없습니다.

A) 스크롤 가능한 콘텐츠 크기 모호성(스크롤 뷰는 스크롤 가능한 콘텐츠 높이/폭이 모호함)

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

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

주의:UIScrollView를 UIView로 대체하면 예상대로 동작합니다(라벨 프레임이 올바르고 제약 조건에 따라 다름).그래서 UIScroll View에 문제가 있거나 중요한 것을 놓치고 있는 것 같습니다.

IB가 제안하는 라벨의 프레임을 업데이트하지 않고 앱을 실행하면 앱은 올바르게 배치되어 있으며 UIScroll View는 스크롤이 가능합니다.프레임을 업데이트하면 라벨이 보이지 않고 UIScrollView가 스크롤되지 않습니다.

오비완 케노비 도와줘!왜 레이아웃이 애매해?왜 잘못된 뷰일까요?

여기서 샘플 프로젝트를 다운로드하여 무슨 일이 일어나고 있는지 확인하실 수 있습니다.https://github.com/Wirsing84/AutoLayoutProblem

Interface Builder의 문제 예시

갱신필

오늘날 애플은 수년 전에 해결한 문제를 깨닫고(lol_face) 콘텐츠 레이아웃 가이드와 프레임 레이아웃 가이드를 제공하고 있습니다.UIScrollView라음

  1. 아래 답변과 동일합니다.

  2. ★★★★★★★★★★★★★★에 대해서contentView위, 아래, 왼쪽 오른쪽 여백을 0으로 설정하여 스크롤 뷰의 콘텐츠 레이아웃 가이드에 고정합니다.

  3. , 그럼 이번에는 '어울리다'를 세팅해 주세요.contentView의 높이는 프레임 레이아웃 가이드의 높이와 동일합니다.폭에 대해서도 동일한 작업을 수행합니다.

  4. 마지막으로, 동일한 높이 구속조건의 우선순위를 250으로 설정합니다(보기를 수직으로 스크롤해야 하는 경우 가로로 스크롤해야 하는 폭).

끝났습니다.

그 안에 를 모두 수 .contentView및 , 。contentSizescrollView 크기가 자동으로 됩니다.contentView.

의 맨 마세요.contentViewcontentView의 마진

원본 [사용하지 않음]

So I just sorted out in this way:
  1. <고객명>UIScrollView 추가하다UIView는 그것을 (라고 수 )contentView

  2. 이점 this this에서는요.contentView, 위, 아래, 왼쪽오른쪽 여백을 0으로 설정합니다(물론,scrollView은 '무조건'입니다.superView); 또한 중심을 수평과 수직으로 맞춥니다;

X코드 11 이상

으로는 「 」를 사용합니다.autolayout:

  1. UIScrollView으로 고정시키다0,0,0,0
  2. 「 」의 합니다.UIViewScrollView를하고 ScrollView를 핀으로 합니다.0,0,0,0을 향하다horizontally ★★★★★★★★★★★★★★★★★」vertically.
  3. 하십시오.bottom ★★★★★★★★★★★★★★★★★」align center Y 250 변경 priority의 )trailing ★★★★★★★★★★★★★★★★★」align center X)
  4. 필요한 모든 뷰를 해당 컨테이너(UIView)에 추가합니다.가장 낮은 뷰에 하단 구속조건을 설정하는 것을 잊지 마십시오.
  5. 를 선택합니다.UIScrollView하고, 「사이즈 인스펙터」의 선택을 해제합니다Content Layout Guides.

Xcode 11+, Swift 5

모든 답변이 더 이상 작동하지 않는 경우 스크롤 보기의 내용 레이아웃 가이드에 내용 보기(스크롤 보기 안에 넣은 내용)를 고정하고 프레임 레이아웃 가이드에 고정하지 마십시오.

컨텐츠 표시 가장자리(선행, 후행, 상행, 하행)를 이미지의 선행처럼 고정하지 마십시오 - 프레임 레이아웃 가이드

이것처럼은 아니다.

'콘텐츠 레이아웃 가이드'로 이동합니다.

드롭다운에서 콘텐츠 레이아웃 가이드 선택

여기에 이미지 설명 입력

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

현재 가장 간단한 접근 방식은 다음과 같습니다.

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

가장 심플한 구현의 전체적인 구조는 다음과 같습니다.

여기에 이미지 설명 입력

이 오류는 추적에 시간이 걸려서 처음에는 ScrollView의 크기를 고정하려고 했지만 오류 메시지에 "콘텐츠 크기"가 분명하게 표시됩니다.ScrollView 상단에서 핀으로 고정시킨 모든 것이 하부에 핀으로 고정되었는지 확인했습니다.이렇게 하면 ScrollView는 모든 객체와 구속조건의 높이를 찾아 콘텐츠 높이를 계산할 수 있습니다.이렇게 하면 애매한 콘텐츠 높이를 해결할 수 있고, 폭도 비슷하고...처음에는 X가 ScrollView에 집중되어 있었지만 ScrollView 측면에 오브젝트를 고정해야 했습니다.iPhone6는 화면이 더 넓을 수 있지만 '모호한 콘텐츠 폭' 오류를 제거할 수 있기 때문에 나는 이것을 좋아하지 않는다.

UIScroll View + Centered View + Ambigous Scrollable Content Size + 다수의 iPhone 크기에 대한 답변입니다.

하지만 당신 사건도 완벽하게 커버할 수 있어요!

다음으로 가장 간단한 경우의 초기 상태를 나타냅니다.

  1. 모든 모서리까지 0개의 구속조건이 있는 스크롤뷰
  2. 단추 중심 수평수직고정 폭 및 높이 구속조건
  3. 물론 귀찮은 경고입니다. Has ambiguous scrollable content width ★★★★★★★★★★★★★★★★★」Has ambiguous scrollable content height.

1

우리가 해야 할 일은

  • 뷰의 후행 및/또는 맨 아래 공간에 대해 "0"과 같은 두 개의 구속조건을 추가합니다(아래 스크린샷의 예 참조).

중요: 후행/또는 하단 구속조건을 추가해야 합니다.선두와 톱이 아니라 효과가 없다!

2

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

추신.

논리에 따르면 이 동작은 "컨플릭트 제약"을 발생시킵니다.하지만 안돼!

이 기능이 작동하는 이유와 Xcode가 어떤 제약 조건을 더 우선시하는지를 알 수 없습니다(이러한 제약 조건의 설명에 우선순위를 설정하지 않았기 때문입니다).왜 그런지 댓글로 설명해주시면 감사하겠습니다.

'만들다'를 해요.UIView의의 UIScrollView다음 설명과 같습니다.

  • UIViewController
  • UIView'아까부터'
    • UIScrollView
      • UIView'아까부터'
        • [당신의 콘텐츠]

은 '우리에게'를 예요.UIScrollView i. 상단 하단, 선행 및 했습니다.이를 위해 superView에 대한 상단, 하단, 선행 및 후행 구속조건을 적용했습니다.

다음으로 컨테이너에 대한 구속조건을 추가했습니다.UIScrollView여기서부터 문제가 시작됩니다. 조건앞, 을 붙이면 에 경고.

"스크롤 가능한 콘텐츠 폭이 애매하다" 및 "스크롤 가능한 콘텐츠 높이가 애매하다"

의 동일한 제약 조건을 계속 적용하고 제약 조건을 기본 뷰와 관련하여 컨테이너 뷰에 추가합니다.UIScrollView즉, 컨테이너 뷰의 제약 조건은UIScrollView님의 개요

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

저도 같은 문제가 있었어요.이 체크박스를 끄세요.콘텐츠 크기를 코드로 설정하기 때문입니다.여기에 이미지 설명 입력

드디어 알아냈네요, 이해하기 쉬웠으면 좋겠어요.

이 경고는 종종 스크롤 뷰에 기본 UIView를 "콘텐츠 뷰"로 추가하여 스크롤 뷰와 동일한 크기로 만들고 이 컨텐츠 뷰에서 이 6개의 파라미터를 설정함으로써 무시할 수 있습니다.

여기에 이미지 설명 입력

보시다시피 총 6개의 파라미터가 필요합니다!그게...통상적인 상황에서는 2개의 제약조건을 복제하고 있습니다만, 이것이 이 스토리보드 오류를 회피하는 방법입니다.

늦었지만 다음 솔루션은 스토리보드를 사용하여 추가 코드 없이 다음과 같은 문제를 해결합니다.

내용 보기에서는 스크롤 보기에 선행/추적/상단/하단 공간에 대한 제약을 설정해야 합니다. 이렇게 해도 내용 보기 프레임은 변경되지 않습니다.여기에 이미지 설명 입력

물론 스크롤 보기가 내용 크기를 알 수 있도록 내용 보기에 대한 추가 구속조건을 작성해야 합니다.예를 들어 고정 높이와 중심 x를 설정합니다.

이게 도움이 됐으면 좋겠다.

는 ★★★★★★★★★★★★★★★★★★★★★★★contentView제안대로 되지 않았습니다.게다가 뷰가 추가되어 오버헤드가 발생합니다(큰 문제는 아니지만).제가 가장 잘 작동한 것은 단지 애매성 체크를 꺼두는 것이었습니다.scrollView모든 것이 잘 배치되어 있기 때문에 저와 같은 간단한 케이스도 괜찮다고 생각합니다., 다른 이 있을 하시기 바랍니다.scrollViewBreak, Interface-Builder는 이에 대해 더 이상 경고하지 않습니다.

여기에 이미지 설명 입력

Swift 4+ 어프로치:

1) UIScroll View의 상하좌우 여백을 0으로 설정합니다.

2) UIScroll View 내부에 UIView를 추가하고 상단, 하단, 선행 및 후행 여백을 0(UIScroll View 여백과 동일)으로 설정합니다.

3) 높이 구속의 우선순위가 낮은 폭과 높이를 설정하는 것이 가장 중요합니다.

private func setupConstraints() {

    // Constraints for scrollView
    scrollView.topAnchor.constraint(equalTo: view.topAnchor).isActive = true
    scrollView.leadingAnchor.constraint(equalTo: view.leadingAnchor).isActive = true
    scrollView.trailingAnchor.constraint(equalTo: view.trailingAnchor).isActive = true
    scrollView.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true

    // Constraints for containerView
    containerView.topAnchor.constraint(equalTo: scrollView.topAnchor).isActive = true
    containerView.bottomAnchor.constraint(equalTo: scrollView.bottomAnchor).isActive = true
    containerView.leadingAnchor.constraint(equalTo: scrollView.leadingAnchor).isActive = true
    containerView.trailingAnchor.constraint(equalTo: scrollView.trailingAnchor).isActive = true
    containerView.widthAnchor.constraint(equalTo: scrollView.widthAnchor).isActive = true

    let heightConstraint = containerView.heightAnchor.constraint(equalTo: scrollView.heightAnchor)
    heightConstraint.priority = UILayoutPriority(rawValue: 250)
    heightConstraint.isActive = true
}

스크롤 뷰를 자동 레이아웃으로 완전히 스크롤할 수 있도록 하는 방법에 대한 자세한 내용은 이 튜토리얼을 참조하십시오.그런데 왜 스크롤 뷰의 콘텐츠 사이즈가 항상 필요 이상으로 큰지 궁금하네요.

http://samwize.com/2014/03/14/how-to-use-uiscrollview-with-autolayout/

아래 참조: 수직 및 수평 중앙 스크롤 뷰 콘텐츠 보기애매모호 에러가 발생했습니다.항상 콘텐츠뷰에서 스크롤뷰에 추가된2개가 1)인 것을 확인해 주세요.컨테이너에 대한 버튼 공간.2) 스크린샷에 강조 표시된 제약에 대한 공간 표시,

이러한 제약 조건은 스크롤에서 내용 보기 높이 또는 너비 이후에 스크롤할 수 있는 양을 의미합니다.

여기에 이미지 설명 입력

도움이 될 거야

Selected View의 "자동 레이아웃 문제 해결"> "결측 제약조건 추가"를 사용하여 뷰에 대한 이러한 문제를 해결했습니다.

다음 두 가지 제약이 문제를 해결합니다.

trailing = Stack View.trailing - 10
bottom = Stack View.bottom + 76

여기서: 후행, 하단, UIScroll View의 하단

View 사용 표시)UView의 내부 입니다.UIScrollView( ,top,bottom,trailing,leadingUIScrollView 및 )의 개요contentView 한다equalwidth ★★★★★★★★★★★★★★★★★」equalheight감시할 수 있습니다.게게제제제제제제다음 중 하나:

-(void)viewDidLayoutSubviews
{
    [super viewDidLayoutSubviews];
    self.scrollView.contentSize = self.contentView.frame.size;
}

나는 문제를 해결했다.

저 같은 경우에는 iPad의 콘텐츠 사이즈와 콘텐츠 사이즈가 불분명하다는 문제가 있었지만 iPhone의 경우 작업을 하고 있었습니다.이 문제를 해결하기 위해 스토리보드를 다음과 같이 변경했습니다.

  1. UIView에서 스크롤 뷰를 추가하고 0,0,0,0,0에 선행, 상단, 후행 및 하단의 구속조건을 추가합니다.
  2. 예를 들어 100에 대한 요구 사항에 따라 스크롤 보기의 높이를 설정합니다.
  3. UIView를 추가하여 화면을 스크롤하고 0,0,0,0에 선행, 상단, 후행 및 하단의 구속조건을 추가하고 중심(X) 및 중심(Y) 구속조건을 정렬합니다.
  4. 스크롤 보기의 크기 검사기에서 "내용 레이아웃 안내서" 선택을 취소합니다.

@Matteo Gobbi의 답변은 완벽합니다만, 스크롤 뷰가 스크롤 할 수 없기 때문에, 「중앙 Y」를 제거하고 「높이 >=1」을 추가해 스크롤 뷰가 됩니다.

오른쪽 스크롤에 스크롤바가 표시되어도 콘텐츠가 움직이지 않는 행동을 하는 사람이 있다면 이 사실을 고려해 볼 필요가 있습니다.

또한 스크롤 뷰의 내용과 스크롤 뷰 외부의 객체 간에 구속조건을 사용하여 스크롤 뷰의 콘텐츠에 고정 위치를 제공하여 해당 콘텐츠가 스크롤 뷰 위로 이동하는 것처럼 보이게 할 수 있습니다.

그건 애플의 문서에서 나온 거예요.예를 들어 contentView 대신 위쪽 레이블/버튼/임그/View를 스크롤 영역 외부에 있는 보기(헤더 또는 스크롤View 바로 위에 있음)에 잘못 고정하면 전체 컨텐츠View가 제자리에 고정됩니다.

uiscroll view가 스크롤되지 않아 어려움을 겪고 있는 사람들은 컨텐츠 뷰의 맨 아래 레이아웃(콘텐츠 뷰의 안쪽)을 사용하여 컨텐츠 뷰의 맨 아래 구속조건을 설정합니다.중심 Y 구속조건을 제거하는 것을 잊지 마십시오.

나머지 모든 제약조건은 위에서 정의한 것과 동일합니다.Scrollview는 콘텐츠 뷰에서 최대 높이를 얻는 것에 대해서만 관심을 가지며, 마지막 뷰의 하단 구속조건으로 설정하고 있습니다. 즉, 스크롤뷰는 자동으로 콘텐츠 오프셋을 변경합니다.

내 경우 마지막 뷰는 줄 수 없음 속성 = 0(콘텐츠에 따라 자동으로 높이를 조정함)으로 UIL 가능하므로 동적으로 uilable의 높이를 높이고 최종적으로 uilable의 하단 레이아웃이 컨텐츠 뷰의 하단 레이아웃과 일치하므로 스크롤 가능 영역이 증가합니다.스크롤뷰가 콘텐츠 오프셋을 증가시킵니다.

는 유튜브에 .
StackViews Xcode의하여 StackViews를 .

여기에 두 가지 시나리오가 나올 수 있을 것 같아요.

스크롤 내의 뷰 뷰 -

  1. 예: 「」 「」 「」 「」 「」UIView)
  2. 를 들어, 「」의 내용 사이즈)가 있습니다.UIStackView)

두 경우 모두 수직으로 스크롤할 수 있는 뷰의 경우 다음 제약조건을 추가해야 합니다.

  1. 위, 왼쪽, 아래, 오른쪽에서 4개의 구속조건이 있습니다.

  2. 스크롤 뷰에 동일한 너비(수평 스크롤을 중지하려면)

고유한 컨텐츠 높이가 있는 보기에 다른 제약 조건은 필요하지 않습니다.

여기에 이미지 설명 입력


고유한 컨텐츠 높이가 없는 뷰의 경우 높이 구속조건을 추가해야 합니다.높이 구속조건이 scrollView의 높이보다 큰 경우에만 보기가 스크롤됩니다.

여기에 이미지 설명 입력

UIScroll View에서 문제가 해결되지 않으면 콘텐츠 레이아웃 가이드를 끄십시오(xcode Interface Builder에서 Scroll View 선택 -> 오른쪽 패널에서 크기 검사기 선택 -> '콘텐츠 레이아웃 가이드' 선택 취소). 또는 xcode 11 스크롤레이아웃 - 새로운 레이아웃 스타일에 도움이 됩니다.05.02.2020의 경우 MacOS 10.15.2, Xcode 11.3.1에서 정상적으로 동작합니다.

스크린샷 참조

import UIKit

class ViewController: UIViewController {

    //
    let scrollView: UIScrollView = {
        
        let sv = UIScrollView()
        sv.translatesAutoresizingMaskIntoConstraints = false
        return sv
    }()
    
    let lipsumLbl: UILabel = { // you can use here any of your subview
        
        let lbl = UILabel()
        lbl.translatesAutoresizingMaskIntoConstraints = false
        lbl.text = """
        Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce eleifend nisi sit amet mi aliquet, ut efficitur risus pellentesque. Phasellus nulla justo, scelerisque ut libero id, aliquet ullamcorper lectus. Integer id iaculis nibh. Duis feugiat mi vitae magna tincidunt, vitae consequat dui tempor. Donec blandit urna nec urna volutpat, sit amet sagittis massa fringilla. Pellentesque luctus erat nec dui luctus, sed maximus urna fermentum. Nullam purus nibh, cursus vel ex nec, pulvinar lobortis leo. Proin ac libero rhoncus, bibendum lorem sed, congue sapien. Donec commodo, est non mollis malesuada, nisi massa tempus ipsum, a varius quam lorem vitae nunc.
        
        Cras scelerisque nisi dolor, in gravida ex ornare a. Interdum et malesuada fames ac ante ipsum primis in faucibus. Maecenas vitae nisl id erat sollicitudin accumsan sit amet viverra sapien. Etiam scelerisque vulputate ante. Donec magna nibh, pharetra sed pretium ac, feugiat sit amet mi. Vestibulum in ipsum vitae dui vehicula pulvinar eget ut lectus. Fusce sagittis a elit ac elementum. Fusce iaculis nunc odio, at fermentum dolor varius et. Suspendisse consectetur congue massa non gravida. Sed id elit vitae nulla aliquam euismod. Pellentesque accumsan risus dolor, eu cursus nibh semper id.
        
        Vestibulum vel tortor tellus. Suspendisse potenti. Pellentesque id sapien eu augue placerat dictum. Fusce tempus ligula at diam lacinia congue in ut metus. Maecenas volutpat tellus in tellus maximus imperdiet. Integer dignissim condimentum lorem, id luctus nisi maximus at. Nulla pretium, est sit amet mollis eleifend, tellus nulla viverra dolor, ac feugiat massa risus a lectus. Pellentesque ut pulvinar urna, blandit gravida ipsum. Nullam volutpat arcu nec fringilla auctor. Integer egestas enim commodo, faucibus neque ac, rutrum magna. Vivamus tincidunt rutrum auctor. Cras at rutrum felis. Fusce elementum lorem ut pharetra venenatis.
        """
        lbl.textColor = .darkGray
        lbl.font = UIFont.systemFont(ofSize: 16)
        lbl.numberOfLines = 0
        return lbl
    }()
    
    //======================================================================//
    //
    // MARK:- viewDidLoad
    //
    override func viewDidLoad() {
        super.viewDidLoad()
        
        setupViews()
        setupAutoLayout()
    }
    
    func setupViews() {
        
        title = "ScrollView Demo"
        view.backgroundColor = .white
        view.addSubview(scrollView)
        scrollView.addSubview(lipsumLbl)
    }
    
    func setupAutoLayout() {
        
        scrollView.leftAnchor.constraint(equalTo: view.leftAnchor).isActive = true
        scrollView.rightAnchor.constraint(equalTo: view.rightAnchor).isActive = true
        scrollView.topAnchor.constraint(equalTo: view.topAnchor).isActive = true
        scrollView.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true
        
        lipsumLbl.topAnchor.constraint(equalTo: scrollView.topAnchor).isActive = true
        lipsumLbl.leftAnchor.constraint(equalTo: view.leftAnchor).isActive = true
        lipsumLbl.rightAnchor.constraint(equalTo: view.rightAnchor).isActive = true
        lipsumLbl.bottomAnchor.constraint(equalTo: scrollView.bottomAnchor).isActive = true
    }
}

출력:

여기에 이미지 설명 입력

세로 스크롤

  1. 제약 조건이 0,0,0,0인 UIScrollView를 슈퍼뷰에 추가합니다.
  2. UIView를 ScrollView에 추가합니다.슈퍼뷰에 제약이 0,0,0,0 입니다.
  3. UIView에 대해 동일한 폭 구속조건을 UIScrollView에 추가합니다.
  4. UIView에 높이를 추가합니다.
  5. 제약 조건이 있는 요소를 UIView에 추가합니다.
  6. 하부에 가장 가까운 요소의 경우 UIView 하부에 구속이 있는지 확인합니다.

어느 뷰에서도 프레임과 그 컨텐츠의 사이즈는 동일합니다.즉, 200 x 800 크기의 컨텐츠(이미지 등)가 있는 경우는, 프레임도 200 x 800 이 됩니다.

스크롤뷰 콘텐츠에 해당되지 않습니다.내용은 보통 scrollView의 프레임 크기보다 큽니다.내용의 너비가 같은 경우 수직으로만 스크롤합니다.높이가 같으면 가로로만 스크롤합니다.따라서 4가 아닌 6개의 제약조건이 필요한 유일한 뷰입니다.필요한 제약 조건이 4개 이상인 다른 뷰의 경우 충돌이 발생합니다.


스크롤 뷰, 스크롤 내용 및 스크롤 위치를 설정하려면 기본적으로 다음 세 가지 질문에 답해야 합니다.

  1. 제 체격은 어느 정도인가요?예를 들어 화면 높이의 절반만 사용하고 싶기 때문에 스크롤 뷰는 어느 시점에서 어느 정도 커야 합니까?
scrollview.frame = (x: 0, y:0, width: UIScreen.main.bounds.width, height: UIScreen.main.bounds.height / 2)
  1. 스크롤 공간이 얼마나 필요합니까?즉, 컨텐츠의 크기는 어느 정도입니까?예를 들어 프레임의 폭은 500포인트 정도이지만, 7000포인트로 이미지를 설정할 수 있기 때문에 가로 스크롤에 시간이 걸립니다.또는 정확히 500개의 폭으로 하면 수평 스크롤이 발생하지 않습니다.

  2. 당신은 지금 얼마나 스크롤을 했습니까?컨텐츠(또는 이미지)의 폭이 7000이고 프레임 크기가 500이라고 가정해 보십시오.이미지의 마지막에 액세스 하려면 , 오른쪽으로 6500 포인트 스크롤 할 필요가 있습니다.세 번째 부분은 정말 제약에 영향을 주지 않아요.그건 일단 무시하셔도 됩니다.ScrollView를 이해하면 ScrollView 동작에 도움이 됩니다.

솔루션

기본적으로 2개의 추가 제약(콘텐츠 크기에 관한)을 생략하면 애매모호하기 때문에 레이아웃엔진이 불만을 제기합니다.콘텐츠의 어떤 영역이 숨겨져 있는지(scrollView에 표시되지 않음)와 콘텐츠의 어떤 영역이 숨겨져 있지 않은지(scrollView에 표시됨) 알 수 없습니다.

따라서 콘텐츠에 대한 크기 제한도 추가해야 합니다.상세한 것에 대하여는, 이 회답을 참조해 주세요.

그러나 뷰에 크기 제한을 추가하지 않고 그대로 작동하는 경우도 있습니다.왜 그런 것일까요?

스크롤 뷰에 추가한 모든 콘텐츠가 스크롤 뷰의 가장자리로 제한되어 있는 경우, 콘텐츠가 커짐에 따라 스크롤 뷰에 수용할 공간이 추가됩니다. '아예'를 쓰고 UIView서 s는 " " " 입니다.intrinsicContentSize0따라서 scrollView는 여전히 콘텐츠의 모호성에 대해 불만을 제기합니다.단, 사용하신 적이 있는 경우UILabel빈 텍스트가 아닌 텍스트가 있습니다.intrinsicContentSize(글꼴 크기, 텍스트 길이, 줄 바꿈 등에 따라) scrollView가 애매함을 호소하지 않도록 설정되어 있습니다.

여기에 표시된 것처럼 별도의 콘텐츠 보기를 만들었습니다.

콘텐츠 뷰는 자유 형식이며 모든 서브뷰를 콘텐츠뷰와 관련된 자체 제약조건과 함께 추가할 수 있습니다.

UIScrollView가 기본 보기 컨트롤러에 추가됩니다.

프로그램적으로 IBOutlet을 통해 링크된 contentView를 클래스에 추가하고 UIScrollView의 contentView를 설정합니다.

인터페이스 빌더를 통한 UIScroll View with Content View

같은 에러가 발생하고 있었습니다.나는 팔로잉을 했다.

  1. 표시(슈퍼뷰)
  2. 스크롤 뷰 0,0,600,600
  3. UIView in ScrollView : 0,0,600,600
  4. UIView에는 이미지 뷰, 라벨이 포함되어 있습니다.

이제 scrollView(2)에 선행/추적/위/아래를 추가한 다음 UIView(3)를 추가합니다.

View(1) 및 View(3)를 선택하고 키와 무게를 동일하게 설정합니다.그게 내 문제를 해결했어

도움이 되는 비디오를 작성했습니다.

https://www.youtube.com/watch?v=s-CPN3xZS1A

[XCode 7.2 및 iOS 9.2에서 테스트 완료]

Storyboard 오류 및 경고를 억제한 것은 스크롤 뷰와 콘텐츠 뷰(내 경우 스택 뷰)의 고유 크기를 Placeholder로 설정했기 때문입니다.이 설정은 Storyboard의 크기 검사기에서 찾을 수 있습니다.설계 시간 고유의 컨텐츠 크기를 설정하면 인터페이스 작성기에서 편집하는 동안 보기에만 영향을 미칩니다.실행 시 뷰에는 이 고유 콘텐츠 크기가 없습니다.

그래서 이걸 설정해서 틀리는 건 아닌 것 같아요.

주의: 스토리보드에서는 스크롤 뷰의 모든 모서리를 슈퍼 뷰에 고정하고 스택 뷰의 모든 모서리를 스크롤 뷰에 고정합니다.제 코드로 번역은 설정했습니다.스크롤 뷰와 스택뷰 모두에 대해 자동 크기 조정 MaskIntoConstraints가 false로 지정됩니다.그리고 콘텐츠 사이즈에 대해서는 언급하지 않았습니다.스택 뷰가 동적으로 커지면 스토리보드에 설정된 제약조건에 따라 스택이 스크롤 가능함을 보증합니다.

스토리보드 경고는 나를 미치게 했고 나는 단지 경고를 억누르기 위해 사물을 가로나 세로로 중앙에 두고 싶지 않았다.

이전 답변에서 설명한 바와 같이 스크롤 뷰 내에 커스텀뷰를 추가해야 합니다.

커스텀 뷰는 이미지에 표시된 Content View입니다.

내용 보기에 모든 하위 보기를 추가합니다.스크롤 콘텐츠 뷰에 애매한 콘텐츠크기 경고가 표시됩니다.콘텐츠 뷰를 선택하고 IB 레이아웃의 오른쪽 하단에 있는[자동 레이아웃 문제 해결]버튼을 클릭하여 [결측 제약조건 추가]옵션을 선택합니다.

여기에 이미지 설명 입력

이제부터는 프로젝트를 실행하면 스크롤 뷰가 자동으로 콘텐츠 크기를 업데이트하므로 추가 코드가 필요하지 않습니다.

스크롤 뷰의 위쪽에서 아래쪽까지 연속적으로 구속선을 만드는 방법만 있으면 됩니다.[-X-X-X]

수평 스크롤 스크롤 뷰의 경우 스크롤 뷰의 각 아이에 대한 폭과 높이 제약도 추가해야 했지만 Apple의 기술 노트에서는 알 수 없습니다.

인터페이스 빌더의 크기 검사기에서 ViewController(UIScrollView를 유지하는 컨트롤러) 크기를 Freeform으로 설정하면 모두 작동합니다.

포함된 UIView컨트롤러에 대한 Interface Builder의 크기 검사기의 자유형 설정

언급URL : https://stackoverflow.com/questions/19036228/uiscrollview-scrollable-content-size-ambiguity

반응형