Как я "юридически" исчезает на панели навигации в приложении?

Кажется, единственный способ удалить панель навигации с анимацией - через нее сдвинется вверх. Я хочу, чтобы он исчезал, как в Photos.app.

Лучше всего было бы изменить альфа, но Руководство Apple:

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

Язык немного странный, поскольку он указывает до iOS 5, но он заявил, что вам не разрешено напрямую изменять значение альфа-канала, и он никогда не заявляет, что вам разрешено сейчас.

Я не хочу, чтобы мое приложение отклонялось.

Как я могу погасить панель навигации, как я бы сказал в строке состояния?

Ответ 1

Это было весело.

Это должно было быть очень прямолинейным: используйте UIView transitionWithView для выполнения перекрестного затухания между скрытыми и не скрытыми состояниями панели навигации, как это установлено публичным API setNavigationBarHidden:animated:. На самом деле это работает для "угасания" навигатора, но угасание его снова было проблемой. Проблема заключалась в том, что navbar будет скользить на место независимо от того, что UIView +transitionWithView: не анимирует анимированные свойства (например, frame), если вы не укажете UIViewAnimationOptionAllowAnimatedContent.

Для меня это говорит о том, что внутри UINavigationController репозиционирует UINavigationBar внутри блока анимации независимо от того, была ли анимация указана в вызове setNavigationBarHidden:animated:. Длительность для этого блока анимации, вероятно, установлена ​​на "0", если для параметра animate: установлено значение NO.

Решение состоит в том, чтобы настроить навигационную панель видимой (без анимации) перед переходом на перекрестный переход. Это гарантирует, что навигационная панель начнет перекрестное затухание в правильном положении и что перекрестное затухание покажет только новое не скрытое состояние.

Мой образец проекта является стандартным одноразовым приложением. На раскадровке находится UINavigationController, которая является точкой входа. Я установил стиль бара для этого контроллера UINavigationBar на черно-полупрозрачный (аналогично приложению "Фото" ). Контроллер навигации rootViewController является простым UIViewController с UIImageView, заполняющим все границы (также как приложение "Фотографии" ). Я добавил UITapGestureRecognizer в представлении, чтобы вызвать следующий код, в контроллере представления:

- (IBAction) onShowHideNavbar: (id) sender
{
    BOOL hide = !self.navigationController.navigationBarHidden;

    if ( !hide)
    {
        [self.navigationController setNavigationBarHidden: hide animated: NO];
    }

    [UIView transitionWithView: self.navigationController.view
                      duration: 1
                       options: UIViewAnimationOptionTransitionCrossDissolve
                    animations: ^{

                        [self.navigationController setNavigationBarHidden: hide animated: NO];
                    }
                    completion: nil ];
}

Все это сказало, я не думаю, что вы столкнулись с какими-либо проблемами (Apple Rejection) для непосредственного общения со скрытыми или альфа-свойствами UINavigationBar. Документы предупреждают о том, чтобы трогать их, потому что они управляются UINavigationController, и их изменение может иметь невидимые последствия. Но в моем мнении они являются общедоступными API и, как таковые, их использование не должно быть причиной отказа.

Ответ 2

Вы не можете анимировать свойства панели навигации UINavigationController на законных основаниях.
Тем не менее, вы можете отобразить навигационный контроллер со скрытой навигационной панелью (скрывая его всегда или только на определенном контроллере представления, как вы предпочитаете), и замените его своим "специальным" экземпляром UINavigationBar; -)

Я прикладываю пример проекта (я использовал шаблон Xcode для его создания быстрее): FakeNavBar

Посмотрите на метод viewDidLoad DetailViewController:

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    [self configureView];

    self.fakeBar = [[UINavigationBar alloc]initWithFrame:self.navigationController.navigationBar.bounds];


    UIBarButtonItem *back = [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemCancel target:self action:@selector(back)];



    UINavigationItem *backItem = [[UINavigationItem alloc]initWithTitle:@"Back"];
    backItem.leftBarButtonItem = back;
    [self.fakeBar pushNavigationItem:backItem animated:YES];

    [self.view addSubview:self.fakeBar];

}

Здесь видео конечного продукта на YouTube.

Ответ 3

Способом этого (я точно не знаю, как вы планируете анимировать следующий вид или каким образом вы хотите включить fade) - это отображение текущего представления на uiimage, создание полного экрана UIImageView с этим изображением (в основном заменяя существующий UIView на его изображение). Поменяйте свой новый вид за представлением изображения, а затем уменьшите изображение.

Вы также можете вырезать только часть изображения UInavigationBar и исчезнуть после перехода. Таким образом, вы можете применять любые эффекты изображения к "UINavgationBar", не отклоняясь от яблока.

Ответ 4

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

Вы можете, конечно, реализовать свой собственный навигационный контроллер/навигационную панель, с помощью которой вы можете делать все, что хотите. Это то, что я сделал в своих приложениях, когда мне нужно сделать что-то подобное. Apple полностью справилась с этим. Бонусные очки: Apple может менять свой контроль столько, сколько захочет, не нарушая ваш макет, если вы используете настраиваемые элементы управления. Это было недавно проблемой в некоторых областях нашего приложения, где приложение выглядит VASTLY различным в разных версиях iOS (7).

Во всяком случае, что мои 2 цента...

Ответ 5

Если вы продолжаете читать, это следующий абзац сразу после цитаты:

В iOS версии 5.0 и более поздних версиях вы можете настроить внешний вид панели используя методы, перечисленные в разделе "Настройка внешнего вида панели". Ты можешь настроить внешний вид всех навигационных панелей, используя внешний вид proxy ([Внешний вид UINavigationBar]) или только один бар.

Нажав на ссылку (настройка внешнего вида панели), вы увидите следующее:

Настройка внешнего вида панели
  свойство tintColor
- backgroundImageForBarMetrics:
- setBackgroundImage: forBarMetrics:
- titleVerticalPositionAdjustmentForBarMetrics:
- setTitleVerticalPositionAdjustment: forBarMetrics:
свойство titleTextAttributes

Итак, в iOS версии 5.0 и более поздних версиях это список, который вы можете (юридически) изменить. Возможно, вы сможете сыграть в некоторые игры с альфой tintColor или фоновым изображением, чтобы он выглядел так, будто он исчезает (и затем скрывает его), но я сомневаюсь, что это будет выглядеть совершенно правильно. Вероятно, стоит попробовать.

Ответ 6

Возможно, вы не сможете легко угаснуть панель навигации, но вы можете легко угаснуть изображение панели навигации. Таким образом, вы можете создать образ навигационной панели, заменить навигационную панель вашим изображением и затем оживить изображение с альфа-движением до 0. Или вы могли бы сделать обратное: расположите изображение в верхней части навигационной панели и исчезать в изображении того, что должно быть за навигационной панелью.