Как уменьшить размер UIPickerView на iPhone?

Я хотел бы уменьшить высоту UIPickerView в моем приложении для iPhone, чтобы отображалась только одна строка и один столбец. Высота окна выбора должна быть равна высоте строки.

Я использую Interface Builder для создания UIPickerView, но я не могу найти простой способ изменить размер этого элемента управления.

Как уменьшить UIPickerView?


person Rahul Vyas    schedule 25.05.2009    source источник
comment
Попробуйте использовать UIScrollView и в методе делегата didScroll: выполните привязку, если скорость прокрутки упадет ниже порогового значения.   -  person Dimitris    schedule 17.07.2010


Ответы (5)


Фактически, вы можете немного сжать весь UIPickerView, применив аффинное преобразование к охватывающему представлению. Например:

CGSize pickerSize = [pickerView sizeThatFits:CGSizeZero];

pickerTransformView = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, pickerSize.width, pickerSize.height)];
pickerTransformView.transform = CGAffineTransformMakeScale(0.75f, 0.75f);

[pickerTransformView addSubview:pickerView];
[self.view addSubview:pickerTransformView];
[pickerTransformView release];

масштабирует средство выбора до 75% от исходного размера, помещая его в содержащий представление и применяя преобразование масштабирования к этому представлению. Применение преобразования непосредственно к UIPickerView приводит к нежелательным артефактам рисования.

Однако для желаемого изменения размера лучше всего создать настраиваемый элемент управления.

person Brad Larson    schedule 25.05.2009
comment
+1 Я никогда не думал о применении преобразования к супервизору! Я всегда пытался применить его к pickerview с неудовлетворительными результатами. Если бы я мог, я бы проголосовал за это 10 раз. - person Dave DeLong; 23.10.2009
comment
Я теряю возможность отправлять события касания в PickerView после его поворота. Мысли? - person Mark; 23.10.2010
comment
@mark - Вы уверены, что средство выбора и окружающее его представление все еще находятся в пределах их содержащего представления? Если они находятся за пределами супервизора, события касания до них не дойдут. - person Brad Larson; 24.10.2010
comment
Разобрался - какие-то подключения в ИБ были некорректными. Спасибо, Брэд - ТЫ РОК! - person Mark; 25.10.2010
comment
как бы мы справились с испорченным размером шрифта после масштабирования до 0,50f? - person Syed Absar; 03.05.2011
comment
Будет ли приемлемо такое преобразование UIPickerView для Apple? - person sooper; 17.03.2012
comment
Мне любопытно, почему прямое масштабирование средства выбора вызывает артефакты рисования, а масштабирование его косвенно через подпредставление не - person rounak; 02.10.2013
comment
@rounak - Разница между установкой кадра для представления, который сообщает ему о рендеринге с заданным размером, и его рендерингом с нормальным размером, а затем применением преобразования к этому визуализированному контенту. Преобразование выполняет пропорциональное масштабирование растеризованной окончательной версии элемента управления, когда элемент управления не знает, как правильно визуализировать все его компоненты в определенных размерах. - person Brad Larson; 02.10.2013

Это возможно и просто!

Просто откройте файл пера как обычный текст, затем найдите окно выбора и настройте меры:

<object class="IBUIPickerView" id="783900772">
<reference key="NSNextResponder" ref="191373211"/>
<int key="NSvFlags">292</int>
<string key="NSFrame">{{85, 68}, {150, 116}}</string>

Это все!

person Alejandra    schedule 05.06.2009
comment
Когда я добавляю жирный текст, который вы здесь пишете, ничего не происходит. Поэтому я изменил следующий элемент - ›NSFrameSize на {320, 116} (первоначально 320, 216). И это работает. - person Chilly Zhong; 23.10.2009
comment
Я рекомендую установить NSFrameSize на {320, 130}, так как это покажет верхние 3 строки, включая индикатор средства выбора. Но побочный эффект заключается в том, что при этом не будет отображаться нижняя рамка средства выбора, и пользователи не смогут видеть ничего, кроме трех верхних строк. - person Chilly Zhong; 23.10.2009
comment
Для меня это ничего не меняет. - person Bryan; 28.10.2010
comment
не работает для меня ... этот метод меняет высоту только в интерфейсе xib, но во время выполнения окно выбора остается таким же ... :-( - person TheTiger; 01.06.2012

Ответ user2248258 действительно работает, если вы используете раскадровку и / или автопрокладку. Там я хотел бы добавить скриншоты, как предложил Ниламбар.

  1. поместите средство выбора в другое представление контейнера с нужным размером  Поместить окно выбора в другое представление контейнера

  2. проверьте clipSubviews для представления контейнера

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

Таким образом, окно выбора будет обрезано до нужного размера (размер не будет изменен).

Результат:  введите описание изображения здесь

person palme    schedule 31.07.2015
comment
Это отличное предложение, оно хорошо подходит к тому, что я искал или. - person Itai Spector; 16.09.2015

Создайте простой UIView в Интерфейсном Разработчике. Установите желаемое положение и размер, добавьте ограничения. Установите флажок «Обрезать подвиды». Затем перетащите окно выбора внутри этого представления в качестве подпредставления. Добавьте ограничения для средства выбора для выравнивания по горизонтали и вертикали внутри контейнера. Должен сделать свою работу.

person user2248258    schedule 03.06.2015
comment
Какой-нибудь пример с объяснением был бы отличным. - person Nilambar Sharma; 20.06.2015
comment
К сожалению, репутация моей учетной записи Stackoverflow не позволяет мне загружать изображения. Если хотите, я могу отправить вам подробности по электронной почте. - person user2248258; 21.06.2015

Насколько я знаю, он будет испорчен, если вы его уменьшите.

a) UITableView+UIPickerView
Я рекомендую вам использовать для этого строку "a в UITableView+UIPickerView. Вы можете использовать строку в tableView, например dropDownList в Windows, когда вы нажимаете на эту строку, будет отображаться pickerView (сначала скрытый).

б) Если у вас есть длинные списки данных в tableView и только один из элементов должен выбирать данные, вы должны прокрутить представление, используя следующий метод (обязательно рассчитайте исходное положение pickerView, поскольку оно будет перемещено вверх / вниз вместе):


-(void)setViewMove:(BOOL)moveUP offset:(CGFloat)offset
{
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:0.3];
    CGRect rect = self.view.frame;

    if(moveUP)
    {
        rect.origin.y-=offset;
        rect.size.height+=offset;
    }
    else    //move down
    {
        rect.origin.y+=offset;
        rect.size.height-=offset;
    }
    self.view.frame = rect;
    [UIView commitAnimations];
}

c) Вы также можете добавить другое представление для средства выбора и вернуться к этому представлению, когда вы что-то выбрали.

Мой вывод:
Если у вас всего несколько строк в tableView, используйте.
Если у вас много строк в tableView, но только для одной из них требуется сборщик, используйте b.
Если у вас много строк в tableView, и многим из них нужен сборщик, используйте c.

person Chilly Zhong    schedule 25.05.2009
comment
есть ли способ создать выпадающий селектор, как мы видим на веб-страницах - person Rahul Vyas; 25.05.2009
comment
На веб-страницах раскрывающийся список изначально был создан другими инструментами на платформе Windows. Safari добавляет уникальный элемент управления для просмотра dropDownList, но Apple не добавляет его в xcode. - person Chilly Zhong; 25.05.2009