Когда открывается представление контроллера просмотра, я хочу запустить анимацию, в которой все элементы в контроллере представления скользят извне в нижней части экрана в их естественные позиции. Для этого я subview.frame.origin.y += self.view.frame.size.height
в viewDidLayoutSubviews
. Я также пробовал viewWillAppear
, но он вообще не работает. Затем я оживляю их до своих естественных позиций с subview.frame.origin.y -= self.view.frame.size.height
в viewDidAppear
.Изменение рамки в viewDidLayoutSubviews
Проблема заключается в том, что viewDidLayoutSubviews
вызывается несколько раз в течение всей продолжительности жизни контроллера. Таким образом, когда такие вещи, как показ клавиатуры, все мой контент снова заменяется вне представления.
Есть ли лучший способ для этого? Нужно ли добавлять какой-то флаг, чтобы проверить, запущена ли анимация?
EDIT: вот код. Здесь я звоню prepareAppearance
в viewDidLayoutSubviews
, который работает, но viewDidLayoutSubviews
вызывается несколько раз в течение всего срока службы контроллера.
- (void)viewDidLayoutSubviews
{
[super viewDidLayoutSubviews];
[self prepareAppearance];
}
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
[self animateAppearance];
}
- (NSArray *)animatableViews
{
return @[self.createAccountButton, self.facebookButton, self.linkedInButton, self.loginButton];
}
- (void)prepareAppearance
{
NSArray * views = [self animatableViews];
NSUInteger count = [views count];
for (NSUInteger it=0 ; it < count ; ++it) {
UIView * view = [views objectAtIndex:it];
CGRect frame = view.frame;
// Move the views outside the screen, to the bottom
frame.origin.y += self.view.frame.size.height;
[view setFrame:frame];
}
}
- (void)animateAppearance
{
NSArray * views = [self animatableViews];
NSUInteger count = [views count];
for (NSUInteger it=0 ; it < count ; ++it) {
__weak UIView * weakView = [views objectAtIndex:it];
CGRect referenceFrame = self.view.frame;
[UIView animateWithDuration:0.4f
delay:0.05f * it
options:UIViewAnimationOptionCurveEaseOut
animations:^{
CGRect frame = weakView.frame;
frame.origin.y -= referenceFrame.size.height;
[weakView setFrame:frame];
}
completion:^(BOOL finished) {
}];
}
}
Я уже упоминал в вопросе, что я уже пробовал это! Похоже, что в 'viewDidAppear' пользовательский интерфейс еще не готов, и поэтому элементы не перемещаются за пределы экрана. –
Hm. У меня есть ограничения выравнивания центра Y, я не уверен, как оживить это ... –
Но, как ни странно, анимация работает! Должно ли это? –