Как сохранить фрейм 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, чтобы добавить необходимый пробел.