Как изменить высоту UIPickerView - PullRequest
113 голосов
/ 22 февраля 2009

Можно ли изменить высоту UIPickerView? Некоторые приложения, кажется, имеют более короткие PickerViews, но установка меньшего фрейма не работает, и фрейм заблокирован в Интерфейсном Разработчике.

Ответы [ 28 ]

54 голосов
/ 23 февраля 2009

Кажется очевидным, что Apple не особо приглашает к гаданию с высотой по умолчанию UIPickerView, но я обнаружил, что вы можете добиться изменения высоты вида, получив полный контроль и передача желаемого размера кадра во время создания, например:

smallerPicker = [[UIPickerView alloc] initWithFrame:CGRectMake(0.0, 0.0, 320.0, 120.0)];

Вы обнаружите, что на разной высоте и ширине существуют визуальные глюки. Очевидно, что с этими глюками нужно как-то обойтись, или выбрать другой размер, который их не демонстрирует.

46 голосов
/ 09 июля 2010

Ни один из вышеперечисленных подходов не работает в iOS 4.0

Высота pickerView больше не может быть изменена. При попытке изменить кадр средства выбора в 4.0 появляется сообщение, которое выводится на консоль:

-[UIPickerView setFrame:]: invalid height value 66.0 pinned to 162.0 

В итоге я сделал нечто радикальное, чтобы получить эффект меньшего средства выбора, которое работает как в OS 3.xx, так и в OS 4.0. Я оставил средство выбора того размера, который, по мнению SDK, должно быть, и вместо этого сделал прозрачное окно на моем фоновом изображении, через которое средство выбора становится видимым. Затем просто поместите средство выбора позади (Z Order wise) моего фона UIImageView, чтобы была видна только часть средства выбора, что определяется прозрачным окном на моем фоне.

43 голосов
/ 06 октября 2011

Есть только три допустимых высоты для UIPickerView (162.0, 180.0 and 216.0).

Вы можете использовать функции CGAffineTransformMakeTranslation и CGAffineTransformMakeScale, чтобы правильно подобрать подборщик для вашего удобства.

Пример:

CGAffineTransform t0 = CGAffineTransformMakeTranslation (0, pickerview.bounds.size.height/2);
CGAffineTransform s0 = CGAffineTransformMakeScale       (1.0, 0.5);
CGAffineTransform t1 = CGAffineTransformMakeTranslation (0, -pickerview.bounds.size.height/2);
pickerview.transform = CGAffineTransformConcat          (t0, CGAffineTransformConcat(s0, t1));

Приведенный выше код изменяет высоту вида сборщика на половину и перемещает его в точное положение (Left-x1, Top-y1) .

40 голосов
/ 16 июня 2011

Попробуйте:

pickerview.transform = CGAffineTransformMakeScale(.5, 0.5);
25 голосов
/ 21 июля 2011

В iOS 4.2 и 4.3 работает следующее:

UIDatePicker *datePicker = [[UIDatePicker alloc] init];
datePicker.frame = CGRectMake(0, 0, 320, 180);
[self addSubview:datePicker];

Не работает следующее:

UIDatePicker *datePicker = [[UIDatePicker alloc] initWithFrame:CGRectMake(0, 0, 320, 180)];
[self addSubview:datePicker];

У меня есть приложение, которое есть в магазине приложений, с 3-строчным устройством выбора даты. Я думал, что изменение высоты, возможно, было предотвращено, потому что вы видите текст под рамкой выбора даты, но это происходит и с обычным выбором даты 216 высот.

Какая ошибка? Ваше предположение так же хорошо, как и мое.

Также есть 3 допустимые высоты для UIDatePickerUIPickerView) 162,0, 180,0 и 216,0. Если вы установите UIPickerView высоту для чего-либо еще, вы увидите следующее в консоли при отладке на устройстве iOS.

2011-09-14 10:06:56.180 DebugHarness[1717:707] -[UIPickerView setFrame:]: invalid height value 300.0 pinned to 216.0
14 голосов
/ 11 июня 2015

Начиная с iOS 9, вы можете свободно изменять ширину и высоту UIPickerView. Нет необходимости использовать вышеупомянутые хаки преобразования.

10 голосов
/ 30 мая 2009

Я обнаружил, что вы можете редактировать размер UIPickerView - только не с помощью конструктора интерфейса. откройте файл .xib с помощью текстового редактора и установите размер представления выбора на все, что вы хотите. Конструктор интерфейса не сбрасывает размер и, похоже, работает. Я уверен, что яблоко заблокировало размер по причине, поэтому вам придется экспериментировать с разными размерами, чтобы увидеть, что работает.

7 голосов
/ 19 февраля 2015

Простой способ изменить видимую высоту представления средства выбора - встроить средство выбора в UIView, отрегулировать высоту родительского представления в соответствии с высотой, которую вы хотите видеть средства выбора, а затем включить «Подвиды клипа» в Интерфейсном Разработчике на родительский UIView или установить view.clipsToBounds = true в коде.

Clip Subviews in IB

7 голосов
/ 27 июля 2012

Преимущества:

  1. заставляет setFrame из UIPickerView вести себя как следует
  2. Нет кода преобразования в вашем UIViewController
  3. Работает в viewWillLayoutSubviews для изменения масштаба / позиционирования UIPickerView
  4. Работает на iPad без UIPopover
  5. Суперкласс всегда получает допустимую высоту
  6. Работает с iOS 5

Недостатки: * +1022 * Требуется подкласс UIPickerView Требуется использование pickerView viewForRow для отмены преобразования для подвидов UIAnimations может не работать Решение:

Подкласс UIPickerView и перезаписать два метода, используя следующий код. Он сочетает в себе подклассы, фиксированную высоту и подход преобразования.

#define FIXED_PICKER_HEIGHT 216.0f
- (void) setFrame:(CGRect)frame
{
    CGFloat targetHeight = frame.size.height;
    CGFloat scaleFactor = targetHeight / FIXED_PICKER_HEIGHT;
    frame.size.height = FIXED_PICKER_HEIGHT;//fake normal conditions for super
    self.transform = CGAffineTransformIdentity;//fake normal conditions for super
    [super setFrame:frame];
    frame.size.height = targetHeight;
    CGFloat dX=self.bounds.size.width/2, dY=self.bounds.size.height/2;
    self.transform = CGAffineTransformTranslate(CGAffineTransformScale(CGAffineTransformMakeTranslation(-dX, -dY), 1, scaleFactor), dX, dY);
}

- (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view
{
    //Your code goes here

    CGFloat inverseScaleFactor = FIXED_PICKER_HEIGHT/self.frame.size.height;
    CGAffineTransform scale = CGAffineTransformMakeScale(1, inverseScaleFactor);
    view.transform = scale;
    return view;
}
5 голосов
/ 13 марта 2012

Я не смог последовать ни одному из приведенных выше советов.

Я просмотрел несколько уроков и нашел этот один из самых полезных:

Я добавил следующий код, чтобы установить новую высоту внутри метода viewDidLoad, который работал в моем приложении.

UIPickerView *picker = [[UIPickerView alloc] initWithFrame:CGRectMake(0.0, 0.0, 320.0, 120.0)]; 
[self.view addSubview:picker];
picker.delegate = self;
picker.dataSource = self;

Надеюсь, это было полезно!

...