iOS Свернуть вид и все подпредставления вверху слева

У меня есть UIView с несколькими подпредставлениями (и несколькими подпредставлениями в тех). Я пытаюсь свести весь этот вид к верхнему левому углу экрана, пока он не достигнет определенного размера (20 х 20), но у меня возникают проблемы с этим.

Я впервые попробовал [UIView beginAnimations:nil context:nil]; но это не изменило размеры подпредставлений. Кроме того, из-за дополнения и количества других подпредставлений было бы очень трудно установить каждый кадр подпредставления в некоторый новый размер и заставить все это работать хорошо.

Затем я попробовал этот код:

[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:2.0f];
[UIView setAnimationCurve:UIViewAnimationCurveEaseOut];

[self.myCardsCarousel.layer setAnchorPoint:CGPointMake(0.0f, 0.0f)];
[self.myCardsCarousel setTransform:CGAffineTransformMakeScale(0.0f, 0.0f)];

CGRect addCardsButtonFrame = self.addCardsButton.frame;
addCardsButtonFrame.size.height = 0.0f;

[self.addCardsButton setFrame:addCardsButtonFrame];

[UIView commitAnimations];

Но это не минимизирует верхнюю левую часть экрана. Вместо этого он сводится к мертвой точке экрана.

Как я могу закрепить это в левом верхнем углу экрана? Кроме того, как я могу остановить CGAffineTransformMakeScale() когда вид достигает определенного размера?

1 ответ

Одним из возможных решений является создание моментального снимка представления и его анимация в углу (при условии, что минимизированный вид является статичным). Общая последовательность событий

  • создать снимок родительского представления в растровое изображение памяти
  • создать UIImageView из снимка
  • поместите UIImageView перед родительским представлением
  • скрыть родительский вид, используя его hidden имущество
  • оживить UIImageView в угол

Чтобы восстановить вид

  • оживить UIImageView обратно в исходное местоположение
  • показать родительский вид
  • удалите UIImageView и откажитесь от него

Для начала вам нужно свойство для UIImageView

@property (strong, nonatomic) UIImageView *snapshotView;

Вот код, чтобы минимизировать вид

// create a snapshot image of the parent view
UIGraphicsBeginImageContextWithOptions( self.parentView.bounds.size, YES, 0 );
CGContextRef context = UIGraphicsGetCurrentContext();
[self.parentView.layer renderInContext:context];
UIImage *snapshot = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

// create a UIImageView from the snapshot
self.snapshotView = [[UIImageView alloc] initWithFrame:self.parentView.frame];
self.snapshotView.image = snapshot;
[self.view addSubview:self.snapshotView];

// hide the parent view in place, while animating the snapshot view into the corner
self.parentView.hidden = YES;
[UIView animateWithDuration:0.5 delay:0 options:UIViewAnimationOptionCurveEaseInOut
animations:^
{
     self.snapshotView.frame = CGRectMake( 0, 0, 20, 20 );
}
completion:nil];

Вот код для восстановления вида

[UIView animateWithDuration:0.5 delay:0 options:UIViewAnimationOptionCurveEaseInOut
animations:^
{
    // animate the snapshot view back to original size
    self.snapshotView.frame = self.parentView.frame;
}
completion:^(BOOL finished)
{
    // reveal the parent view and discard the snapshot view
    self.parentView.hidden = NO;
    [self.snapshotView removeFromSuperview];
    self.snapshotView = nil;
}];
Другие вопросы по тегам