2009-03-15 5 views
3

방금 ​​objective-C와 iphone SDK를 배우기 시작했고, 누군가가 도움을 줄 수 있기를 바랍니다. 다음의 차이가 무엇컨트롤러의 뷰를 직접 설정하고 뷰를 서브 뷰로 추가하는 것의 차이점

: 예를 들어

self.view = someView; 

[self.view addSubView: someView]; 

말, 우리는 하나의 컨트롤러와 하나 개의 컨테이너보기를 가지고 간단한 응용 프로그램에서는 (몇 가지가 있습니다 이미지 하위보기). 두 문장의 차이점은 무엇입니까?

if (self = [super initWithFrame:CGRectZero]) 
{ 
//adds some images as subviews here 
} 

내가 initWithFrame 그것을 이해로서 : 나는 몇 가지 예제 코드에 주변에 땜질하고 있었고, 난이 뷰가과 같이 파단로 이미지로 초기화되는 것을 알게되었다 때문에 내가 부탁 해요 이유는 CGRectZero를, 만듭니다 크기가 [0,0,0,0] 인 프레임 (본질적으로 보이지 않음). 내가 직접

self.view = someView; 

와보기를 설정

나는보기가 실제로 이미지를 표시합니다 알 수 있습니다. 그러나 컨트롤러의 '기본'보기의 하위보기로보기를 추가 할 때보기가 추가되지 않습니다. 그래서 기본적으로 제 질문은, 장면 뒤에서 무슨 일이 일어나고있는가요? 첫 번째 방법은 프레임 크기를 "크기 조정"하고 두 번째 방법은 같은 작업을 수행하지 않는 이유는 무엇입니까?

답변

9

iPhone의 화면에는 거의 항상 계층 구조가 표시됩니다.

Mail에서받은 편지함을 살펴보면 여러 가지보기가 나타납니다. 크게보기가 있습니다. [1] 그 안에는 탐색 모음보기, 표보기 및 도구 모음보기가 있습니다. 탐색 모음보기에는 각면에 단추보기가 있으며 중간에 레이블보기가 있습니다. 테이블보기 안에는 일련의 표 셀보기가 있으며 각 셀에는 여러 개의 레이블보기가 있습니다. 도구 모음에는 다섯 개의 단추보기가 있습니다. 나는 더 멀리 가서 그 버튼 안의 플레이에 대해 이야기 할 수 있지만, 당신이 그 아이디어를 얻었을 것이라고 확신합니다.

주어진보기 위의보기는 수퍼 뷰입니다. 그것 밑에 전망은 그것의 subviews이다. 그래서 테이블 셀 뷰는 슈퍼 뷰로서 테이블 뷰를 가지며, 서브 뷰로서 라벨 뷰를 가지고 있습니다. 상위 뷰는 그 안의 다른 모든 뷰를 루트 뷰라고합니다.

각보기에는 자체 그리기 화면이 있습니다. 그 그림 표면에 의해 형성된 직사각형을 프레임이라고합니다. 뷰의 프레임은 해당 뷰를 포함하는 프레임에 상대적입니다. 따라서 테이블 셀의 레이블 하위 뷰 중 하나가 (0,0)에 프레임이 있으면 셀이 화면의 중간에있는 경우에도 테이블 셀의 왼쪽 위 모서리에 있음을 의미합니다.

뷰 컨트롤러를 쓰고있을 때 self.view은 제가 앞서 언급 한 루트 뷰입니다. 다른 모든보기는 해당보기의 하위보기 (또는 하위보기의 하위보기 등)입니다. 보기 컨트롤러의 기능 중 하나는 화면에 맞게 자동으로 self.view의 크기를 조정한다는 것입니다. (전화 통화 도중 사용할 수있는 영역은 작아집니다 : 상태 표시 줄은 두 배나 높기 때문에 앱 공간이 줄어들며,보기 컨트롤러가 탐색 컨트롤러 또는 탭으로 관리되는 경우 더 작아집니다 그러나 그것은 다른 이야기입니다.)하지만 루트보기의 크기를 조정한다고해서 루트보기의 하위보기의 크기가 자동으로 조정되는 것은 아닙니다.

someView.autoresizingMask = UIViewAutoresizingFlexibleWidth 
          | UIViewAutoresizingFlexibleHeight; 

(인터페이스 빌더에서 자동 크기 마스크를 설정하기위한 그래픽 방법이있다 : 당신이 그들의 자동 크기 마스크 (의 수퍼 변경 크기가 때 반응하는 방법을보기를 알려주는 속성)를 설정해야합니다 것을해야 할 일 - 검사기 창에서 눈금자 아이콘을 클릭하고 "자동 크기 조정"섹션을보십시오.

이 시작하기에 적합하지 않은 경우에도 그렇습니다. 이 모든 루트보기 당신을 위해 않는다는 것을 만지작해야 할 경우

someView.frame = CGRectMake(
          0, // all the way to the left 
          0, // all the way at the top 
          self.view.frame.size.width, // same width as the root view 
          self.view.frame.size.height, // same height too 
          ); 

은 왜 당신이 이제까지 파단을 사용 : 당신이 self.view의 하위 뷰로 추가하기 전에 그렇게하려면 해당 프레임을 조정? 단순함 : 단 하나의 루트보기 만 가질 수 있지만 하나의보기는 필요한 것을하기에 충분하지 않습니다. 실제로 하나의 뷰 만 필요하다면 루트 뷰로 설정하고 즐거운 방법으로 진행할 수 있지만 가능성은 그보다 더 복잡합니다.

[1] 여기서 약간 단순화하고 있지만, 지금은 괜찮습니다.

+0

설명해 주셔서 감사합니다! –

0

보기 컨트롤러 "보기"속성을 설정하면 관리중인보기 만 변경됩니다.

보기를 다른보기의 하위보기로 추가하면 실제로 다른보기 아래에 하위보기가 추가됩니다.

이들은보기 컨트롤러를 조정하고 다른 하나는보기 계층 구조를 변경하므로 매우 다른 것입니다.

추측 하듯이 첫 번째 방법으로 보지 못한 이유는 추가하려는 하위보기의 프레임이 CGRectZero (0 크기)입니다.

1

보기를 하위보기로 추가 할 때 실제로 기존보기에 추가하고 있는지 확인해야합니다.

self.view = view은 컨트롤러의보기를 설정합니다. 컨트롤러가 표시 할 뷰가 없으므로 코드가 없거나 XIB로 완료되지 않으면 아무 것도 볼 수 없습니다.

[self.view addSubView: someView]은 self.view가 이미 설정되어 있다고 가정합니다. 그렇지 않은 경우 someview을 하위보기로 nil으로 추가하면 절대 표시되지 않습니다.

기본적으로는 self.view을 큰 컨테이너로 생각하고 모든 하위보기는 내부에있는 조각입니다. 하위보기가 필요하지 않으면 self.view을 UIImageView 또는 UIWebView로 설정하는 것이 좋습니다. 의 경우에 하위 뷰가 필요하면 빈 뷰가 필요합니다.

귀하의 경우, self.view이 설정되지 않았으며 이미지보기를 nil에 추가하고 있습니다.

+0

나는 그것도 생각했지만 내 이해는 당신이 UIViewController를 초기화 할 때보기가 자동으로 생성된다는 것입니다. 저는 이것이 UITableViewController의 경우라는 것을 알고 있습니다. –

+0

네, 이것도 제가 이해 한 것입니다. 그래서 self.view (그것의 nil 경우)는 loadView를 호출 할 것이고, 기본 loadview는 뷰를 생성 할 것이다. – WillF

+0

XIB를 사용하지 않는 경우 직접보기를 만들어야합니다. 이 작업은 loadView에서 수행합니다. – August

관련 문제