[ios] Interface Builder에서 UIScrollView를 어떻게 사용합니까?

UIScrollView과거에는 프로그래밍 방식으로 조작하여 성공적으로 사용했지만 Interface Builder에서 독점적으로 설정하여 작동시키는 데 어려움이 있습니다.

내 iPhone 앱에 간단한 “정보”페이지가 있습니다. 그것은이 UITextView내 다른 애플 리케이션에 일부 아이콘 및 링크를. 이 모든 뷰를 내에 추가 UIScrollView하여 전체 크기가 480 이상이되도록 정렬했습니다. 내 앱을 시작하면 스크롤 뷰 는 화면에 맞는 콘텐츠 만 표시하고 스크롤은 없습니다.

IB를 통해이 작업을 완전히 수행 할 수 있습니까? 아니면 코드를 통해 contentSize를 조작해야합니까?



답변

UIScrollView의 contentSize 속성을 설정하는 것을 잊었습니다. 이상하게도 Interface Builder에서 이것을 할 수 없습니다. 이 스크롤 뷰를 관리하는 뷰 컨트롤러에서 수행해야합니다.


답변

Boby_Wan의 대답으로 생각하고 인터페이스 빌더에서 UIScrollView의 contentSize를 구성하는 다음 솔루션을 찾았습니다.

  1. UIScrollView스토리 보드 장면에서 선택
  2. Identity inspector로 이동하여 새 사용자 정의 런타임 속성을 만듭니다 (+ 버튼 클릭).
  3. 속성 키 경로 를 다음으로 변경하십시오.contentSize
  4. 속성 유형 을 다음으로 변경하십시오.Size
  5. 이제 을 { 원하는 콘텐츠 너비 , 원하는 콘텐츠 높이 }로 설정합니다.

예를 들어 값을 {320, 920}으로 설정하면 사용자가 iPhone에서 전체 추가 화면을 아래로 스크롤 할 수 있습니다.

(xcode 4.3.3을 사용하고 있으며 프로젝트의 iOS 배포 대상 은 5.1입니다.)

처음이 작업을 수행했을 때 다음 오류가 발생했습니다.

잘못된 구성 :
     4.3
     MainStoryboard.storyboard 이전의 Xcode 버전을 사용하는 크기 유형 사용자 정의 런타임 속성

이 오류가 발생하면 간단하게 수정할 수 있습니다. 프로젝트 네비게이터 에서 스토리 보드를 선택 하고 파일 관리자를 불러옵니다 . Interface Builder Document 섹션을 찾아 확장하면 Development에 대한 드롭 다운이 있습니다. 다음으로 설정되어 있는지 확인하십시오.Xcode 4.3


답변

자동 레이아웃 (iOS6 +)을 사용하면 contentSize. 대신 다음 제약 조건을 설정하십시오.

  1. 스크롤 뷰의 상단을 최상위 자식 상단에 고정합니다.
  2. 그리고 바닥을 최하위 아이의 바닥에 고정하십시오.


답변

Interface Builder 만 사용하여 수행 할 수 있으며, Identity Inspector (세 번째 검사기 탭)로 이동하여 다음을 사용하여 새 사용자 정의 런타임 속성을 추가 할 수 있습니다.

  • 키 경로 : contentSize
  • 유형 : 크기
  • 값 : {너비, 높이}


답변

이제 스토리 보드UIScrollView 를 떠나지 않고 스크롤 을 만드는 방법이 있습니다 .

  1. 을 선택하십시오 UIScrollView스토리 보드에서 이동 크기 관리자 와 변경 하단 의 값 (또는 당신이 무엇을 변경해야하는 다른 값) 내용 인 세트 컨텐츠 영역의 높이에 절을 참조하십시오.
  2. 이제 Identity inspector 로 이동하여 새 사용자 정의 런타임 속성 (+ 버튼 클릭)을 만들고 이름을 contentSize. 입력 하는 유형 또는 은 중요하지 않습니다 (기본값을 그대로 둘 수도 있음).

이것은 만들 것입니다 UIScrollView두 번째 단계가 필요한 이유는 모르겠지만, 제대로 일을 (나는 우연히 발견). 🙁


답변

내가 과거에 사용한 한 가지 접근 방식은 인터페이스 빌더의 뷰를 포함하는 스크롤 뷰를 드래그하여 실제 크기를 contentSize로 설정하는 것입니다.

인터페이스 빌더에 대해 본질적으로 분명하지 않은 것은 펜촉에 저장되어 있지만 펜촉이 주로 사용하는 메인 뷰의 일부가 아닌 관련되지 않은 뷰를 가질 수 있다는 것입니다.

scrollview를 원하는 뷰에 자리 표시 자로 사용하는 간단한 UIView를 배치하십시오. (이것은 단순히 위치를 시각적으로 디자인 할 수 있도록하기위한 것입니다. 전체보기를 사용하는 경우이 단계를 건너 뛰고이 답변의 끝에있는 두 번째 코드 스 니펫을 사용할 수 있습니다).

그런 다음 스크롤 뷰를 컨트롤로 채우고 원하는 방식으로 시각적으로 배치 할 수 있습니다. 뷰 컨트롤러 내부에 자리 표시 자와 scrollview 속성을 모두 제공하여 런타임에 액세스 할 수 있도록합니다.

런타임에-(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];

마지막으로 인터페이스 빌더에서 스크롤 뷰를 “잃어버린”경우 (디자인 그리드에서 사라지도록 닫을 수 있음) 당황하지 마십시오. 디자인 그리드의 왼쪽에있는 개체 목록에서 클릭하면됩니다.


답변

Autolayout을 사용하는 Xcode 4.5에서는 크기 검사기에 Content Insets 섹션이 없습니다. 그래서 User Defined Runtime Attributes 아래에 추가해야했는데 제대로 작동했습니다.

“사용자 정의 런타임 속성”에 추가하는 것은 “Rect”유형 (Rect와 동일한 입력을 갖는 UIEdgeInsets)이고 {top, left}, {bottom, right}로 정의되는 keyPath == contentInset입니다. contentSize는 scrollview 창의 영역 만 정의합니다. contentInset은 스크롤 가능 영역을 정의합니다.

나는 이것이 같은 상황에있는 누군가에게 도움이되기를 바랍니다.