Пользовательский переход между двумя UIViews

У меня есть два представления «A» и «B». A плавает в центре окна (это не полный экран). B, вид, который заменит A, является полноэкранным. Я хотел бы написать собственный переход, который переворачивает A, чтобы показать B на обратной стороне, но одновременно масштабирует переворачиваемый прямоугольник так, чтобы по завершении переворота B отображался на весь экран.

Я пробовал использовать флип-переходы, доступные с transitionFromView: toView: duration: options: Завершение, но я могу заставить его только переворачивать весь экран вместо того, чтобы начинать флип с кадра A и заканчиваться кадром B.

Я знаю, что могу выполнять трехмерные преобразования слоев представления, но не уверен, какой набор API анимации мне следует использовать для этого. Одна вещь, которую я пробовал, - это изменить свойства слоя представления в блоке анимации transitionWithView: duration: options: animations: completed: но это не сработало, так как оно, кажется, учитывает изменения свойств представления.

Может кто-нибудь указать мне на правильное направление? Я был бы очень признателен.

ОБНОВЛЕНИЕ: Вот мой код для этого эффекта. Вы можете посмотреть видео о том, что он делает здесь: http://www.youtube.com/watch?v=-xNMD2fGRwg

CGRect frame = [[UIApplication easybookDelegate] rootViewController].view.bounds ;
float statusHeight = [UIApplication sharedApplication].statusBarFrame.size.height ;
frame.origin.y = statusHeight ;
frame.size.height -= statusHeight ;
self.view.frame = frame ; // self.view is view "B"

// Put the snapshot as thet topmost view of our view
UIImageView *imageView = [[UIImageView alloc] initWithImage:image] ; // image is a snapshot of view "A"
imageView.frame = self.view.bounds ;
[self.view addSubview:imageView] ;
[self.view bringSubviewToFront:imageView] ;

// Pre-transform our view (s=target/current, d=target-current)
CGAffineTransform transform = CGAffineTransformIdentity ;

// Translate our view
CGPoint center  = CGPointMake(screenOrigin.x + (image.size.width/2.0), screenOrigin.y + (image.size.height/2.0)) ;
float dX = center.x - self.view.center.x ;
float dY = center.y - self.view.center.y ;
NSLog( @"dx: %f, dy: %f" , dX, dY ) ;

transform = CGAffineTransformTranslate(transform, dX, dY) ;

// Scale our view
float scaleWFactor = image.size.width / self.view.frame.size.width ;
float scaleHFactor = image.size.height / self.view.frame.size.height ;
transform = CGAffineTransformScale(transform,scaleWFactor, scaleHFactor) ;

self.view.transform = transform ;

[[[UIApplication easybookDelegate] rootViewController].view addSubview:self.view] ;

// Perform the animation later since implicit animations don't seem to work due to
// view "B" just being added above and hasn't had a chance to become visible. Right now
// this is just on a timer for debugging purposes. It'll probably be moved elsewhere, probably
// to view "B"'s -didMoveToSuperview
double delayInSeconds = 0.3;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
    [UIView transitionWithView:self.view duration:3 options:UIViewAnimationOptionTransitionFlipFromRight| UIViewAnimationOptionCurveEaseOut animations:^(void) 
        {
        [imageView removeFromSuperview] ;
        self.view.transform = CGAffineTransformIdentity ;
        } 
        completion:^(BOOL finished){
                [self.view removeFromSuperview] ;
                [navController presentModalViewController:self animated:NO] ;
        }] ;
});

[imageView release];

6
задан leftspin 21 April 2011 в 19:25
поделиться