self.view.frame больше не анимируется в контроллере исходного представления раскадровки - PullRequest
1 голос
/ 01 февраля 2012

Это странная проблема. У меня есть контроллер представления 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 в качестве подпредставления, заставляет анимацию работать снова. Хотя до сих пор не знаю почему.

1 Ответ

1 голос
/ 02 февраля 2012

Если все, что вам нужно сделать, это держать свои текстовые поля над клавиатурой, почему бы не уронить UIViewController и перейти на UITableViewController и использовать статические ячейки?Вы размещаете одно текстовое поле на ячейку (создавая достаточное количество ячеек для удовлетворения ваших потребностей) и стилизуете его так, как вам нравится.Если у вас нет первого респондента, и на экране недостаточно ячеек, он не будет прокручиваться.Если будет больше, чем уместится, то прокрутится до нижних / верхних ячеек.Тем не менее, независимо от того, сколько у вас ячеек, если вы выберете текстовое поле, которое будет закрыто клавиатурой, устройство автоматически прокрутит ячейку до видимой позиции.Это все встроено, и я использую эту функцию все время.Работает с текстовыми полями и текстовыми представлениями.Просто не забудьте закомментировать количество разделов, количество строк в разделе и ячейку для методов индекса, чтобы статические ячейки работали правильно.Это экономит много кода.

HTH

Роб

...