Полагаю, вы хотите создать свою собственную анимацию. В прошлом месяце я играл с чем-то в этом роде. Моим решением было добавить пользовательский вид (возможно, взятый из контроллера представления) к текущему виду как наложение. Это работает и со слоями.
Сначала вы получаете Image из вашего «будущего» или «настоящего» контроллера представления, как вы делали в своем примере кода выше. Обычно содержимое контроллеров представления должно быть доступно при визуализации в контекст.
Теперь у вас есть изображение. Манипулирование изображением должно быть сделано вами.
Добавить изображение в UIImageView. Этот ImageView может быть добавлен как подпредставление или слой. Теперь у вас есть слой, где вы можете свободно рисовать над вашим фактическим пользовательским интерфейсом. Иногда вам нужно переместить слой или вид вокруг, чтобы он идеально перекрывал ваш вид. Это зависит от вашей настройки просмотра. Если вы имеете дело с Tableviews, добавить подпредставление не так просто. Так что лучше используйте слой.
После того, как вся работа была выполнена, представьте новый контроллер представления без анимации, чтобы он сразу появился.
Удалите слой или вид из родительского вида после выполнения работы и очистите.
Это звучит сложно, но как только вы это сделаете, у вас есть шаблон для этого. В «WWDC 2011, Сессия 309 Представление раскадровки интерфейса» Apple представила «пользовательские сегменты», в которых вы найдете механизм для именно того, что вы хотите сделать. Приведенный ниже код вырезан из более старого проекта, он немного грязный и должен быть очищен. Но для демонстрации принципа это должно сработать:
-(void) animate {
static LargeViewController* lvc = [[LargeViewController alloc] init];
UIGraphicsBeginImageContextWithOptions(self.bounds.size, view.opaque, [[UIScreen mainScreen] scale]);
[lvc.view.layer renderInContext:UIGraphicsGetCurrentContext()];
// Create a ImageView to display your "zoomed" image
static UIImageView* displayView = [[UIImageView alloc] initWithFrame:self.view.frame];
static UIImage * img = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
// Add your image to the view
displayView.image = img;
// insert the view above your actual view, adjust coordinates in the
// frame property of displayView if overlay is misaligned
[[self.view] addSubview:displayView];
// alternatively you can use the layer
// [self.view.layer addSublayer:displayView.layer];
// draw the imageView
[displayView setNeedsDisplay];
// do something in background. You may create your own
// construction, i.e. using a timer
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSDate *now = [NSDate date];
NSTimeInterval animationDuration = 3.;
NSTimeInterval t = -[now timeIntervalSinceNow];
while (t < animationDuration) {
t = -[now timeIntervalSinceNow];
// Do some animation here, by manipulation the image
// or the displayView
// <calculate animation>, do something with img
// you have exact timing information in t,
// so you can set the scalefactor derived from t
// You must not use an UIImage view. You can create your own view
// and do sth. in draw rect. Do whatever you want,
// the results will appear
// in the view if you added a subview
// or in a layer if you are using the layer
dispatch_sync(dispatch_get_main_queue(), ^{
// display the result
displayView.image = img;
[displayView setNeedsDisplay];
});
}
});
// now the animation is done, present the real view controller
[self presentModalViewController:lvc animated:NO];
// and clean up here
}