Переход UINavigationController в iOS 7 на UITableView: черный полупрозрачный слой во время анимации

в моем новом приложении для iOS я хотел бы использовать фиксированный фон для всего приложения и его представлений.

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

Любая идея, чтобы удалить это нежелательное поведение? Спасибо!

Демонстрация:

Image

улучшенная версия .mp4 демо @ Dropbox

Изменить: UINavigationController содержит фоновое изображение.

Мои настройки TableViewController были изменены следующим образом:

self.tableView.backgroundView = nil;
self.tableView.opaque = NO;
self.tableView.backgroundColor = [UIColor clearColor];

person Patrick Hafner    schedule 24.08.2014    source источник


Ответы (1)


Это связано со стандартной UINavigationController анимацией push в iOS 7. Когда новый ViewController помещается в стек, он накладывается поверх предыдущего ViewController с небольшой тенью под ним.

Решение, которое я думаю, состоит в том, чтобы реализовать свой собственный переход. Так:

Создайте новый класс UINavigationController, я назову его CustomNavigationController

CustomNavigationController.h

@interface UINavigationController (Retro)

- (void)pushViewControllerCustom:(UIViewController *)viewController;

@end

CustomNavigationController.m

@implementation UINavigationController (Retro)

- (void)pushViewControllerCustom:(UIViewController *)viewController {
    CATransition *transition = [CATransition animation];
    transition.duration = 0.2;
    transition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionDefault];
    //Fade here look nice, no more black shadow stuff
    transition.type = kCATransitionFade;
    transition.subtype = kCATransitionFromRight;
    [self.view.layer addAnimation:transition forKey:nil];

    [self pushViewController:viewController animated:NO];
}

@end

Чтобы использовать его:

- (IBAction)barButtonItemPressed:(id)sender
{
    TableViewController *tableView = [self.storyboard instantiateViewControllerWithIdentifier:@"table"];
    [self.navigationController pushViewControllerCustom:tableView];
}
person Ty Lertwichaiworawit    schedule 24.08.2014
comment
Спасибо, это хорошее решение :-) - person Patrick Hafner; 03.10.2014