자동 레이아웃을 사용하여 UIScrollview에 제약 조건을 설정하려면 어떻게 해야 합니까?
저는 자동 레이아웃 이전에 사소한 스크롤 뷰 설정을 달성하기 위해 혼합 및 순수 자동 레이아웃 접근법에 대한 다양한 솔루션을 이틀 동안 시도했고, 이제 공식적으로 되었습니다. 제가 너무 멍청했나 봐요.저는 이것을 주로 스토리보드에서 설정하고 있습니다(글쎄요, 그냥 있는 그대로입니다).
그래서 여기 도움을 청합니다.
보기 트리:
UIView
-UIView
-UIView
..-UIScrollview
...-UIButton
...-UIButton
...-UIButton
버튼은 수평으로 스크롤해야 합니다(왼쪽에서 오른쪽으로, 반대로).누가 순수 오토 레이아웃을 사용하여 이를 달성하기 위한 제약 조건을 설정하는 방법을 알려줄 수 있습니까?
--
저는 다음과 같은 혼합된 접근법을 시도했습니다.
UIView
- UIView
- UIView
..-UIScrollview
...-UIView (contentview)
....-UIButton
....-UIButton
....-UIButton
...에 및 조건 에 대한 고정 너비 및 높이 제약 조건 설정contentview 리고그고.translatesAutoresizingMaskIntoConstraints설정을 확인할 수 있습니다.버튼과 스크롤 보기는 제약 조건을 사용하여 설정됩니다.스크롤 보기 스크롤링(yay)이 표시되지만, 안타깝게도 너무 많이 스크롤됩니다!제가 아는 한, 스크롤 폭은 콘텐츠 보기를 설정한 것보다 다소 두 배가 되었습니다.
저는 순수 자동 레이아웃 접근법도 시도했습니다. 둘 다.contentview그리고 없이.모든 뷰가translatesAutoresizingMaskIntoConstraints=NO을제하는고를 self.view단추에는 너비/높이 제한이 고정되어 있으며 스크롤 보기의 네 모서리에 모두 고정되어 있습니다.스크롤은 없습니다.
그래서 나는 왜 그것이 제대로 작동하지 않는지 완전히 당황스럽습니다.도움을 주시면 감사하겠습니다. 다른 정보가 필요하시면 문의해주세요!
솔루션이 포함된 업데이트된 스크린샷 - 버튼Z 제약 조건:

EDIT @ Jamie Forres 솔루션은 마지막 버튼에서 잘못된 후행 제약 조건인 것으로 나타났습니다.6441 대신 제가 설정한 값은 마이너스 -6441이었습니다.까다로운 점은 스토리보드에서 값을 설정할 때 핀 도구 모음에 두 가지 옵션이 있다는 것입니다.

Current Canvas Value는 음(스크롤 없음)이고 아래 옵션은 양(스크롤 활성화)입니다.이것은 제가 멍청하지는 않지만 적어도 반쯤 눈이 멀었다는 것을 의미합니다.하지만, 제 변호를 위해, XCode가 "잘못된" 설정에 대한 오류를 나타내지 않는 것은 다소 불안하지 않나요?
다시 편집됨 이제 재미있네요...후행 값을 -6441(스크롤 없음)에서 6441 활성화 스크롤로 변경합니다.하지만 제 오랜 친구인 "너무 많은 콘텐츠 크기"가 돌아와 콘텐츠 크기가 원래의 두 배로 커졌습니다!올바른 컨텐츠 스크롤을 얻는 솔루션은 후행 제약 조건을 0으로 설정하는 것이었습니다!이것은 스토리보드에서 일할 때 명확하지 않지만 @InfinityJames의 코드를 보면 그렇게 되어야 합니다.
제약 조건을 여기에 붙여 놓았기 때문에 정확한 값과 설정을 확인하기가 어렵기 때문에 스크린샷을 보면 어디가 잘못되었는지 잘 모르겠습니다.
설정에 문제가 있는지 설명하는 대신 설명하는 것과 매우 유사한 뷰 계층 및 제약 조건 설정을 사용하여 기본 샘플 프로젝트를 만들었습니다.수평 스크롤은 Apple이 기술 노트에 설명한 "Pure AutoLayout" 접근 방식을 사용하는 샘플 프로젝트에서 예상대로 작동합니다.
또한 처음에는 자동 레이아웃을 사용하는 데 많은 어려움을 겪었습니다.UIScrollView스크롤 뷰의 모든 항목이 함께 스크롤 뷰의 모든 측면에 연결되고 AutoLayout 시스템이 프레임보다 큰 스크롤 뷰의 contentSize를 결정할 수 있도록 하는 것이 작동의 핵심입니다.코드에서 그렇게 하려고 했던 것처럼 보이지만, 내용 크기를 너무 작게 만드는 불필요한 제약이 있었을 수도 있습니다.
또한 다른 사용자가 언급한 것처럼 자동 레이아웃 및 UIScrollview를 사용하면 더 이상 contentSize를 명시적으로 설정하지 않습니다.자동 레이아웃 시스템은 제약 조건에 따라 내용 크기를 계산합니다.
저는 또한 이 전자책 챕터가 이 모든 것이 어떻게 작동하는지 이해하는 데 매우 도움이 된다는 것을 알게 되었습니다.이 모든 것이 도움이 되길 바랍니다.
하하하 바보 클럽에 오신 것을 환영합니다.저는 설립자 중 한 명입니다. :D
수직 스크롤의 경우: 작동할 수 있는 유일한 방법(iOS 8, Xcode 6 및 순수 자동 레이아웃)은 Scroll View(슈퍼뷰와 관련된 모든 것)에 다음과 같은 제약 조건을 추가하는 것이었습니다.
- 동일한 너비
- 동등한 높이
- Y 중심 맞춤
- 중심 X 선형
내 구조:
UIView
- ScrollView
- Subview
- Subview
- Subview
- Subview
- ...
최종 결과는 다음과 같습니다.
설정은 다음과 같습니다.
바라건대 이것이 누군가 새벽 5시에 잠드는 것을 구할 수 있기를 바랍니다. :D
단순한 독립형 예제
질문에 대한 높은 득표율과 답변에 대한 낮은 득표율로 판단할 때, 사람들은 여기서 이해할 수 있고 빠른 해결책을 찾지 못하고 있습니다.하나 추가해 보겠습니다.이 프로젝트는 인터페이스 빌더에서 완전히 수행된 자체 포함 예제입니다.당신은 10분 이내에 그것을 끝낼 수 있을 것입니다.그런 다음 배운 개념을 자신의 프로젝트에 적용할 수 있습니다.
원래 질문은 스크롤 버튼에 대한 질문입니다.여기서 나는 그냥 사용합니다.UIView하지만 그들은 당신이 좋아하는 어떤 관점이든 표현할 수 있습니다.스토리보드 스크린샷이 이 형식에 비해 더 콤팩트하기 때문에 가로 스크롤도 선택했습니다.그러나 수직 스크롤의 원리는 동일합니다.
주요 개념
- 그
UIScrollView하나의 하위 보기만 사용해야 합니다.스크롤하고자 하는 모든 내용을 담을 수 있는 콘텐츠 뷰 역할을 하는 'UI뷰'입니다. - 내용 보기와 스크롤 보기의 상위 보기의 수평 스크롤 높이를 같게 합니다. (수직 스크롤의 너비는 같음)
- 스크롤 가능한 모든 콘텐츠의 너비가 설정되어 있고 모든 측면에 고정되어 있는지 확인합니다.
새 프로젝트 시작
단일 보기 응용프로그램일 수 있습니다.
스토리보드
이 예에서는 수평 스크롤 보기를 만들 것입니다.[보기 컨트롤러]를 선택한 후 [크기 관리자]에서 [자유 양식]을 선택합니다.을 비너만으로 합니다.1,000 키는 고그높 이리높.300이것은 스크롤할 콘텐츠를 추가할 수 있는 공간을 스토리보드에 제공합니다.
스크롤 뷰 추가
추가UIScrollView뷰 컨트롤러의 루트 뷰에 모든 면을 고정합니다.
내용 보기 추가
추가UIView스크롤 보기의 하위 보기로 표시됩니다.이것이 열쇠입니다.스크롤 보기에 많은 하위 보기를 추가하지 마십시오.하나만 추가하면 됩니다.UIView스크롤할 다른 보기에 대한 내용 보기가 됩니다.내용 보기를 네 면 모두의 스크롤 보기에 고정합니다.
동등한 높이
이제 문서 개요에서 내용 보기와 스크롤 보기의 상위 보기를 모두 눌러 둘 다 선택합니다.그런 다음 높이를 Control동일하게 설정합니다(내용 보기에서 스크롤 보기로 드래그).이것도 중요합니다.수평으로 스크롤하기 때문에 스크롤 보기의 내용 보기는 이러한 방식으로 설정하지 않으면 높이를 알 수 없습니다.
참고:
- 내용을 세로로 스크롤할 경우 내용 보기의 너비를 스크롤 보기의 상위 너비와 동일하게 설정할 수 있습니다.
내용 추가
을 .UIView를 지정하고 조건을 합니다.저는 모든 것에 8점의 마진을 사용했습니다.
제약 조건:
- 녹색 보기: 위쪽, 왼쪽 및 아래쪽 가장자리를 고정합니다.너비를 400으로 합니다.
- 빨간색 보기: 위쪽, 왼쪽 및 아래쪽 가장자리를 고정합니다.너비를 300으로 합니다.
- 보라색 보기: 4개의 가장자리를 모두 고정합니다.남은 공간(이 경우 268)에 상관없이 너비를 지정합니다.
스크롤 보기가 내용 보기의 너비를 알 수 있도록 너비 제약 조건을 설정하는 것도 중요합니다.
끝났습니다
이상입니다.이제 프로젝트를 실행할 수 있습니다.이 답변의 맨 위에 있는 스크롤 이미지처럼 동작해야 합니다.
수직 스크롤의 경우 이 예에서 모든 너비 및 높이 방향을 전환합니다(테스트 및 작동).
추가 연구
- iOS: 스크롤 뷰에서 자동 레이아웃을 작동시키는 방법
- 인터페이스 빌더에서 자동 레이아웃으로 UIScrollView를 구성하는 방법
- YouTube 비디오 튜토리얼:UIScrollView - 화면에서 보기를 유지하는 방법
contentSize는 UIScrollView 내부의 제약 조건을 적용하여 암묵적으로 설정됩니다.
예를 들어, UIView 내부에 다음과 같은 UIScrollView가 있습니까(알고 계실 것이라 확신합니다)
UIView *containerView = [[UIView alloc] init];
UIScrollView *scrollView = [[UIScrollView alloc] init];
[containerView addSubview:scrollView];
containerView.translatesAutoresizingMaskIntoConstraints = NO;
scrollView.translatesAutoresizingMaskIntoConstraints = NO;
NSDictionary *viewsDictionary = NSDictionaryOfVariableBindings(containerView, scrollView);
[containerView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[scrollView]|"
options:kNilOptions
metrics:nil
views:viewsDictionary]];
[containerView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[scrollView]|"
options:kNilOptions
metrics:nil
그러면 ScrollView가 컨테이너View의 크기를 채우도록 설정됩니다(컨테이너View는 특정 크기여야 함).
그런 다음 UIScrollView의 contentSize를 다음과 같은 버튼을 유지할 수 있을 정도로 크기로 암묵적으로 설정하여 조정할 수 있습니다.
UIButton *buttonA = [[UIButton alloc] init];
UIButton *buttonB = [[UIButton alloc] init];
UIButton *buttonC = [[UIButton alloc] init];
[scrollView addSubview:buttonA];
[scrollView addSubview:buttonB];
[scrollView addSubview:buttonC];
buttonA.translatesAutoresizingMaskIntoConstraints = NO;
buttonB.translatesAutoresizingMaskIntoConstraints = NO;
buttonC.translatesAutoresizingMaskIntoConstraints = NO;
viewsDictionary = NSDictionaryOfVariableBindings(scrollView, buttonA, buttonB, buttonC);
[scrollView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-[buttonA]-|"
options:kNilOptions
metrics:nil
views:viewsDictionary]];
[scrollView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[buttonA]-[buttonB]-[buttonC]-|"
options:NSLayoutFormatAlignAllBaseline
metrics:nil
views:viewsDictionary]];
UIScrollView와 함께 AutoLayout을 사용하는 것과 관련하여 매우 많은 질문이 있습니다. 중요한 점은 UIScrollView의 내부 뷰가 ContentView에는 제약이 있지만 UIScrollView 자체에는 제약이 없다는 것입니다.기술 노트 TN2154를 참조하면 다음을 찾을 수 있습니다.
UIScrollView 클래스는 경계의 원점을 변경하여 내용을 스크롤합니다.자동 레이아웃을 사용하여 이 작업을 수행하려면 스크롤 뷰 내의 위쪽, 왼쪽, 아래쪽 및 오른쪽 가장자리가 콘텐츠 뷰의 가장자리를 의미합니다.
그것을 입니다: 다음그보여줍니다를이림은다니.
UIScrollView에 제약 조건이 적용되면 뷰가 잘못 배치되어 프레임을 업데이트해야 합니다.그러나 경고 및 오류는 없습니다.모든 제약 조건이 내용 보기에 반대되기 때문입니다.
UIScrollView는 내부 보기의 제약 조건에 따라 내용 보기의 크기를 계산합니다. (예를 들어, 내용 크기: 너비 = 100(선행 공간) + 200(선행 공간) + 500(선행 공간), 높이 = 131(위쪽 간격) + 200(높이) + 269(아래쪽 간격)
UIScrollView에서 뷰에 대한 제약 조건을 추가하는 방법:
- 내용 보기에서 보기 위치를 이미징합니다.
- 내용 보기의 가장자리에 위쪽, 오른쪽, 아래쪽, 왼쪽 간격을 추가하고 보기의 너비와 높이를 추가합니다.
그리고 모든 것이 끝났습니다.
스크롤 뷰를 사용하여 AutoLayout을 쉽게 처리할 수 있는 방법은 스크롤 뷰에 모든 하위 뷰가 포함된 컨테이너 뷰를 추가하는 것입니다.
결론: UIScrollView를 사용한 AutoLayout을 이해하기 위한 핵심은 내부 뷰가 콘텐츠 뷰에 대해 제약을 가하지만 UIScrollView 자체에는 제약을 가하지 않는다는 것입니다.
첨부된 샘플 코드
다음 솔루션은 contentSize 없이 자동 레이아웃을 사용하는 scrollView에 적합했습니다.
- 스크롤 보기를 끌어다 놓으면 컨트롤러를 볼 수 있고 원하는 공간을 덮을 수 있는 제약 조건을 적용할 수 있습니다.
- ScrollView 안에 UIView를 끌어다 놓으면 ScrollView의 전체 공간을 커버하고 ScrollView에서 위쪽, 왼쪽, 오른쪽, 아래쪽 공간이 되도록 제약 조건을 적용할 수 있습니다.
- 스크롤 필요에 따라 내부 보기의 높이(수평 스크롤이 필요한 경우 너비)를 설정합니다.필요한 경우 코드에서 이 부분을 수행할 수도 있습니다.
- 위험합니다.(3) 지점에서 높이를 큰 값으로 설정한 후 (2) 지점으로 돌아가서 (3) 지점에서 높이를 강제로 변경할 때 Xcode가 값을 변경했을 수 있으므로 위쪽, 왼쪽, 오른쪽, 아래쪽 값을 다시 0으로 설정해야 합니다.
그리고 당신은 끝났습니다.이제 이 뷰에 원하는 수의 컨트롤을 추가하고 서로 관련된 제약 조건을 적용할 수 있습니다(이 뷰가 없으면 작동하지 않는 것처럼 보임).이 보기를 사용하지 않으려면 스크롤 보기와 관련된 각 컨트롤에 제약 조건을 적용해야 합니다(서로 관련되지 않음).
압도적인 팁............
위험합니다.UIScrollView의 너비가 1000이고 높이가 100이라고 가정해 보겠습니다. (일반적으로 이러한 값은 장치의 너비 등에 따라 동적입니다.)하지만 지금은 가로 1000, 세로 100이라고만 말해주세요.)수평 스크롤을 한다고 가정해 보겠습니다.UIV 뷰를 UIScrollView 안에 넣습니다.(이것이 "내용 보기"입니다.)내용 보기의 네 가지 제약 조건을 모두 스크롤 보기로 설정합니다.잘못된 것처럼 보이더라도 모두 0으로 만드십시오.콘텐츠 UIView의 높이를 100으로 설정하고 이는 잊어버립니다.수평으로 스크롤하려면 콘텐츠 보기의 너비를 1225로 설정합니다.
콘텐츠 보기의 너비는 이제 상위 스크롤 보기의 너비보다 225 더 큽니다.괜찮습니다. 사실, 그렇게 해야 합니다.참고:
...후행 폭을 마이너스 225로 설정하지 않습니다...
평소처럼 너비를 "맞춰"야 한다고 생각할 것입니다.하지만 그렇게 하면 전혀 효과가 없을 것입니다.
선행 및 후행 숫자를 0으로 설정해야 하며, 절대 음수가 아닙니다(폭이 "더 큰" 경우에도).
흥미롭게도, 여러분은 실제로 선행/추적 숫자를 임의의 양의 값으로 설정할 수 있습니다("50"이라고 말함). 그리고 그것은 여러분에게 일종의 바운스 마진을 줍니다.(자주 멋져 보입니다. 시도해 보십시오.)양쪽 끝에 음수 값이 있으면 "무음으로 깨집니다."
참고로, 격분하게도, 종종 Xcode (어쨌든 7.3.1 기준),
은 이러한 값을 음수로 '도움이 되도록' 설정합니다!
자동으로 집계하려고 하기 때문입니다.그러면 소리 없이 부서집니다.첫 번째 인스턴스에서 네 개의 값을 모두 0으로 설정합니다.그리고 내용 보기의 너비를 예제의 "1000"보다 훨씬 넓게 설정합니다.
편집: 대부분의 요구 사항을 UIScrollView 대신 UITableView를 사용하게 되었습니다.AsableView는 훨씬 더 유연하고 역동적으로 보입니다.
저는 당신이 문제에 부딪혔다고 생각합니다.contentSize처리 방법에 대한 이 블로그 게시물을 확인하십시오.contentSize"순수한" 자동 레이아웃 접근 방식을 사용하는 경우.요점은 제약 조건이 내용 크기를 암묵적으로 정의한다는 것입니다.자동 레이아웃을 사용할 때는 절대 명시적으로 설정하지 않습니다. 위해 게시물 끝에 프로젝트를
기술 노트에 당신이 살펴보았을 수 있는 부분이 있습니다.스크롤 보기의 가장자리에 고정된 제약 조건을 사용하여 스크롤 보기의 내용 크기를 암시적으로 설정할 수 있습니다.
여기 간단한 예가 있습니다.하나의 보기, 하나의 스크롤 보기가 있는 스토리보드를 만듭니다.스크롤 뷰 구속조건을 설정하여 배치한 뷰의 크기에 맞도록 합니다.
스크롤 뷰 안에 단일 뷰를 추가합니다.제약 조건을 사용하여 해당 보기의 크기를 명시적으로 설정합니다(그리고 크기가 스크롤 보기보다 커야 함).
이제 내부 뷰에 4개의 구속조건을 추가하여 내부 뷰의 4개 가장자리를 상위 스크롤 뷰에 잠급니다.이러한 네 가지 제약 조건으로 인해 내용 크기가 내부 보기에 맞게 확장됩니다.
스크롤 뷰에 여러 뷰를 추가하려는 경우(예: 수평 배치) 첫 번째 하위 뷰의 왼쪽을 스크롤 뷰의 왼쪽으로 잠그고 하위 뷰를 서로 수평으로 잠그고 마지막 하위 뷰의 오른쪽을 스크롤 뷰의 오른쪽으로 잠급니다.이러한 제약 조건은 스크롤 보기의 내용 크기를 모든 하위 보기 및 해당 제약 조건에 맞게 확장하도록 합니다.
"UITextFields를 세로로 스크롤하는 UIScrollView에 배치하여 포커스가 있을 때 키보드의 방해가 되지 않도록 하는 방법"이 문제인 경우 가장 좋은 대답은 다음과 같습니다.
하지 마.
대신 정적 셀이 있는 UITableViewController를 사용합니다.
이 스크롤 아웃 오브 더 웨이 동작을 무료로 이용할 수 있으며, Uinavigation Controller 내에 뷰 컨트롤러가 표시되어 있으면 모든 컨텐츠가 저스트 워크(Just Work)를 설정합니다.
은 이렇게 해야 합니다.
ViewControllerView를 포함합니다.ScrollView,ScrollView를 포함합니다.ContainerView,ContainerView2개의 함Labels

그런 다음 3단계를 수행하여 다음과 같은 작업을 수행합니다.ScrollView 수 있습니다.
- 정
ScrollView에서 핀(위/오/아/왼)까지ViewControllerView -
- 정
ContainerView에서 핀(위/오/아/왼)까지ScrollView - 트
Horizontally in Container(설정 안 함)Vertically in Container)
- 정
-
Label1핀으로 고정(위/오른쪽/왼쪽)ContainerViewLabel1핀으로 고정(오른쪽/왼쪽/아래)ContainerView맨 위에Label1
이것이 도움이 되길 바랍니다.
순수 자동 레이아웃 접근 방식은 잘 작동하지만, 자동 레이아웃이 아닌 곳에서 마이그레이션하는 경우에는 설정하기가 상당히 어렵습니다.지금까지 몇 번 해 본 적이 있으며 몇 가지 일반적인 팁이 있습니다.
- 작게 시작: 스토리보드 보기를 다시 만드는 것을 의미하더라도 몇 가지 요소로 시작하여 천천히 보기를 구성하여 몇 가지 요소를 추가한 후 스크롤이 작동하는지 테스트합니다.
- 번역 사용 안 함모든 것에 대한 마스크를 제약으로 자동 크기 조정: 이것은 항상 저에게 제약 충돌의 원인이었습니다.
- UIScrollView 제약 조건을 올바르게 설정합니다. 스크롤 뷰가 부모 뷰에 모두 연결되어 있는지 확인합니다. 그렇지 않으면 확장되지 않습니다.
이 문제를 처리한 후, 저는 마침내 해결책을 찾았습니다.저는 유니버설 클래스 크기의 스토리보드(600x600)로 작업하고 있습니다.스크롤 뷰 크기의 UIView(contentView)를 만들고 상단, 하단, 선행 및 후행을 스크롤 뷰로 작성했습니다.그런 다음 컨텐츠 보기의 크기를 수동으로 600x600으로 잘라냈습니다.스토리보드가 모든 것의 크기를 조정하는 것을 멈추고 작업할 수 있었지만 실제 장치나 시뮬레이터에서는 보기가 끔찍했습니다.저는 이 클리핑된 크기로 2개의 구속 배출구를 만들었습니다.
@property (weak, nonatomic) IBOutlet NSLayoutConstraint *contentViewWidthConstraint;
@property (weak, nonatomic) IBOutlet NSLayoutConstraint *contentViewHeightConstraint;
그러면 뷰에서 DidLoad
CGSize viewSize = self.view.frame.size;
self.contentViewWidthConstraint.constant = viewSize.width;
self.contentViewHeightConstraint.constant = viewSize.height;
잘 작동합니다.
저는 화면 회전뿐만 아니라 모든 장치/화면 차원에서 작동하는 화면의 스크롤 뷰를 중앙에 배치하여 볼 수 있는 화면에서 자동 레이아웃 뷰를 사용하는 방법에 대한 해결책을 찾기 위해 며칠을 보냈습니다.
저는 오토레이아웃과만 하려고 며칠을 보냈고, 가까워졌지만 충분히 가까워지지는 않았습니다.그래서 결국에는 viewDidLoad에서도 화면당 3줄의 코드를 추가해야 했습니다.
아래 솔루션 참조:
- 스크롤 보기를 만들고 원하는 개체로 채웁니다.
- 자동 레이아웃 설정
- 그런 보기를 및 합니다.

- 보기를 선택한 다음 '누락된 제약 조건 추가'를 선택합니다. 그러면 이 작업이 수행됩니다.
- 그 결과 많은 제약이 발생합니다.보기에 대해 '공간 스크롤 보기를 보기로 수평 이동'과 '공간 스크롤 보기를 보기로 전환' 또는 그 반대의 두 가지 항목이 새로 생성되었습니다.
- 이제 보기에 3개의 제약 조건이 남도록 '보기로 공간 스크롤 보기'를 삭제합니다.보기에서 스크롤 보기를 입력하기 위한 2개와 스크롤 보기와 보기 사이에 수직 공간을 설정하기 위한 1개
- 이제 클릭하고 Ctrl 키를 눌러 Vert 제약 조건을 코드에 연결하여 헤더 파일로 끌어 NSLayoutConstraint IBOutlet을 만듭니다(내가 mine 제약 조건을 VertVtoSV라고 불렀습니다).
이제 .m 파일로 이동하여 이 코드 라인을 viewDidLoad에 추가합니다(정확한 vert centering을 얻으려면 패딩 양으로 재생).
if (IPAD)self.constraintVtoSV.constant = 150.0; }
이제 모든 장치에서 실행되고 중앙에 올바르게 배치된 상태로 스크롤해야 합니다.
저처럼 서브뷰 내에서 제약 없이 정적 콘텐츠를 사용하는 경우 다음과 같이 수행할 수 있습니다.
override func viewDidLayoutSubviews() {
scrollView.contentSize = CGSizeMake(320, 800)
}
iOS 8.4, Xcode 6.4에서 오늘 겪고 있는 비슷한 문제입니다.
하위 뷰를 포함하는 contentView(UIView)가 포함된 스크롤 뷰를 포함하는 뷰가 있습니다.
모든 것이 자동 배치됩니다.스크롤 뷰 에지는 제약 조건을 사용하여 상위 뷰 에지에 고정됩니다.내용 보기 가장자리는 제약 조건을 사용하여 스크롤 보기 가장자리에 고정됩니다.
원래 내용 보기는 스크롤 보기의 전체 너비로 크기 조정을 거부합니다.콘텐츠 보기의 너비가 상위 스크롤 보기와 일치하도록 콘텐츠 보기에 추가 제약 조건을 추가해야 했습니다.또는 contentView.centerX == scrollView.centerX 제약 조건을 설정할 수 있습니다.가장자리를 고정하는 것 외에도 콘텐츠 보기의 크기가 갑자기 조정되었습니다.
// Either one of these additional constraints are required to get autolayout to correctly layout the contentView. Otherwise contentView size is its minimum required size
scrollView.addConstraint(NSLayoutConstraint(item: contentView, attribute: .CenterX, relatedBy: .Equal, toItem: scrollView, attribute: .CenterX, multiplier: 1.0, constant: 0))
scrollView.addConstraint(NSLayoutConstraint(item: contentView, attribute: NSLayoutAttribute.Width, relatedBy: .Equal, toItem: scrollView, attribute: .Width, multiplier: 1.0, constant: 0.0))
양식의 시각적 제약 조건을 사용하여 내용 보기의 가장자리를 스크롤 보기에 고정합니다.
let cvConstraints = ["H:|[contentView]|", "V:|[contentView]|"]
루틴을 사용하여 배열을 반복하고 스크롤 보기에 추가합니다.
저도 비슷한 문제에 직면했습니다.저는 모든 제약을 설정했고 왜 그것이 여전히 일부 하위 보기의 크기를 조정하는지 항상 궁금했습니다.제 해결책은 clipsToBounds를 YES로 설정하는 것이었습니다.
신속하게 이 작업 솔루션을 사용할 수 있습니다.
제약 조건
ScrollView, = Superview , 후, 상, = 수
ContentView선행, 후행, 상단, 하단 = 스크롤 뷰.높이는 콘텐츠에 대해 고정/상대적입니다.
너비 제약 조건(contentView)을 동일한 스크롤 뷰 수퍼뷰로 설정할 수 있지만 프로그래밍 방식으로 해당 제약 조건을 추가하게 되므로 빌드 시간에 제거를 선택합니다.이것은 IB가 경고로 불평하지 않기 위한 것입니다.
extension UIView {
func setupContentViewForViewWithScroll(contentView vwContent : UIView) {
//Set constraint for scrollview content
let constraint = NSLayoutConstraint(item: vwContent, attribute: NSLayoutAttribute.Width, relatedBy: .Equal, toItem: nil, attribute: NSLayoutAttribute.NotAnAttribute, multiplier: 1, constant: self.bounds.size.width)
vwContent.addConstraint(constraint)
self.layoutSubviews()
}
}
보기에서는viewDidLayoutSubviews저는 그냥 이 방법을 부릅니다.
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
self.view.setupContentViewForViewWithScroll(contentView: vwContent)
}
애플이 문서에서 제안하는 것이 아닌 일반인의 솔루션이라는 것을 알고 있지만, 내용이 다르고 매우 빠르게 설정할 수 있는 두 번의 작업이 가능했습니다.스토리보드 보기 컨트롤러에 UIView를 삽입합니다.UIView에서 테이블 뷰, 동적, 0 프로토타입 셀, 스타일 일반 또는 그룹화를 삽입합니다.표 보기에서 스크롤 보기를 삽입하고 스크롤 보기에서 내용을 스크롤 보기에 삽입합니다.이상으로, 사용자 정의 보기 컨트롤러에 설정이 없습니다.
언급URL : https://stackoverflow.com/questions/20223021/how-can-i-use-autolayout-to-set-constraints-on-my-uiscrollview
'programing' 카테고리의 다른 글
| 문이 Rewrite* 규칙을 위반함 (0) | 2023.06.09 |
|---|---|
| CSV 파일을 에서 강력하게 입력된 데이터 구조로 가져옵니다.그물 (0) | 2023.06.09 |
| Oracle - 모든 사용자에게 권한 부여 (0) | 2023.06.09 |
| UI 레이블이 잘렸는지 확인하는 방법은 무엇입니까? (0) | 2023.06.09 |
| 저장되지 않은 변경 사항이 있으므로 vue.js 구성 요소 삭제를 중지합니다. (0) | 2023.06.09 |







