Как получить размытый и полупрозрачный эффект на панели навигации в iOS 7?

Проблема

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

enter image description here

Желаемый эффект

Я пытаюсь получить более очевидный эффект размытия, например приложение Apple Trailers:

enter image description here

полупрозрачности

В моем подклассе UINavigationController я делаю навигационную панель полупрозрачной:

- (id)initWithRootViewController:(UIViewController *)rootViewController
{
    if (self = [super initWithRootViewController:rootViewController]) {
        self.navigationBar.translucent = YES;
    }
    return self;
}

Цвет оттенков

В моем подклассе UIApplicationDelegate я установил цвет оттенка панели навигации. Я обнаружил, что альфа цвета оттенка не имеет значения. То есть, используя альфа 0,1, не приведет к тому, что стержень станет более прозрачным.

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{
    [[UINavigationBar appearance] setTintColor:[UIColor greenColor]];
}

Ребра

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

- (void) viewDidLoad
{
    [super viewDidLoad];
    self.edgesForExtendedLayout = UIRectEdgeNone;
}

Изменить: экспериментировать с краями

Объявление, указанное в комментариях @rmaddy в комментариях, может быть проблемой с edgeForExtendedLayout. Я обнаружил всеобъемлющий учебник edgeForExtendedLayout и попытался его реализовать:

- (void) viewDidLoad
{
    [super viewDidLoad];

    self.edgesForExtendedLayout = UIRectEdgeAll;
    self.automaticallyAdjustsScrollViewInsets = YES;
    self.extendedLayoutIncludesOpaqueBars = NO;
}

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

enter image description here

Ответ 1

Проблема была вызвана просмотром стороннего просмотра вниз EGORefreshTableHeaderView, который широко использовался до iOS 6 ввел контроль обновления системы.

enter image description here

Этот взгляд смущает iOS 7, заставляя его думать, что контент выше, чем есть на самом деле. Для iOS 6 и 7 я условно переключился на UIRefreshControl. Теперь панель навигации не отключит мой контент. Я могу использовать UIRectEdgeAll, чтобы мой контент попал под панель навигации. Наконец, я нажимаю навигационную панель с меньшей альфа, чтобы получить эффект полупрозрачности.

// mostly redundant calls, because they're all default
self.edgesForExtendedLayout = UIRectEdgeAll;
self.automaticallyAdjustsScrollViewInsets = YES;
self.extendedLayoutIncludesOpaqueBars = NO;

[[UINavigationBar appearance] setTintColor:[UIColor colorWithWhite:0.0 alpha:0.5]];

Ответ 2

Если вам нужно добиться того же эффекта, что и в магазине iTunes Store (темное размытие).

Настройте атрибут barStyle на панели навигации следующим образом:

self.navigationController.navigationBar.barStyle = UIBarStyleBlack;