Как мне сохранить фрейм UIScrollView при входе на передний план? - PullRequest
2 голосов
/ 26 ноября 2011

В этом вопросе обсуждается, как создать промежутки между представлениями в 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 ]

1 голос
/ 30 декабря 2011

Я решил эту проблему, сделав 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];
0 голосов
/ 26 ноября 2011

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

...