UIViewController viewDidLayoutSubviews
Мне трудно понять, почему Эрика Садун делает следующее (вызывая viewDidAppear в viewDidLayoutSubviews) в своем примере кулинарной книги Ch07-11. Возможно, два метода должны вызывать другой метод?
Смотрите: https://github.com/erica/iOS-5-Cookbook/tree/master/C07
- (void) viewDidAppear:(BOOL)animated
{
scrollView.frame = self.view.bounds;
scrollView.center = CGRectGetCenter(self.view.bounds);
if (imageView.image)
{
float scalex = scrollView.frame.size.width / imageView.image.size.width;
float scaley = scrollView.frame.size.height / imageView.image.size.height;
scrollView.zoomScale = MIN(scalex, scaley);
scrollView.minimumZoomScale = MIN(scalex, scaley);
}
}
- (void) viewDidLayoutSubviews
{
[self viewDidAppear:NO];
}
Есть идеи почему?
2 ответа
Это просто кажется мне неправильным. Пусть UIKit обрабатывает, когда эти методы вызываются.
Сделайте это вместо этого:
- (void) viewDidAppear: (BOOL) animated { [super viewDidAppear: animated]; // Всегда вызывайте супер с этим!!! [self doSomeCustomLayoutStuff]; // На самом деле я не думаю, что это необходимо. viewWillLayoutSubviews предназначен для размещения подпредставлений и вызывается автоматически в iOS 5 и более поздних версиях. } - (void)viewWillLayoutSubviews { [super viewWillLayoutSubviews]; [self doSomeCustomLayoutStuff]; } - (void)doSomeCustomLayoutStuff { scrollView.frame = self.view.bounds; scrollView.center = CGRectGetCenter(self.view.bounds); if (imageView.image) { float scalex = scrollView.frame.size.width / imageView.image.size.width; float scaley = scrollView.frame.size.height / imageView.image.size.height; scrollView.zoomScale = MIN(scalex, scaley); scrollView.minimumZoomScale = MIN(scalex, scaley); } }
Потому что макет srollView в viewDidLayoutSubviews изменит scrollView, который вы установили. Затем прокрутка scrollView должна получить небольшие заикания.