Tweetbot как переход с усадкой

Кто-нибудь знает, как добиться того, чтобы нынешний вид контроллера представления уменьшался и помещался поверх него с прозрачностью? Это достигается в Tweetbot 3, когда вы нажимаете на свой аватар в левом верхнем углу на панели навигации. Должен ли я сделать снимок, например?

http://www.yoeri.me/files/tweetbot-transition.gif

1 ответ

Чтобы достичь этого эффекта, вам нужно будет восстановить свой стек просмотра с нуля.

Так как нет возможности изменить viewController.viewВ этом фрейме вам нужно добавить вид контейнера, похожий на этот:

@implementation ViewController
@synthesize container;

- (void)viewDidLoad {
    [super viewDidLoad];

    container = [[UIView alloc] initWithFrame:self.view.frame];
    [self.view addSubview:container];
    // add all views later to this insted of self.view

    // continue viewDidLoad setup
}

Теперь, если у вас есть это, вы можете анимировать сокращающее поведение следующим образом:

[UIView animateWithDuration:.5 animations:^{
        container.frame = CGRectMake(10, 17, self.view.frame.size.width-20, self.view.frame.size.height-34);
    }];

Хорошо, я предполагаю, что вы разрабатываете для iOS 7, поэтому мы будем использовать некоторые новые API здесь (для более ранних версий есть альтернативные платформы). Сейчас с WWDC UIViewесть resizableSnapshotViewFromRect:(CGRect) afterScreenUpdates:(BOOL) withCapInsets:(UIEdgeInsets) метод, возвращающий один UIView объект.

[UIView animateWithDuration:.5 animations:^{
        container.frame = CGRectMake(10, 17, self.view.frame.size.width-20, self.view.frame.size.height-34);
    } completion:^(BOOL finished) {
        UIView *viewToBlur = [self.view resizableSnapshotViewFromRect:container.frame afterScreenUpdates:YES withCapInsets:UIEdgeInsetsZero];   
    }];

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

Когда у вас это получится, вы можете скачать две категории файлов из этого репозитория (они из WWDC, так прямо из Apple!). По сути, они добавляют новые классные методы к UIView класс, из которого мы будем использовать applyDarkEffect, Я не проверял это, может быть, другой метод подходит вам лучше здесь.

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

[UIView animateWithDuration:.5 animations:^{
        container.frame = CGRectMake(10, 17, self.view.frame.size.width-20, self.view.frame.size.height-34);
    } completion:^(BOOL finished) {
        UIView *viewToBlur = [self.view resizableSnapshotViewFromRect:container.frame afterScreenUpdates:YES withCapInsets:UIEdgeInsetsZero];
        UIImage *image = [viewToBlur applyDarkEffect];
        UIImageView *blurredView = [[UIImageView alloc] initWithFrame:self.view.frame];
        [self.view addSubview:blurredView];

        // optionally also animate this, to achieve an even smoother effect
        [blurredView setImage:image];

    }];

Затем вы можете добавить свой SecondViewControllerЭто вид сверху стека, так что его методы делегата будут по-прежнему вызываться. Эффект отказов в представлении входящей учетной записи может быть достигнут с помощью нового метода анимации UIView animateWithDuration:(NSTimeInterval) delay:(NSTimeInterval) usingSpringWithDamping:(CGFloat) initialSpringVelocity:(CGFloat) options:(UIViewAnimationOptions) animations:^(void)animations completion:^(BOOL finished)completion (подробнее об этом в документации)

Я надеюсь, что это поможет вам в вашем проекте.

Другие вопросы по тегам