Это странная проблема. У меня есть контроллер представления iPhone для создания нового пользователя с некоторыми текстовыми полями, которые требуют анимации, чтобы избежать отображения клавиатуры при отображении, то есть представление анимируется вверх и вниз, чтобы сохранить минимальный зазор между верхней частью клавиатуры и нижним краем текстовое поле. Это работало нормально, когда он был представлен модально с экрана существующего пользователя входа в систему, начального контроллера представления в раскадровке.
Затем я решил немного изменить приложение, чтобы представления входа / создания пользователя принадлежали одному и тому же контроллеру представления. Они переходят так:
if(accountCreateView == nil) {
UINib *nib = [UINib nibWithNibName:@"NewAccountView" bundle:nil];
NSArray *nibViews = [nib instantiateWithOwner:self options:nil];
accountCreateView = [nibViews objectAtIndex:0];
}
[UIView transitionFromView:(displayingLoginView ? loginView : accountCreateView)
toView:(displayingLoginView ? accountCreateView : loginView)
duration:0.6
options:(displayingLoginView ?
UIViewAnimationOptionTransitionFlipFromRight :
UIViewAnimationOptionTransitionFlipFromLeft)
completion:^(BOOL finished) {
if (finished) {
displayingLoginView = !displayingLoginView;
}
}
];
Это тоже отлично работает. Однако код, который делает анимацию представлений, не делает. Когда текстовое поле становится активным, вызывается код для проверки близости текстового поля к клавиатуре, но при выполнении блока анимации ничего не происходит.
Итак, я проверил:
if([UIView areAnimationsEnabled])
NSLog(@"Animations are enabled");
else
NSLog(@"Animations are disabled");
Анимации, безусловно, включены.
Поэтому я переместил его обратно в viewDidLoad, пытаясь с помощью простой анимации посмотреть, что работает, прежде всего:
CGRect viewFrame = loginNameTextField.frame;
viewFrame.origin.y = 400.f;
[UIView animateWithDuration:1.f
delay:0.f
options:UIViewAnimationOptionCurveEaseInOut
animations:^ {
loginNameTextField.frame = viewFrame;
}
completion:NULL];
Это отлично работает! Текстовое поле медленно перемещается вниз по окну.
Это ничего не делает, и это запутанная часть:
CGRect viewFrame = self.view.frame;
viewFrame.origin.y = 400.f;
[UIView animateWithDuration:1.f
delay:0.f
options:UIViewAnimationOptionCurveEaseInOut
animations:^ {
self.view.frame = viewFrame;
}
completion:NULL];
viewFrame при установке из self.view.frame имеет происхождение 0,20 и размер 320,460, как и ожидалось.
Я попытался установить свойство frame напрямую:
CGRect viewFrame = self.view.frame;
viewFrame.origin.y = 400.f;
self.view.frame = viewFrame;
Похоже, я могу изменить рамки подвидов self.view, но не self.view. Исправление может состоять в том, чтобы оставить начальный контроллер представления в виде пустого представления в раскадровке и создать XIB-файлы как для представления входа в систему, так и для создания представления пользователя и загрузить их в viewDidLoad - но почему?
edit: Да, переключение версии раскадровки контроллера представления в простое пустое представление и добавление представления, содержащего фактический интерфейс пользователя из xib в качестве подпредставления, заставляет анимацию работать снова. Хотя до сих пор не знаю почему.