Изменить фон UIPickerView - PullRequest
18 голосов
/ 08 июня 2009

Я хочу изменить цвет границы UIPickerView. Я не вижу свойства оттенка для UIPickerView. Есть ли способ сделать это? Или обходной путь?

Спасибо.

Ответы [ 10 ]

27 голосов
/ 04 января 2012

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

CALayer* mask = [[CALayer alloc] init];
        [mask setBackgroundColor: [UIColor blackColor].CGColor];
        [mask setFrame:  CGRectMake(10.0f, 10.0f, 260.0f, 196.0f)];
        [mask setCornerRadius: 5.0f];
        [picker.layer setMask: mask];
        [mask release];

Не забудьте

#import <QuartzCore/QuartzCore.h>
18 голосов
/ 08 июня 2009

Если вы просто хотите обойти это, сделайте снимок экрана в симуляторе, откройте его в фотошопе, обрежьте его до области UIPickerView, сделайте центр прозрачным, примените любой оттенок, который хотите, добавьте это изображение в свой проект и добавьте его как UIImageView поверх UIPickerView.

14 голосов
/ 04 сентября 2009

Мой UIPickerView состоит из 3 компонентов. И нет индикатора выбора.

Это дает ему 11 подпредставлений. [[picker subviews] count]

Скрытие первого и последнего подпредставления полностью удаляет фон.

[(UIView*)[[picker subviews] objectAtIndex:0] setHidden:YES];
[(UIView*)[[picker subviews] objectAtIndex:10] setHidden:YES];

Скрытие каждого третьего подпредставления (индексы 1, 4 и 7) скрывает непрозрачный фон компонентов. Дает довольно приятный эффект, что я могу снимать кожу, как я желаю.

Надеюсь, что кому-то поможет :)

5 голосов
/ 09 марта 2012

Подборщик не будет иметь подпредставлений, пока он не будет полностью загружен. Если вы попытаетесь сделать это:

[(UIView*)[[picker subviews] objectAtIndex:0] setHidden:YES];
[(UIView*)[[picker subviews] objectAtIndex:10] setHidden:YES];

в viewDidLoad или viewWillAppear это не будет работать . Однако я переместил свой в один из методов протокола UIPickerView, и он удалил фоновый фрейм.

- (NSString *)pickerView:(UIPickerView *)thePickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component {
    if (self.pickerBackgroundNotHidden)
    {
        self.pickerBackgroundNotHidden = false;
        [(UIView*)[[tempPicker subviews] objectAtIndex:0] setHidden:YES];
        [(UIView*)[[tempPicker subviews] objectAtIndex:7] setHidden:YES];
        [(UIView*)[[tempPicker subviews] objectAtIndex:8] setHidden:YES];
    }
    return [arrayColors objectAtIndex:row];
}

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

Да, это также очевидно, но если в вашем средстве выбора нет элементов, приведенный выше код не удалит вложенные представления.

5 голосов
/ 22 апреля 2010

Я верю эта статья также будет полезна.

4 голосов
/ 15 июня 2013

Вот современная, идеальная по пикселям версия с ARC ответа @Lukas, потому что некоторые вопросы никогда не выходят из моды:

#import <QuartzCore/QuartzCore.h>

// . . .

CALayer* mask = [[CALayer alloc] init];
         mask.backgroundColor = [UIColor blackColor].CGColor;
         mask.frame = CGRectInset(picker.bounds, 10.0f, 10.0f);
         mask.cornerRadius = 5.0f;
         picker.layer.mask = mask;

Этот ответ работает для ЛЮБОГО размера сборщика, поскольку размеры слоя рассчитываются на лету.

enter image description here

2 голосов
/ 03 мая 2012

Вы можете изменить цвет фона, полностью заменив фоновое изображение на любое другое, используя IXPickerOverlayView , доступное на GitHub (репозиторий содержит иллюстрированный пример использования этого класса).

Обратите внимание, что вам придется рисовать (прямоугольный) фон самостоятельно с нуля, но в отличие от любого из обходных путей, упомянутых здесь, этот подход является полностью динамичным: элемент управления будет выглядеть правильно, даже если вы измените количество колес подборщика и их размеры во время выполнения (как это делает UIDatePicker при изменении настройки языкового стандарта системы).

Если у вас есть фоновое изображение, использовать IXPickerOverlayView так же просто, как добавить экземпляр IXPickerOverlayView поверх представления Picker и назначить свойство hostPickerView.

1 голос
/ 15 декабря 2009

На самом деле, чтобы исправить вас, вы действительно можете поместить .png поверх UIPickerview и по-прежнему использовать Picker View, просто убедитесь, что середина прозрачна, или вы не увидите строки.

0 голосов
/ 27 сентября 2013

Вы можете сделать следующее:

установить цвет фона вида средства выбора с помощью мастера или кода следующим образом:

Picker1.backgroundColor = [UIColor someColor];// clearColor for transparent

Установить альфа-значение для подпредставлений представления выбора, пронумерованных 0, 1 и 3. (Не знаю, почему существует мысль подвид 2). Сделайте это по коду после первой загрузки данных для представления средства выбора следующим образом (если вы сделаете это в DidViewLoad, будет выдано исключение).

[(UIView*)[[Picker1 subviews] objectAtIndex:0] setAlpha:someValue];// 0.0f for transparent
[(UIView*)[[Picker1 subviews] objectAtIndex:1] setAlpha:someValue];
[(UIView*)[[Picker1 subviews] objectAtIndex:3] setAlpha:someValue];

Не забудьте очистить цвет фона для метки, отправляемой в представление средства выбора, в методе viewForRow.

lbl.backgroundColor = [UIColor someColor];// could be clearColor
0 голосов
/ 04 августа 2012

Просто добавьте эту строку в один из ваших UIPickerView методов:

[[[MyPicker subviews] objectAtIndex:4] setBackgroundColor: [[UIColor alloc] initWithPatternImage:[UIImage imageNamed:@"image.png"]]];
...