Как я могу заставить свой view уменьшиться и исчезнуть?

#iphone #cocoa-touch #uiview #uiviewcontroller #core-animation

#iPhone #cocoa-touch #uiview #uiviewcontroller #ядро-анимация

Вопрос:

Когда мой пользователь нажимает кнопку, я хочу, чтобы видимый вид уменьшался и исчезал, открывая родительский вид под ним. В настоящее время у меня есть это, которое почти работает:

 -(void)deleteNoteTransition
{
    self.view.userInteractionEnabled=NO;
    [UIView beginAnimations:@"deleteNote" context:nil];
    [UIView setAnimationDuration:0.6];
    self.view.transform=CGAffineTransformMakeScale(0.01,0.01);
    [UIView setAnimationDelegate:self];
    [UIView setAnimationDidStopSelector:@selector(animationDidStop:)];
    [UIView commitAnimations];
}

- (void)animationDidStop:(NSString *)anim finished:(BOOL)flag
{
    self.view.userInteractionEnabled=YES;
    if ([anim isEqualToString:@"deleteNote"]) {
    [self.navigationController popViewControllerAnimated:YES];
    }
}
  

Однако с этим связаны две проблемы:

  • Вид, который сжимается, не является «полным» видом — он не включает строку заголовка и панель инструментов.
  • Вид сжимается, чтобы показать простой белый фон, и только тогда запускается второй метод, так что белый фон бесцеремонно заменяется родительским видом.

Есть ли способ включить весь экран и плавно отобразить родительский контроллер просмотра позади, не вдаваясь в материал OpenGL, который слишком сложен для моего текущего уровня программирования?

Ответ №1:

Это должно охватить весь ваш вид:

 #import <QuartzCore/QuartzCore.h>
UIGraphicsBeginImageContext(viewToCapture.bounds.size);
[viewToCapture.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
  

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

 UIImageView *firstView = nil;

-(void)animateOut:(UIImage*)image {
    firstView = [[UIImageView alloc] initWithFrame:CGRectMake(0,0, 320, 480)];
    firstView.image = image
    [window addSubview:firstView];
    [window bringSubviewToFront:firstView];
    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationDuration:1.0];
    [UIView setAnimationTransition:UIViewAnimationTransitionNone forView:window cache:YES];
    [UIView setAnimationDelegate:self]; 
    [UIView setAnimationDidStopSelector:@selector(startupAnimationDone:finished:context:)];
    firstView.alpha = 0.0;
    // change this for a different scale
    firstView.frame = CGRectMake(-60, -85, 440, 635);  
    [UIView commitAnimations];
}

- (void)startupAnimationDone:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context {
    [firstView removeFromSuperview];
    [firstView release];
}
  

Вы можете получить окно из [UIApplication sharedApplication] или просто добавить его в качестве подвида представления текущего контроллера представления.

Комментарии:

1. В интересах всех, кто столкнется с этим, я также выяснил, что могу получить более сложную анимацию с помощью последовательной анимации с использованием setAnimationStopSelector . Обычно это работает лучше всего, если первая анимация имеет кривую UIViewAnimationCurveEaseIn , а последняя — кривую UIViewAnimationCurveEaseInOut . Любой в середине может быть UIViewAnimationCurveLinear .