Чтобы сделать это, вам просто нужно найти выбранный сегмент, например, путем итерации по подпредставлениям сегментированного элемента управления и проверки свойства isSelected
, а затем просто вызвать метод setTintColor:
для этого подпредставления.
Я сделал это, подключив действие к каждому сегментированному элементу управления в событии ValueChanged в Интерфейсном Разработчике, я подключил их к этому методу в файле контроллера представления, который по сути является msprague ответом:
- (IBAction)segmentedControlValueChanged:(UISegmentedControl*)sender
{
for (int i=0; i<[sender.subviews count]; i++)
{
if ([[sender.subviews objectAtIndex:i] respondsToSelector:@selector(isSelected)] && [[sender.subviews objectAtIndex:i]isSelected])
{
[[sender.subviews objectAtIndex:i] setTintColor:[UIColor whiteColor]];
}
if ([[sender.subviews objectAtIndex:i] respondsToSelector:@selector(isSelected)] && ![[sender.subviews objectAtIndex:i] isSelected])
{
[[sender.subviews objectAtIndex:i] setTintColor:[UIColor blackColor]];
}
}
}
Чтобы обеспечить правильное отображение элемента управления каждый раз, когда пользователь открывает представление, мне также пришлось переопределить метод -(void)viewDidAppear:animated
и вызвать метод следующим образом:
-(void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
//Ensure the segmented controls are properly highlighted
[self segmentedControlValueChanged:segmentedControlOne];
[self segmentedControlValueChanged:segmentedControlTwo];
}
Для некоторых бонусных баллов, если вы хотите настроить сегментированный элемент управления на использование белого оттенка при выделении, тогда вы также захотите изменить цвет текста на черный, когда он выделен, вы можете сделать это следующим образом:
//Create a dictionary to hold the new text attributes
NSMutableDictionary * textAttributes = [[NSMutableDictionary alloc] init];
//Add an entry to set the text to black
[textAttributes setObject:[UIColor blackColor] forKey:UITextAttributeTextColor];
//Set the attributes on the desired control but only for the selected state
[segmentedControlOne setTitleTextAttributes:textAttributes forState:UIControlStateSelected];
С введением iOS 6 , впервые задающего цвет оттенка выбранного элемента в методе viewDidAppear, работать не будет, чтобы обойти это, я использовал большую центральную диспетчеризацию, чтобы изменить выбранный цвет после доля секунды примерно так:
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 0.05 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{
[self segmentedControlValueChanged:segmentedControlOne];
});