Пользовательский переход с блоком завершения и свойствами

Я хочу сделать пользовательский переход между контроллерами представления, слайд слева направо, как базовый эффект перехода iOS между страницами в AppLaucher, но с затемнением.

У меня есть собственный переход между viewControllers (назовем их FirstVC и SecondVC). Для затемнения у меня есть черный вид, который исчезает во время анимации (Второй VC темнее, чем Первый VC). У меня есть класс — подкласс UIStoryboardSegue — для моего пользовательского перехода с реализованным методом -(void)perform. В этом методе я реализовал (более подробно):

//...Initials frames

UIView *blackView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 568)];
blackView.backgroundColor = [UIColor blackColor];
blackView.alpha = 0;
[UIView animateWithDuration:0.3 animations:^{
blackView.alpha = 0.5;
//...Animations
}
completion:^(BOOL finished){

}];

Я уточняю, что два контроллера представления находятся в двух разных контроллерах представления навигации.

Для затемнения я хотел бы изменить свойство «darkView», объявленное в классе SecondVC, когда переход завершен, чтобы сохранить затемнение после перехода.

Для этого я хотел бы сделать один из следующих вариантов (если один из них работает, другие мне не нужны):

  1. Доступ к свойству darkView SecondVC непосредственно в блоке завершения и его изменение

  2. Обнаружение завершения анимации и изменение свойства в этот момент в методе, реализованном в классе SecondVC.

  3. Напишите [dest.view addSubview:whiteView]; в блоке завершения ("dest" является целевым контроллером представления) и получите доступ к ЭТОМУ подпредставлению в другом методе SecondVC.

Я уже многое перепробовал для трех решений, но буду очень признателен за вашу помощь. Спасибо


person Coconuts    schedule 21.08.2014    source источник


Ответы (1)


Что ж, если у вас реализован пользовательский класс перехода, то получение экземпляра secondViewController, который должен быть помещен в стек навигации, должно быть простым.

Попробуйте это в своем методе выполнения

FirstViewController *firstVC = self.sourceViewController;
SecondViewController *secondVC = self.destinationViewController;

Вероятно, вы можете объявить общедоступное свойство UIView на своем втором VC и получить к нему доступ, а также, возможно, открыть метод и вызвать его после завершения анимации.

person NavinDev    schedule 21.08.2014
comment
Спасибо за вашу помощь, но мой переход объявлен в раскадровке, не будет ли создание экземпляра программно мешать раскадровке? - person Coconuts; 21.08.2014
comment
Возможно, вы реализовали свой переход в раскадровке, но вам нужно создать собственный класс перехода для реализации пользовательской анимации. Создайте подкласс UIStoryboardSegue и реализуйте в этом классе метод выполнения. Не забудьте установить этот класс в качестве собственного класса перехода в StoryBoard. - person NavinDev; 22.08.2014
comment
Когда я пытаюсь использовать FirstViewController *firstVC = self.sourceViewController, firstVC имеет тип UINavigationController. Я думаю, это потому, что переход связан с контроллером навигации secondVC, поэтому segue.destinationViewController является контроллером представления навигации. Что я могу сделать ? - person Coconuts; 22.08.2014
comment
Хм, почему вы используете два навигационных контроллера? В идеале вы должны использовать один NavigationController, который управляет FirstVC и SecondVC. И ваш FirstVC должен быть установлен как rootviewController для контроллера навигации. - person NavinDev; 22.08.2014
comment
У меня есть 5 контроллеров просмотра в моем приложении. Первые управляют 2VC (с FirstVC -> начальный VC), а другие 3VC (с SecondVC). Я использую 2 навигационных контроллера, потому что хочу, чтобы 3VC был чем-то вроде временного всплывающего окна, но я не очень понимаю навигационный контроллер, может быть, мне не нужно это делать, но я видел, как люди это делают. На самом деле, у меня есть push-переход между контроллерами представления в каждом контроллере навигации, и у меня есть модальный переход при смене контроллера навигации. Я думал, что было бы логичнее иметь 2 навигационных контроллера, но вы говорите, что это не обязательно? - person Coconuts; 22.08.2014
comment
Таким образом, в основном NavigationController является менеджером для всех viewController. Он управляет ими с точки зрения методологии стека, то есть Push и Pop. С вашим типом настройки вы можете реализовать его с помощью одного NavigationController, и, поскольку вы пытаетесь предоставить пользовательскую анимацию, вы можете очень легко добиться эффекта всплывающего окна при нажатии viewController в стеке. Но опять же, нет ничего плохого в использовании двух навигационных контроллеров, просто вам нужно быть осторожным при управлении ими. - person NavinDev; 22.08.2014
comment
И я думаю, что выяснил, почему вы получаете экземпляр навигационного контроллера для второго VC. Чтобы исправить это, вы можете сказать UINavigationController *secondNav = self.destinationViewController; UIViewController *secondVC = [[secondNav viewControllers] firstObject]; - person NavinDev; 22.08.2014
comment
При этом у меня есть простой контроллер представления, поэтому я не могу получить доступ к свойству. Если я реализую SecondViewController *secondVC = (SecondViewController *)[[secondNav viewControllers] firstObject];, я получаю: 'UIViewControllerHierarchyInconsistency', reason: 'child view controller:<SecondViewController: 0x8c9a1f0> should have parent view controller:<FirstViewController: 0x8f912d0> but actual parent is:<UINavigationController: 0x8c74550>' - person Coconuts; 22.08.2014
comment
Ну, это неоднозначности, которые возникают, когда у вас есть более одного навигационного контроллера, управляющего вашей иерархией viewController. Возможно, вы пытаетесь вставить навигационный контроллер в уже существующий навигационный контроллер. Попробуйте решить свой дизайн с помощью одного навигационного контроллера. Он будет работать так, как вы ожидаете. - person NavinDev; 22.08.2014
comment
Он работает с одним навигационным контроллером, большое спасибо! - person Coconuts; 22.08.2014