1

Короткой версия:Как воссоздать анимацию перехода контроллера навигации FaceTime с перекрывающимися прозрачными контроллерами?

Я хочу воспроизвести навигации анимации перехода FaceTime, чтобы подтолкнуть прозрачные контроллеры просматривать на навигационном стек без содержания вида сверху в перекрывающемся виде снизу в.

Проблема:

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

undesirable navigation push animation

Я загрузил демо-проект, который повторно производит такое поведение на https://github.com/bgfriend0/PushVCWithClearBackground.

Желаемая эффект:

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

desired FaceTime navigation push animation

Я хочу, чтобы воспроизвести это поведение FaceTime, но я не нашел решение.

Исследование:

литература по данному вопросу удивительно тонкий. Я могу найти несколько вопросов, которые касаются этого (например, Segue Push Animation with Clear Background is Flashing on iOS 7 и Views getting darker when are pushed on navigation controller), но никакое решение не устраняет проблему, воспроизводя желаемый эффект FaceTime.

Я нашел ссылку в твиттере (https://twitter.com/b3ll/status/384114227884986368) на форумы Apple dev по этой проблеме, но опять же не было решения: https://devforums.apple.com/message/897379#897379.

Идея:

Единственные осуществимые решения я придумываю в основном такие же, как и те, выдвинутые Калеб Дэвенпорт в яблоке сообщения на форуме:

Это должно быть один из трех вещей:

(1) Они маскируют левый вид до рамки правильного вида.

(2) Они копируют фоновое содержимое в нужное положение и смещают его таким образом, что правый вид не является действительно прозрачным.

(3) Они выполняют пользовательские переходы вида.

Каждый из них обладает некоторой степенью заслуг, но все они довольно сложны, и я не могу не надеяться, что должен быть, скажем, удобный удобный флаг, который Apple использует для создания желаемой маски эффект. Конечно, даже если такой флаг существует, это может быть частный API ... тем не менее, я отправляю этот вопрос, чтобы узнать, придумал ли кто-нибудь его или может предложить элегантное решение для воспроизведения желаемого FaceTime transparent push анимация.

+0

Здравствуйте, вы нашли решение? у меня такая же проблема :) – samir

+0

@samir см. ответ ниже – bgfriend0

ответ

1

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

См, например,:.

https://github.com/JaviSoto/iOS8-Runtime-Headers/blob/master/Frameworks/UIKit.framework/UINavigationController.h

https://github.com/JaviSoto/iOS8-Runtime-Headers/blob/master/Frameworks/UIKit.framework/_UINavigationParallaxTransition.h

С этим флагом, я был в состоянии полностью воспроизвести эффект FaceTime.

Естественно, все обычные оговорки об использовании частного API применимы к этому случаю (т. Е. Это НЕ разрешено для приложений, которые вы собираетесь отправить в App Store).

+0

Спасибо за sahring – samir

+0

Любые обновления об этом для iOS 11? Похоже, это такая общая вещь, которую нужно делать, но так трудно достичь без сумасшедшего взлома. – SAHM