Используйте кнопку destinationViewController в пользовательском переходе

Моя цель состоит в том, чтобы сделать пользовательский переход с пользовательской анимацией следующим образом: я хочу, чтобы переход покрывал кнопку из sourceViewController кнопкой из целевогоViewController с эффектом, аналогичным эффекту нажатия навигационного контроллера, т. е. предполагается, что новая кнопка нажмите старую кнопку справа налево.

Мне удалось убрать старую кнопку (из sourceViewController) по желанию:

[UIView animateWithDuration:1.0 animations:^{
        // set the target frame for animated view
        sourceViewController.optionsButton.frame = leftButtonTargetFrame;
    } completion:^(BOOL finished) {
        [navigationController pushViewController:destinationViewController animated:NO];
        // reset the button's frame back to its original frame
        sourceViewController.optionsButton.frame = leftButtonInitFrame;
}];

Но я изо всех сил пытаюсь заставить новую кнопку (из целевогоViewController) перемещаться. Причина в том, что я не могу получить доступ к элементам представления целевогоViewController: при выполнении перехода они не создаются. И я не могу анимировать кнопку, которая не создана.

Итак, как я могу заменить кнопку в sourceViewController кнопкой из приемника ViewController?


person Mischa    schedule 09.03.2013    source источник


Ответы (2)


Представление целевого контроллера представления не было инициализировано/загружено в то время, когда вы пытаетесь получить доступ к кнопкам. Чтобы загрузить представление целевого контроллера представления, вы можете просто получить доступ к свойству представления. Сделайте это перед использованием кнопок: [destinationViewController view];

destinationViewController.view; тоже сработает, но будет генерировать предупреждение компилятора.

Исходная информация:

Если вы обращаетесь к view и его значение в настоящее время равно нулю, контроллер представления автоматически вызывает метод loadView и возвращает результирующее представление.

Метод loadView загружает представление, которым управляет контроллер. Вы никогда не должны вызывать этот метод напрямую.

person Daniel S.    schedule 11.03.2013

Вы правы в том, что вы не можете анимировать объект, которого еще не существует. Однако вы можете подделать его.

  1. Создайте кнопку-заполнитель, которая будет выглядеть идентично кнопке, которая будет в новом контроллере представления.
  2. Анимируйте его в правильном месте.
  3. Когда появляется контроллер представления назначения, его кнопка должна быть невидимой.
  4. После того, как контроллер представления находится на месте (т. е. переход завершен), контроллер представления назначения может обеспечить правильное размещение своей кнопки и сделать ее фактическую кнопку видимой.

Надеюсь это поможет.

person Jeff Wolski    schedule 09.03.2013
comment
Это звучит как хорошее обходное решение. Тем не менее, это кажется немного запутанным, так как мне придется менять код в двух местах каждый раз, когда я хочу изменить кнопку. Нет ли способа анимировать настоящую кнопку? - person Mischa; 09.03.2013
comment
Документация: согласно Настройка целевого контроллера при запуске перехода и Жизненный цикл перехода, контроллер целевого представления должен быть инициализирован при выполнении перехода. - person Daniel S.; 11.03.2013