Подтвердить что ты не робот

Изменение фона UIPickerView

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

Спасибо.

4b9b3361

Ответ 1

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

Ответ 2

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

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>

Ответ 3

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

Это дает ему 11 подпунктов. [[picker subviews] count]

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

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

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

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

Ответ 5

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

[(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];
}

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

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

Ответ 6

Вот современная, идеально подходящая для пикселя версия с 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;

Этот ответ работает для ЛЮБОГО размера сборщика b/c. Размеры слоя вычисляются "на лету".

                                                                  enter image description here

Ответ 7

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

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

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

Ответ 8

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

Ответ 9

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

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

Ответ 10

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

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

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

Задайте значение альфа для подсмотров представления подбора, пронумерованных 0, 1 и 3. (Не знаю, почему возникает мысль о просмотре 2). Сделайте это по коду после первых данных загрузки для представления picker, как следует (это вызовет исключение, если вы сделаете это в 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