Tweetbot как переход с усадкой
Кто-нибудь знает, как добиться того, чтобы нынешний вид контроллера представления уменьшался и помещался поверх него с прозрачностью? Это достигается в Tweetbot 3, когда вы нажимаете на свой аватар в левом верхнем углу на панели навигации. Должен ли я сделать снимок, например?
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
(подробнее об этом в документации)
Я надеюсь, что это поможет вам в вашем проекте.