Ничего себе. Я решил это, и я не совсем уверен, почему, но это работает.
Вот что я сделал:
Сначала я учел переходы в стандартный метод:
/***************************************************************\**
\brief Manages the transition from one view to another. Just like
it says on the tin.
*****************************************************************/
- (void)transitionBetweenThisView:(UIView *)srcView
andThisView:(UIView *)dstView
{
if ( srcView != dstView )
{
if ( srcView == [prefsController view] )
{
[UIView transitionFromView:srcView
toView:dstView
duration:0.25
options:UIViewAnimationOptionTransitionCurlDown
completion:nil];
}
else if ( dstView == [prefsController view] )
{
[UIView transitionFromView:srcView
toView:dstView
duration:0.25
options:UIViewAnimationOptionTransitionCurlUp
completion:nil];
}
else if ( srcView == [listSearchController view] && dstView == [mapSearchController view] )
{
[UIView transitionFromView:srcView
toView:dstView
duration:0.25
options:UIViewAnimationOptionTransitionFlipFromLeft
completion:nil];
}
else if ( dstView == [listSearchController view] && srcView == [mapSearchController view] )
{
[UIView transitionFromView:srcView
toView:dstView
duration:0.25
options:UIViewAnimationOptionTransitionFlipFromRight
completion:nil];
}
}
}
Затем я перехватываю переход на панели вкладок, прежде чем он произойдет, и переопределяю его следующим образом:
/***************************************************************\**
\brief This animates the view transitions, and also sets up anything
that needs doing between views. It stops the tab bar controller
from managing the transition, and does it manually.
\returns a BOOL. Always NO.
*****************************************************************/
- (BOOL)tabBarController:(UITabBarController *)inTabBarController
shouldSelectViewController:(UIViewController *)inViewController
{
[self transitionBetweenThisView:[[inTabBarController selectedViewController] view] andThisView:[inViewController view]];
int index = [[inTabBarController viewControllers] indexOfObject:inViewController];
[inTabBarController setSelectedIndex:index];
return NO;
}
Затем я добавил следующий код в ловушки для свайпов:
/***************************************************************\**
\brief Gesture Callback -Swipes from the List View to the Map View
*****************************************************************/
- (IBAction)swipeFromList:(UIGestureRecognizer *)sender
{
[self transitionBetweenThisView:[listSearchController view] andThisView:[mapSearchController view]];
[tabBarController setSelectedIndex:1];
}
Теперь проблема была в том, что у меня всегда возникал сбой при возврате к виду, с которого я проводил (не используя панель вкладок). Авария сказала, что вид назначения был освобожден.
После проверки некоторых куриных внутренностей я решил, что мне нужно держать нос и сохранить прежний вид, например:
[[listSearchController view] retain];
[self transitionBetweenThisView:[listSearchController view] andThisView:[mapSearchController view]];
Это работает. Я проверил это с помощью инструментов. Нет утечек.