Я получил эту идею от https://gist.github.com/1279713
Подготовка:
В модальном представлении xib (или сцене с использованием раскадровки) я настраиваю полноэкранный фоновый UIImageView (подключите его к файлу .h и присвойте ему свойство "backgroundImageView") с 0,3 альфа. И я установил цвет фона представления (UIView) как простой черный.
Идея:
Затем в «viewDidLoad» модального контроллера представления я делаю снимок экрана из исходного состояния и устанавливаю это изображение в качестве фона UIImageView. Установите начальную точку Y на -480 и дайте ей сдвинуться до точки Y, используя длительность 0,4 секунды с опцией анимации EaseInOut. Когда мы отклоняем контроллер представления, просто делаем обратное.
Код для класса контроллера модального вида
.h файл:
@property (weak, nonatomic) IBOutlet UIImageView *backgroundImageView;
- (void) backgroundInitialize;
- (void) backgroundAnimateIn;
- (void) backgroundAnimateOut;
.m файл:
- (void) backgroundInitialize{
UIGraphicsBeginImageContextWithOptions(((UIViewController *)delegate).view.window.frame.size, YES, 0.0);
[((UIViewController *)delegate).view.window.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage * screenshot = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
backgroundImageView.image=screenshot;
}
- (void) backgroundAnimateIn{
CGRect backgroundImageViewRect = backgroundImageView.frame;
CGRect backgroundImageViewRectTemp = backgroundImageViewRect;
backgroundImageViewRectTemp.origin.y=-480;
backgroundImageView.frame=backgroundImageViewRectTemp;
[UIView animateWithDuration:0.4 delay:0.0 options:UIViewAnimationCurveEaseInOut animations:^{
backgroundImageView.frame=backgroundImageViewRect;
} completion:^(BOOL finished) {
}];
}
- (void) backgroundAnimateOut{
CGRect backgroundImageViewRect = backgroundImageView.frame;
backgroundImageViewRect.origin.y-=480;
[UIView animateWithDuration:0.4 delay:0.0 options:UIViewAnimationCurveEaseInOut animations:^{
backgroundImageView.frame=backgroundImageViewRect;
} completion:^(BOOL finished) {
}];
}
В viewDidLoad просто позвоните:
[self backgroundInitialize];
[self backgroundAnimateIn];
В любом месте, где мы отклоняем модальный контроллер вида, мы вызываем:
[self backgroundAnimateOut];
Обратите внимание, что это ВСЕГДА анимирует фоновое изображение. Поэтому, если этот стиль перехода контроллера модального представления (или стиль перехода segue) не установлен на «Cover Vertical», вам может не понадобиться вызывать методы анимации.