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 должна получить небольшие заикания.

Другие вопросы по тегам