인터페이스 빌더에서 UIScrollView를 어떻게 사용합니까?
내가사동안한용을 사용해 본 에.UIScrollView
과거에는 프로그래밍 방식으로 조작하여 성공적으로 작동했지만, 인터페이스 빌더에서 단독으로 설정하여 작동하는 데 어려움을 겪고 있습니다.
제 아이폰 앱에 간단한 "정보" 페이지가 있습니다.그것은 있습니다.UITextView
일부 아이콘 및 다른 앱에 대한 링크.는 이 를 저의 이모든보내추다니습가했보에 했습니다.UIScrollView
전체 크기가 480 이상이 되도록 배열합니다.앱을 실행하면 스크롤 보기에 화면에 맞는 내용만 표시되고 스크롤되는 내용은 없습니다.
IB를 통해서만 이 작업을 수행할 수 있습니까? 아니면 코드를 통해 contentSize를 조작해야 합니까?
UIScrollView의 contentSize 속성을 설정하지 않았습니다.이상하게도 인터페이스 빌더에서는 이 작업을 수행할 수 없습니다.이 스크롤 보기를 관리하는 보기 컨트롤러에서 이 작업을 수행해야 합니다.
Boby_Wan의 대답은 저에게 생각을 하게 했고, 인터페이스 빌더에서 UIScrollView의 contentSize를 구성하기 위한 다음과 같은 솔루션을 찾았습니다.
- 다음을 선택합니다.
UIScrollView
- ID 검사기로 이동하여 새 사용자 정의 런타임 특성을 만듭니다(+ 단추 클릭).
- 키 경로 속성 변경 대상
contentSize
- Type 속성을 다음으로 변경합니다.
Size
- 이제 값을 {원하는 콘텐츠 너비, 원하는 콘텐츠 높이}(으)로 설정합니다.
예를 들어 값을 {320, 920}(으)로 설정하면 사용자는 iPhone에서 전체 추가 화면을 아래로 스크롤할 수 있습니다.
(xcode 4.3.3을 사용하고 있으며, 프로젝트의 iOS 배포 목표는 5.1입니다.)
처음 이 작업을 수행했을 때 다음 오류가 발생했습니다.
구성: 잘된구:
.3 하는 Size defined 속성 Xcode는 사용자 정의 런타임 속성입니다.
스토리보드.스토리보드.스토리보드
이 오류도 쉽게 해결할 수 있습니다. 프로젝트 탐색기에서 스토리보드를 선택하고 파일 검사기를 엽니다.인터페이스 작성기 문서 섹션을 찾거나 펼치면 개발을 위한 드롭다운이 있습니다.이 설정이 다음으로 설정되었는지 확인합니다.Xcode 4.3
을 사용하면 을 피할 수 있습니다.contentSize
대신 다음 제약 조건을 설정합니다.
- 스크롤 뷰의 맨 위에 맨 위 자식의 맨 위를 고정합니다.
- 그리고 가장 아래에 있는 아이의 바닥에 핀을 꽂습니다.
Interface Builder만 사용하여 이 작업을 수행할 수 있습니다. Identity Inspector(세 번째 검사자 탭)로 이동하고 다음을 사용하여 새 User Defined Runtime 특성을 추가합니다.
- 키 경로: 내용 크기
- 유형: 크기
- 값: {폭, 높이}
이제만방있습다니법이들을 만드는 이 있습니다.UIScrollView
스토리보드를 떠나지 않고 스크롤:
- 다음을 선택합니다.
UIScrollView
스토리보드에서 크기 검사기로 이동하여 내용 삽입 섹션의 아래쪽 값(또는 변경해야 하는 다른 값)을 내용 영역의 높이로 변경합니다. - 이제 Identity inspector(ID 검사기)로 이동하여 새 User Defined Runtime Attribute(+ 버튼을 클릭하여)를 만들고 이름을 지정합니다.
contentSize
입력하는 유형이나 값은 중요하지 않습니다(기본값을 그대로 둘 수도 있음).
이것은 다음을 만들 것입니다.UIScrollView
두 번째 단계가 왜 필요한지는 모르겠지만 제대로 작동합니다(우연히 알게 되었습니다). :(
제가 과거에 사용했던 한 가지 접근 방식은 인터페이스 빌더에서 스크롤 뷰를 포함하는 뷰 밖으로 끌어다 놓고 실제 크기를 contentSize로 설정하는 것입니다.
인터페이스 빌더에 대해 본질적으로 명확하지 않은 것은 니브에 저장된 연결되지 않은 뷰를 가질 수 있지만 니브가 주로 사용하는 메인 뷰의 일부는 아니라는 것입니다.
스크롤 보기를 저장할 보기에서 플레이스 홀더로 사용하는 단순 UIV 보기를 배치합니다.위치를 시각적으로 설계할 수 있습니다.전체 보기를 사용하는 경우 이 단계를 건너뛰고 이 답변의 끝에 있는 두 번째 코드 스니펫 i 공급을 사용할 수 있습니다.
그런 다음 스크롤 뷰를 컨트롤로 채우고 원하는 방식으로 시각적으로 배치할 수 있습니다. 플레이스홀더와 스크롤 뷰 속성을 모두 뷰 컨트롤러 내에 제공하여 런타임에 액세스할 수 있도록 합니다.
런타임에, in - (void)viewDidLoad
scrollView.contentSize = scrollView.frame.size;
scrollView.frame = placeholder.frame;
[placeholder.superview addSubView:scrollView];
[placeholder removeFromSuperview];
또는 (자리 표시자를 사용하지 않은 경우):
CGRect f = self.view.frame;
scrollView.contentSize = f.size;
f.origin.x = 0;
f.origin.y = 0;
scrollView.frame = f;
[self.view addSubView:scrollView];
마지막으로, 인터페이스 빌더에서 스크롤 뷰를 "잃어버린" 경우(스크롤 뷰를 닫아 디자인 그리드에서 사라질 수 있음) 당황하지 마십시오.디자인 그리드의 왼쪽에 있는 객체 목록에서 클릭하기만 하면 됩니다.
자동 레이아웃을 사용하는 Xcode 4.5에서는 크기 검사기에 내용 삽입 섹션이 없습니다.그래서 User Defined Runtime Attributes(사용자 정의 런타임 속성) 아래에 추가해야 했고 잘 작동했습니다.
"사용자 정의 런타임 특성"에서 추가하는 내용은 keyPath == 컨텐츠입니다."Rect" 유형(Rect와 입력이 동일한 UIEdgeInsets)이며 {top, left, {bottom, right}로 정의된 inset.contentSize는 스크롤 뷰 창의 영역만 정의합니다.내용물삽입은 스크롤 가능한 영역을 정의합니다.
저는 이것이 같은 상황에 있는 누군가에게 도움이 되기를 바랍니다.
위의 답변 중 상당수는 오해의 소지가 있거나 구식입니다.2017년 현재(아마도 훨씬 이전) 인터페이스 빌더는 자동으로 크기가 지정된 콘텐츠의 스크롤 뷰를 지원합니다.비결은 XCode가 스크롤 뷰와 그 안에 있는 콘텐츠 사이의 제약 조건에 특별하고 비표준적인 의미를 부여한다는 것입니다.이러한 "내부" 제약 조건은 실제로 예상되는 것처럼 내용의 크기에 영향을 미치지 않습니다.
즉, 스크롤 보기를 기본 보기의 맨 아래에 여백이 0인 상태로 고정하고 스크롤 보기의 콘텐츠를 여백이 0인 상태로 스크롤 보기의 맨 아래에 고정할 수 있지만 콘텐츠는 실제로 이로 인해 늘어나지 않습니다.대신 콘텐츠는 자체적으로 결정된 크기(아래쪽에 더 있음)를 갖게 되며, 스크롤 보기 내에서 스크롤 가능한 영역의 크기도 됩니다.
이렇게 생각합니다. 스크롤 뷰에 바인딩 제약 조건에 비대칭이 있습니다.스크롤 보기에서 "외부"(상위) 월드까지의 제약 조건에 따라 스크롤 보기의 크기와 위치가 평소와 같이 결정됩니다.그러나 스크롤 뷰의 "내부" 제약 조건은 내용에 바인딩함으로써 스크롤 뷰의 스크롤 가능 영역의 크기와 위치를 실제로 설정합니다.
제약 조건을 설정할 때 XCode는 항상 현재 간격을 제안하며 내부 및 외부 방향 제약 조건을 충돌하는 방식으로 의도적으로 변경하지 않을 수 있기 때문에 이는 전혀 분명하지 않습니다.그러나 위에서 설명한 의미를 가질 수 있습니다. 하나는 스크롤 보기 레이아웃을 제어하고 다른 하나는 스크롤 가능한 콘텐츠 영역 크기를 제어합니다.
저는 우연히 이것을 우연히 발견했고, 그것이 어떻게 작동하는 것처럼 보이는지를 본 후, 완전히 설명하고 이에 대한 Apple 문서 출처를 인용하는 이 기사로 저를 안내했습니다.
https://spin.atomicobject.com/2014/03/05/uiscrollview-autolayout-ios/
콘텐츠의 자체 결정 크기에 대한 마지막 중요한 정보:일반적으로 상위 보기의 너비와 같은 크기로 콘텐츠를 크기를 조정하기 때문에 여기서 catch-22에 있다고 느낄 수 있지만, 이 경우 상위 보기는 스크롤 보기이며 위에서 설명한 대로 제약 조건이 콘텐츠 크기에 영향을 미치지 않습니다.여기서 대답은 항목을 보기 계층에서 직접 인접하지 않은 항목으로 제한할 수 있다는 것입니다. 예를 들어 스크롤 보기를 사용하도록 시도하는 대신 내용 보기의 너비를 기본 보기의 너비를 설정할 수 있습니다.
Interface Builder에서 View Controller의 Properties 아이콘을 클릭하면 Simulated Metrics에서 "Freeform" 크기로 설정하고 기본 보기의 크기를 원하는 콘텐츠 크기로 변경할 수 있습니다.
이렇게 하면 ScrollView의 내용을 하나의 큰 보기처럼 만들 수 있습니다.이는 시뮬레이션된 메트릭일 뿐이므로 View Controller가 로드되면 창의 범위에 맞게 크기가 조정됩니다.
Interface Builder를 통해 UIScrollView를 설정하는 것은 직관적이지 않습니다.설정을 위한 체크리스트는 다음과 같습니다.
UIView 컨트롤러의 XIB 파일을 선택합니다.인터페이스 작성기의 "Identity Inspector"에서 UIView를 클래스 유형 UIScrollView로 변경합니다.
"파일 검사기"에서 자동 레이아웃 선택 취소
속성 검사기에서 크기를 자유 양식으로 변경합니다.그런 다음 스크롤 보기를 수동으로 확장하거나 "Size Inspector"에서 사용자 정의 너비와 높이를 지정할 수 있습니다.
"Identity Inspector"에서 "Size" 유형의 "contentSize"라는 새 사용자 정의 런타임 특성을 추가하고 {320, 1000}과(와) 같은 값으로 변경합니다.이 단계는 더 이상 프로그래밍 방식으로 설정할 수 없으므로 스크롤 보기에서 스크롤 보기의 내용이 창보다 크다는 것을 알 수 있도록 이 단계가 필요합니다.
스크롤 보기에서 autoLayout을 제거하기만 하면 됩니다.코드는 다음과 같이 간단합니다.
scrollviewName.contentSize = CGSizeMake(0, 650);
.h 파일에 iboulet 속성을 만들고 .m 파일에 합성하기만 하면 됩니다.스크롤이 활성화되었는지 확인합니다.
스토리보드에서 UIScrollView를 자동 레이아웃과 함께 사용할 수 있습니다.기본적으로 필요한 것은 다음과 같습니다.
- UIScrollView 추가
- 모든 제약 조건을 추가합니다(위, 왼쪽, 오른쪽, 아래 가장자리의 삽입 등).
- UIScrollView에 '컨테이너' UIView 추가
- 단방향 스크롤(예: 수직)만 사용하려면 높이(예: 600)를 명시적으로 설정하고 링크 너비를 UIScrollView 너비로 설정합니다.
- 양방향 스크롤을 원한다면 너비와 높이를 모두 설정하면 됩니다.
예, st3fan이 맞습니다. UIScrollView의 contentSize 속성을 설정해야 합니다.그러나 이를 위해 자동 레이아웃을 끄면 안 됩니다.코드 없이 IB에서만 자동 레이아웃으로 UIScrollView의 contentSize를 쉽게 설정할 수 있습니다.
자동 레이아웃 컨텐츠를 사용하는 경우 UIScrollView의 크기가 직접 설정되지 않은 경우에는 UIScrollView의 모든 하위 보기의 제약 조건을 기준으로 계산된다는 점을 이해하는 것이 중요합니다.그리고 필요한 것은 양방향에 대한 하위 뷰에 대한 적절한 제약 조건을 제공하는 것입니다.
예를 들어, 하위 뷰가 하나만 있는 경우 위와 아래에서 수퍼뷰(즉, 우리의 경우 보기 스크롤) 컨텐츠 크기까지 높이와 공간을 설정할 수 있습니다.높이는 합계로 계산됩니다.
Vertical Space (aSubview.top to Superview.top) + aSubview.height + Vertical Space (aSubview.top to Superview.top)
contentSize.너비는 수평 제약 조건에서 유사하게 계산됩니다.
내용을 계산할 제약 조건이 너무 적은 경우 레이아웃 모호성에 대해 알리기 위해 View Controller Scene 항목 근처에 작은 빨간색 버튼이 표시됩니다.
많은 하위 뷰가 있는 경우 Danyal Aytekin 답변처럼 최상위 하위 뷰, 하위 뷰 사이의 높이와 공백, 하위 뷰에서 하위 뷰 사이의 "체인"일 수 있습니다.
그러나 대부분의 경우 필요한 크기의 빈 보기를 추가하고 스크롤 보기의 위쪽, 왼쪽, 아래쪽, 오른쪽에 공간을 0으로 설정하는 것이 더 편리합니다.이 보기를 "내용 보기"로 사용할 수 있습니다. 즉, 다른 모든 하위 보기를 배치하거나, 이미 많은 하위 보기를 가지고 있으며 이 보기를 이동하고 레이아웃을 다시 설정하지 않으려는 경우 이 보조 보기를 기존 하위 보기에 추가하여 숨길 수 있습니다.
스크롤 보기를 스크롤할 수 있도록 하려면 계산된 내용 크기가 스크롤 보기 크기보다 커야 합니다.
여기 Storyboard에서 전체 화면보다 큰 콘텐츠로 ScrollView를 설계하는 솔루션이 있습니다(음, 거의 전체적으로, 코드 한 줄도 추가해야 합니다).
https://stackoverflow.com/a/19476991/1869369
제가 좀 더 편리한 방법을 알아보겠습니다.
UI를 합니다.1: 스크롤 의 크기를 조정합니다.
2: 스크롤 보기의 iboutlet을 추가합니다.
3: viewDidLoad 파일은 frame.size 파일입니다.
=예: _scrollSize = _scrollView.frame.size;)
를 이전에합니다.4: will Appear " contentSize " 뷰 서 " 에 " 저 " 한 " 로 CGSize " 합 " 니 " 를 " 다 " 장 " 정 " 설 "
=예: _scrollView.contentSize = _scrollSize;)
5: 됐습니다.
- UIView 컨트롤러 추가
- UIView 컨트롤러의 '속성 검사기 -> 시뮬레이션된 메트릭' 설정 크기 자유 형식
- UIViewController에서 'Size Inspector -> ViewController'에서 높이 설정 800
- UIViewController에서 UIScrollView
- 모든 구속조건을 UIScrollView(위, 왼쪽, 오른쪽, 아래)에 추가하고 선형 X = 중심 추가
- UIScrollView에서 UIView 추가
- 모든 구속조건을 UIView(위, 왼쪽, 오른쪽, 아래)에 추가하고 선형 X = 중심을 추가합니다.예, #3의 UIScrollView와 동일하지만 UIView의 경우
- UIView에 높이 제약 조건을 추가합니다.예를 들어 780
- 달려.
새 Xcode 프로젝트 만들기
Main.storyboard 파일로 이동합니다.
개체 라이브러리에서 ScrollView를 선택합니다.
ScrollView의 프레임을 설정합니다.
스크롤 보기에 다른 보기를 추가하고 프레임을 ScrollView의 프레임과 동일하게 유지합니다.
이제 높이와 너비를 동적으로 설정하려면 XIB에서 자동 레이아웃을 사용하여 AUIScrollView를 구성할 수 있습니다.
코드에서 "contentSize" 속성을 설정하지 않고 인터페이스 작성기에서 완전히 수행할 수 있습니다.
- 스크롤 보기에 하나의 보기만 배치합니다.스크롤 보기에는 이 하위 보기만 있어야 합니다.내용 보기로 이름을 지정할 수 있습니다.그리고 나중에 모든 내용을 이 보기 안에 넣습니다.
- 이 보기의 네 모서리를 0으로 스크롤 보기(보기의 수퍼뷰)에 맞춥니다.
- 이 보기의 너비와 높이를 설정합니다.너비와 높이는 스크롤 보기의 "내용 크기"로 암시적으로 처리됩니다.
간단히 말해, 이 보기의 너비와 높이는 스크롤 보기의 "내용 크기"를 정의합니다.이 보기는 스크롤 보기의 유일한 내용이므로, 이 보기의 크기는 스크롤 보기의 내용 크기입니다.그것은 꽤 합리적입니다.
저는 이 튜토리얼에서 배웠습니다: https://riptutorial.com/ios/example/12812/scrolling-content-with-auto-layout-enabled
언급URL : https://stackoverflow.com/questions/1135163/how-do-i-use-uiscrollview-in-interface-builder
'programing' 카테고리의 다른 글
CSS 클래스 .foo.bar (공백 없음)과 .foo.bar(공백 있음)의 차이점은 무엇입니까? (0) | 2023.08.31 |
---|---|
PowerShell에서 변수가 8자 이상인지 테스트하려면 어떻게 해야 합니까? (0) | 2023.08.31 |
CSS3 투명도 + 구배 (0) | 2023.08.26 |
자바스크립트에서 "$" 기호의 의미는 무엇입니까? (0) | 2023.08.26 |
jQuery를 사용하여 쿠키를 30분 안에 만료하는 방법은 무엇입니까? (0) | 2023.08.26 |