2012-10-17 2 views
1

세로 방향으로 iPad xib가있는 UIViewController가 있습니다. 내 iPad가 가로 방향 일 때 해당 뷰 컨트롤러를 내 UISplitViewController의 세부 정보 창에 배치하면 크기에 맞게 자동으로 크기가 조정됩니다.UIScrollView 컨텐트를 변경해야합니다. 세로 xib가 가로로 조정될 때 크기 지정

그러나 -viewDidLoad에서 내보기를 구성 할 때보기의 최종 크기는 아직 가로 방향/크기가 아닙니다.

UIViewController가 이미 가로로로드 될 때 -didRotateFromInterfaceOrientation : 메서드와 그와 연결된 다른 메서드가 호출되지 않기 때문에 스크롤 뷰의 contentSize와 내용을 언제 어디서 올바르게 설정할 수 있습니까?

나는 단지 내 스크롤 뷰 세로로 스크롤 할, 그래서있는 ScrollView 안에 내있는 contentView 다시 맞게되는가에 어떤 방향으로 뷰 컨트롤러의 폭에 있는지 확인하려면.

상관없이 내가 뭘 확인하는지 .frame 또는 .bounds 내 뷰, 내 스크롤보기 또는 심지어 내 SplitViewController 세부 뷰 컨트롤러 내 실제 크기를 보여줘. 가로 방향으로 UISplitViewController를 사용하면 왼쪽이 320 픽셀이므로 너비가 704 픽셀을 넘지 않아야합니다.하지만 프레임과 내 뷰 및 스크롤 뷰의 경계를 확인할 때마다 768 픽셀 폭으로보고됩니다. 이는 올바르지 않습니다.

스크롤 표시기를 올바르게 볼 수 있기 때문에 내 scrollview는 704px 크기로 명확합니다.

무엇이 누락 되었습니까? 당신이 자동 크기 마스크를 확인 회전 할 때 크기를 조정보기를 얻을하지 않으려면

여기, -viewDidLoad 내 코드 ... 모든

CGSize textSize = [self.purchase.textDescription sizeWithFont:self.labelTextDescription.font constrainedToSize:allowedSize lineBreakMode:UILineBreakModeWordWrap]; 

CGRect textFrame = self.labelTextDescription.frame; 
textFrame.size.height = textSize.height; 
self.labelTextDescription.frame = textFrame; 

CGRect contentFrame = self.contentView.frame; 
contentFrame.size.height += textSize.height; 

if (contentFrame.size.width > self.scrollView.frame.size.width) { 
    contentFrame.size.width = self.scrollView.frame.size.width; 
} 

self.contentView.frame = contentFrame; 

[self.scrollView addSubview:self.contentView]; 
self.scrollView.contentSize = self.contentView.frame.size; 
+0

콘텐츠 크기를 설정 한 코드를 게시 할 수 있습니까? viewDidLoad에 있습니까? – atxe

+0

예, viewDidLoad에서 코드를 추가했습니다. –

+0

회전 할 때 UIScrollView의 콘텐츠 크기가 실제로 변경됩니까? 내용이 같고 크기가 같지 않습니까? – atxe

답변

5

귀하의 의견을 배치하고 스크롤 뷰의 contentSize이 실행 루프의 레이아웃 단계입니다 설정하는 적절한 시간입니다. 이 단계에서 UIKit은 layoutSubviews 메시지를 레이아웃이 필요하다고 표시되어 있고 창에있는보기로 보냅니다. 보기는 창 계층 구조에 처음 추가 될 때, 새로운 하위보기가 제공 될 때 및 크기가 변경 될 때를 포함하여 다양한 일이 발생할 때 레이아웃이 필요하다는 것으로 자동 표시됩니다. setNeedsLayout 메시지를 보내서보기를 필요로하는 레이아웃으로 수동으로 표시 할 수도 있습니다.도면은 layoutSubviews 메시지를 수신 할 때에는

는 UIKit 이미 필요 뷰의 조상 (까지 그 수퍼 등) 중 어느 layoutSubviews 보냈으며, 이는 이미 프레임의 자동 크기 마스크 또는 자동 배치에 기초하여 조정했다 제약 조건 및 자체 하위 뷰 프레임은 자체 자동 마스크 또는 자동 레이아웃 제약 조건에 따라 이미 조정되었습니다.

self.view이 이미 UIView의 맞춤 하위 클래스 인 경우 가장 좋은 방법은 해당 클래스에서 layoutSubviews을 재정의하는 것입니다. 거기에 레이아웃 코드를 입력하고 스크롤보기의 contentSize을 설정하십시오.

맞춤 하위 클래스를 사용하지 않으려는 경우 만들고 싶지 않은 경우 배포 대상이 iOS 5.0 이상인 경우보기 컨트롤러의 viewWillLayoutSubviews 또는 viewDidLayoutSubviews 메소드에서 레이아웃을 수행 할 수 있습니다. . 이 메시지가 언제 보내지는지 짐작할 수 있습니다. 자동 회전시 :

, 이러한 메시지 (layoutSubviews, viewWillLayoutSubviewsviewDidLayoutSubviews) 모두가 자동 회전의 애니메이션 블록 내부 전송, 그래서 이러한 방법 중 하나를 사용하여 레이아웃을 할 경우, 당신은 또한 혜택을받을되는 변화에 레이아웃은 자동 회전 애니메이션 중에 애니메이션이 적용됩니다.

+0

-viewDidLayoutSubviews는 완벽하게 들리지만 iOS4.3을 지원해야합니다. iOS4에 대한 제안 사항이 있습니까? 사용자 지정보기를 사용하고 있지 않습니다. –

+0

나는'UIView'의 서브 클래스를 만들고'layoutSubviews'를 구현할 것입니다. –

+0

내보기 컨트롤러의 실제 크기를 확인할 수있는 방법이 있어야합니다. –

0

처음이다. 당신은 인터페이스 빌더에서 뷰를 내장 경우는 수퍼 그렇게되면 그 크기의 변화 아니에요 확인 :

Sizing properties of a view

당신은 self.interfaceOrientationUIViewController의 현재 인터페이스 방향을 확인할 수 있습니다. 이 설정은 수동으로 설정하려는 경우에 도움이 될 수 있습니다. 당신이 수동으로 크기를 조정하기 전에 (또는 이후) 귀하의 의견에 원하는 프레임을 설정해야하는 경우

또한, 회전이 수행됩니다

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration; 
- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation; 
0

내가 얻을 쿼리를 상태 표시 줄의 방향을 추천 할 것입니다 현재 회전은 viewDidLoad입니다. 까다로워지는 경향이 있으므로 스크롤보기에 자동 크기 조정을 사용하지 않는 것이 좋습니다. 상태 표시 줄을 기준으로 비율에 비례하여 크기를 확인하십시오.

[UIApplication sharedApplication].statusBarOrientation

관련 문제