Сегментированный элемент управления tintColor в iOS 6

У меня есть сегментированный элемент управления с 8 сегментами. Я могу изменить цвет оттенка по умолчанию для всего элемента управления, НО могу ли я установить другой цвет для каждого сегмента элемента управления? Я нашел учебник, который работал в 5.1 с новым классом, который вызывает этот метод,

-(void)setTintColor:(UIColor*)color forTag:(NSInteger)aTag{}

Но это не работает в iOS 6. Есть идеи?


person rossi    schedule 07.10.2012    source источник


Ответы (5)


Эта проблема была исправлена ​​здесь. Я не мог вставить исходный код из-за проблем с форматированием. Пример кода здесь.

EDIT: добавлен комментарий и код из ссылки и исправлено форматирование. ~оли

Это хакерское исправление. Это сработает. Поместите свой код в ViewDidAppear. Это поможет.

- (void)viewDidAppear:(BOOL)animated 
{
    [super viewDidAppear: animated];
    dispatch_async(dispatch_get_main_queue(), ^{
        for (int i = 0 ; i < [segmentControl.subviews count] ; i++)
        {
            if ([[segmentControl.subviews objectAtIndex: i] isSelected] )
            {
                [[segmentControl.subviews objectAtIndex: i] setTintColor: [UIColor blackColor]];
                break;
            }
        }
    }); 
}
person barryjones    schedule 06.11.2012
comment
Хочу поставить +100. Я потратил на это свои семь часов. Увидев ваш код, он отлично работает. @барриджонс. Продолжай взламывать - person user40910; 09.05.2014

Вы можете установить различное изображение сегмента и цвет для каждого сегмента. Для цвета вы можете использовать:

//get the subviews of the segmentedcontrol

NSArray *arri = [segmentedControl subviews];

//change the color of every subview(segment) you have

[[arri objectAtIndex:0] setTintColor:[UIColor redColor]];

[[arri objectAtIndex:1] setTintColor:[UIColor greenColor]];

Надеюсь, это решит проблему.

person iSaalis    schedule 08.10.2012
comment
Привет, Саалис, это работает для версии 5.1, но НЕ для новой версии 6.0. Думая, что это мой проект, я создал новый пустой проект, содержащий только сегментированный элемент управления, и добавил этот код. Он отлично работает на симуляторе 5.1, но НЕ на симуляторе 6.0. Есть идеи? - person rossi; 08.10.2012

Вы правы... iOS 6 не поддерживает подвиды для сегментированного управления....

У меня есть для вас альтернатива:

CGRect rect = CGRectMake(0, 0, 80, 44);
UIGraphicsBeginImageContext(rect.size);
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetFillColorWithColor(context,
                               [[UIColor redColor] CGColor]);
CGContextFillRect(context, rect);
UIImage *img = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
[segment setImage:img forSegmentAtIndex:0];

В проект необходимо добавить базовую графическую структуру.

Мы можем нарисовать изображение для сегмента по индексу.... Но если вы используете это, вы не сможете добавить текст, используя заголовок сегмента. Вам также нужно будет нарисовать текст поверх изображения img, использованного выше. Пожалуйста, поделитесь, если у вас есть другой способ сделать это.

person iSaalis    schedule 08.10.2012

UiSegmentedControl имеет свойство «segmentedControlStyle» (устарело в iOS7), которое влияет на поведение «tintColor».

возможные стили:

UISegmentedControlStylePlain,   
UISegmentedControlStyleBordered,
UISegmentedControlStyleBar,     
UISegmentedControlStyleBezeled, 

но на самом деле в iOS6 «Bezeled» (устарело) равно «Bar»

с первыми двумя стилями невозможно изменить примененный «tintColor», чтобы настроить его, вам нужно изменить изображения для каждого сегмента, используя:

- (void)setImage:(UIImage *)image forSegmentAtIndex:(NSUInteger)segment;

таким образом вы получите полностью настраиваемый сегментированный элемент управления

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

UISegmentedControlStyleBar

и свойство «tintColor» вступит в силу, и вы получите цветной сегментированный элемент управления, применяющий оттенок в зависимости от выбранного сегмента, и все другие преимущества, позволяющие системе набирать его.

person Manu    schedule 23.01.2014
comment
Спасибо за лучший ответ в теме. Подобная настройка поможет поддерживать ios 7.x и 6.x прямо сейчас. - person Sean Dunford; 29.01.2014

Вот простое решение, устанавливающее красный цвет и совместимое с iOS 6.

for ( UIView *segmentView in [segmentedControl subviews] ) {
    if ( [segmentView respondsToSelector:@selector(setTintColor:)] ) {
        [segmentView performSelector:@selector(setTintColor:)
                          withObject:[UIColor redColor]];
    }
}
person maros    schedule 18.10.2013