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;
}];