Это странная проблема. У меня есть контроллер просмотра 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, как и ожидалось.
Я попытался установить свойство фрейма напрямую:
CGRect viewFrame = self.view.frame;
viewFrame.origin.y = 400.f;
self.view.frame = viewFrame;
Похоже, я могу изменить рамку подвидов self.view, но не self.view. Исправление может заключаться в том, чтобы оставить начальный контроллер представления пустым представлением в раскадровке и создать xib как для представления входа в систему, так и для создания пользовательского представления и загрузить их в viewDidLoad, но почему?
edit: Да, переключение версии раскадровки контроллера представления на простое пустое представление и добавление представления, содержащего фактический пользовательский интерфейс, из xib в качестве подпредставления, заставляет анимацию снова работать. Хотя до сих пор не знаю, почему.