Как сохранить фрейм UIScrollView при входе на передний план?

Этот вопрос обсуждает, как создать промежутки между представлениями в UIScrollView. Согласованный метод заключается в увеличении ширины фрейма UIScrollView для создания промежутков между представлениями, которые будут прокручиваться в прошлом. Однако, когда представление прокрутки является подпредставлением UINavigationController, возникает проблема. UINavigationController изменяет фрейм UIScrollView после того, как он был установлен в -viewDidLoad, Предложенное решение состоит в том, чтобы изменить размер кадра в -viewDidAppearВ этот момент UINavigationController закончил что-то менять, и изменения останутся.

- (void)viewDidAppear:(BOOL)animated {
    CGRect frame = self.view.frame;
    frame.size.width += 20; // This gives a 20px gap width
    self.view.frame = frame;
}

Я использовал это в своем приложении, и оно работало нормально, но у меня возникают проблемы, когда приложение отправляется в фоновый режим, а затем восстанавливается. Кажется, что UINavigationController снова меняет кадр, сбрасывая его на ширину по умолчанию, но на этот раз -viewDidAppear не называется и поэтому изменение никогда не производится. Я пытался зарегистрироваться для UIApplicationWillEnterForegroundNotification а также UIApplicationDidBecomeActiveNotification но оба они, кажется, происходят до того, как UINavigationController что-то изменит, поэтому изменение фрейма в этот момент не имеет никакого эффекта.

В какой момент я должен попытаться изменить размер кадра таким образом, чтобы он прилипал, или я могу как-то предотвратить UINavigationController от изменения кадра в первую очередь?

РЕДАКТИРОВАТЬ:

Таким образом, я подкласс UIScrollView и обнаружил, что метод с именем [UIViewControllerWrapperView setFrame:] вызывается который в свою очередь вызывает мой подкласс -setFrame: способ установить размер кадра. Я не знаю что UIViewControllerWrapperView есть или делает, и я не уверен, что будет возможно прыгнуть после того, как он сделал свое дело и правильно установить размер кадра. Я буду продолжать расследование.

2 ответа

Решение

Я решил эту проблему, сделав UIScrollView подпредставлением представления моего View Controller. В результате UINavigationController оставляет UIScrollView в покое, и кадр сохраняется. Это также имело дополнительное преимущество, позволяя мне применять отступы в том же методе, который я использовал для настройки вида прокрутки, а не позже. -viewDidLoad,

Итак, в заключение, я сделал это:

CGRect frame = CGRectMake(0, 0, 320, 460);
scrollView = [[UIScrollView alloc] initWithFrame:frame];

// I do some things with frame here

CGRect f = scrollView.frame;
f.size.width += PADDING; // PADDING is defined as 20 elsewhere
scrollView.frame = f;

[self.view addSubview:scrollView];

Попробуйте сделать это в viewDidLayoutSubviews. Если это не сработает, я бы создал подкласс UIScrollView и переопределил setFrame, чтобы добавить необходимый пробел.

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