IOS 7 UITableView didSelectRowAtIndexPath pushViewController программно, проблема с анимацией

РЕДАКТИРОВАТЬ: Я нашел ответ на свой вопрос. Посмотрите внизу моего сообщения.

У меня возникла проблема с анимацией, которая пытается программным образом нажать UIViewController в didSelectRowAtIndexPath на UITableView. Когда я запускаю этот код в iOS 6, он отлично работает. В iOS 7 анимация перепуталась (она анимирует слева около 20% экрана, а затем исчезает). Если я сделаю это в раскадровке, анимация прекрасна. Я что-то упустил или есть способ обойти это без использования раскадровки?

// This is a cut down example.
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    UIViewController *viewController = [[UIViewController alloc] init];
    [self.navigationController pushViewController:viewController animated:YES];
}

Это похоже на то, что перед экраном TableView исчезает. Я понимаю, почему он это делает. Это связано с тем, что новый взгляд нажимается, когда он приближается к нему, как при использовании раскадровки. По какой-то причине он не работает программно.

enter image description here

EDIT: Это все, что я пропустил По какой-то причине вы должны установить backgroundColor.

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    UIViewController *viewController = [[UIViewController alloc] init];
    [viewController.view setBackgroundColor:[UIColor orangeColor]];
    [self.navigationController pushViewController:viewController animated:YES];
}

Ответ 1

Это поведение по умолчанию "параллакс", вызванное методом pushViewController:animated: в iOS7.

Имея небольшой опыт работы с storyboards, я подозреваю, что их segue отличаются от анимации push/pop UINavigationController.

Вы можете переопределить push/pop по умолчанию, создав пользовательский animated или пользовательский interactive.

Или вы можете использовать метод UIViewController :

transitionFromViewController:toViewController:duration:options:animations:completion:

чтобы настроить это поведение. Надеюсь, это поможет и надеюсь, что я понял ваш вопрос...

Ответ 2

У меня были аналогичные проблемы, которые мне удалось исправить, задерживая вызов

[self performSelector:@selector(displayMyViewController) withObject:nil afterDelay:0.2f];

Ответ 3

Я тоже испытал эту проблему. Другая причина для этого - изменение альфа-адреса назначения. По крайней мере, то, что я сделал.

Если вы хотите изменить непрозрачность представления, когда вы показываете загрузку HUD или что-то еще, не изменяйте представление alpha. Вместо этого отрегулируйте альфа вида Table View или Collection или все, что у вас есть в этом представлении. Если у вас есть несколько элементов, поместите их все в представление и измените этот вид alpha.

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