2013-10-13 4 views
0

저는 IOS 개발을 가르치고 있으며, 제가하려고하는 내용 중 하나에 문제가 있습니다. 기본적으로 필자는 표시 할 사진 목록을 가지고 있으므로 목록보기로 표보기를 만들었고 목표는 셀을 클릭하고 화면 크기에 맞게 그림을 자동 표시하는 것입니다. 나는 스스로를 관리하는 법을 배울 수 있도록 ARC를 꺼 놓았다.scrollView 경계 크기는 항상 0입니다.

테이블 뷰에서 셀을 선택하면 스크롤 뷰와 이미지 뷰가있는 UIViewController가 호출됩니다.

storyboard snapshot

내가 콘센트에 연결하는 방법입니다 : 내가 필요

- (void) viewWillAppear:(BOOL)animated{ 

[super viewWillAppear:animated]; 

[self.scrollView setZoomScale:1 animated:NO]; 
CGSize boundsSize = self.scrollView.bounds.size; 
NSLog(@"@@@AMRO scrollboundsSize is width %f and height %f", boundsSize.width, 
boundsSize.height); 

: 방법 viewWillAppear에서 PhotoViewController의 구현에서

How the outlets are connected

을,이 코드를 작성 boundsSize 내 그림을 확대하는 방법을 파악하는 데 도움이됩니다. 문제는 항상 0을 읽는다는 것입니다. 스토리 보드를 기준으로 볼 때 boundsSize는 320x455입니다. 분명히 나는 ​​그것을 하드 코딩하고 싶지 않다. 그 PhotoViewController의 내 .H에서

, 나는 정의 : ViewWillAppear, 나는 이렇게하면

@property (strong, nonatomic) IBOutlet UIImageView *imageView; 
@property (strong, nonatomic) IBOutlet UIScrollView *scrollView; 

이제 :

그런 다음
CGRect fullScreenRect=[[UIScreen mainScreen] applicationFrame]; 
self.scrollView=[[UIScrollView alloc] initWithFrame:fullScreenRect]; 

나는 경계를 정의 할 수 있지만, 크기가 오프, 폭 320.000000, 높이 548.000000. 548의 높이는 제목 막대와 탭 막대가 하단에 포함되어 있기 때문일 수 있습니다. 나에게 맞는 경계를 올바르게 설정하는 방법은 스토리 보드에 표시된 것처럼 320x455입니다. 나는 같은 일을하는 사람들의 다른 코드 스 니펫을 살펴 봤는데 ARC가 ON이고 자동으로 관리되는 것이기 때문에 scrollView를 할당하지도 않는다. 나는이 방법을 사용하는 경우

, 그럼 내가있는 ScrollView가 초기화 결코 한 예를 보았다 아직 그들이 경계가

CGRect viewBounds = self.view.bounds; 
self.scrollView=[[UIScrollView alloc] initWithFrame:viewBounds]; 

답변

3

시도 올바르게 설정 한, 나는 올바른 크기를받을 수 있나요, 그러나 이것은 올바른 방법입니다 viewDidAppear 메서드를 사용하여 viewWillAppear 대신 경계 및 다른 크기를 가져옵니다.

viewWillAppear이 실행될 때 스크롤 뷰 경계가 초기화되지 않을 수 있습니다.

+0

재미있는 피드백, 나는 처음에있는 viewDidLoad에서 코드를했고로 이동하기로 결정 viewDidLayoutSubviews에 배치 할 수 나중에 호출되는 viewWillAppear. 이제 viewDidAppear 시도, 올바른 바운드 크기를 가져 오는 중이지만 이미지를 더 이상, 모든 검정 표시되지 않습니다. –

+0

너무 빨리 말했고, 끝에서 self.view = self.scrollView를 제거하고 해결했습니다. –

+0

호기심에서 viewWillAppear을 사용하는 다른 구현 예제를 보았습니다. 그 이유는 무엇입니까? 경계가 그때까지 정해진 채로 시스템 타이밍이 발생했다면 될 수 있습니까? –

1

당신이보기가 화면에 나타납니다 전에 구조 관련 코드 를 실행해야하는 경우

@interface CustomViewController() 

@property (nonatomic) BOOL isFirstTimeViewDidLayoutSubviews; // variable name could be re-factored 

@end 

@implementation CustomViewController 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    self.isFirstTimeViewDidLayoutSubviews = YES; 
} 

- (void)viewDidLayoutSubviews 
{ 
    // only after layoutSubviews executes for subviews, do constraints and frames agree (WWDC 2012 video "Best Practices for Mastering Auto Layout") 

    if (self.isFirstTimeViewDidLayoutSubviews) { 

     // execute geometry-related code... 
    } 

    self.isFirstTimeViewDidLayoutSubviews = NO; 
} 
+0

고마워, 그거 좋은 생각이야. 지금은 viewDidAppear을 제거하고 있습니다. –

관련 문제