Почему UIPickerView не изменяет размер при первом изменении ориентации устройства на его родительском viewController? - PullRequest
1 голос
/ 19 марта 2012

У меня есть приложение на основе навигации, и я говорю, что мой корневой контроллер A вызывает нажатие viewController B, который имеет UITableView с несколькими ячейками с UITextFields.

Первые 2 UITextFields имеют каждое, в качестве своего inputView, UIDatePicker и UIPickerView, соответственно. Кроме того, UIPickerView имеет 4 компонента, чьи UIViews возвращаются через

- (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view
{
    UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 60, 37)];
    label.text = [NSString stringWithFormat:@"%@%i", ((component == 3) ? @"." : @""), row];
    label.textAlignment = UITextAlignmentCenter;
    label.font = [UIFont boldSystemFontOfSize:24];
    label.backgroundColor = [UIColor clearColor];
    [label autorelease];

    return label;
}

В вертикальной ориентации UIPickerView выглядит следующим образом: enter image description here

Я заметил следующее:

СЛУЧАЙ 1 - ПРАВИЛЬНО

  1. Я нахожусь в viewController A в вертикальной ориентации.
  2. Я поворачиваю устройство / симулятор из вертикальной ориентации в горизонтальную ориентацию
  3. Я нажимаю viewController B
  4. Я вызываю всплывающее окно UIPickerView

Рамка подборщика правильно растянута в альбомный режим, а размеры компонентов по-прежнему имеют правильный размер и по центру:

enter image description here

НО

СЛУЧАЙ 2 - НЕПРАВИЛЬНО

  1. Я нахожусь в viewController A в вертикальной ориентации.
  2. Я нажимаю viewController B
  3. Я поворачиваю устройство / симулятор из вертикальной ориентации в горизонтальную ориентацию
  4. Я вызываю всплывающее окно UIPickerView

В этом случае компоненты UIPickerView перепутались:

enter image description here

Есть мысли?

Ответы [ 2 ]

3 голосов
/ 21 марта 2012

Итак, я понял это очень много: Не знаю почему, но по сути отсутствует вызов -setNeedsLayout для представления ввода при вращении устройства.

UIDatePicker (inputView = UIDatePicker) приводит к появлению средства выбора, которое автоматически (пере) размещает себя в правильной ориентации, а UIPickerView (inputView = UIPickerView) - нет.

Похоже, что UIPickerView может не регистрировать изменения ориентации или что-то в этом роде. Что я решил, зарегистрировав его вручную. То есть в моем коде установки я добавляю:

[[NSNotificationCenter defaultCenter] addObserver:weightPicker 
                                         selector:@selector(setNeedsLayout) 
                                             name:UIDeviceOrientationDidChangeNotification   
                                              object:nil];

А теперь сборщик ведет себя очень хорошо.

Кроме того, не забудьте отменить регистрацию в NSNotificationCenter, прежде чем textField будет освобожден.

0 голосов
/ 27 октября 2015

Для справки, чуть более чистая версия собственного ответа @SaldaVonSchwartz:

- (void) didRotateFromInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
  [myPickerView setNeedsLayout];
}

Это говорит myPickerView, что вы хотите настроить макет подпредставлений myPickerView.Должен сделать трюк.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...