2010-01-01 3 views
9

Мой вопрос вращается вокруг различия UISegmentedController на UINavigationBar и UIToolbar. Если я сброшу UISegmentedControl в навигационную панель следующим образом:UISegmentedControl Цвет в UIToolbar

navigationBar.barStyle = UIBarStyleBlackTranslucent; 

все хорошо. UISegmentedControl идентифицирует выбранный вариант со слегка темным черным. Но, если я удалю UISegmentedControl на UIToolbar, он не получит цвет или полупрозрачность с панели инструментов. Если я вручную установил tintColor, UISegmentedControl больше не будет различать выбранные и невыбранные.

Следует признать, что перед тем, как перейти на UIToolbar, необходимо обернуть UISegmentedControl в UIBarButtonItem. Мне интересно, является ли это причиной того, что UISegmentedControl выглядит некорректно (синий на полупрозрачном черном фоне).

toolbar.barStyle = UIBarStyleBlackTranslucent; 
UIBarButtonItem *item = [[[UIBarButtonItem alloc] initWithCustomView:segmentedControl]; 
NSArray *toolbarItems = [[NSArray alloc] initWithObjects:item,nil]; 
toolbar.items = toolbarItems; 

Конечно, мой код не так, как написано, так как я с помощью внутренней навигации и контроллера панели инструментов, но общая логика та же. Я не уверен, как сделать UISegmentedControl на UIToolbar черным полупрозрачным стилем - сохраняя очевидное различие между выбранными и невыбранными сегментами.

+0

Это помогает: 'segmentedController.tintColor = [UIColor darkGrayColor];' но он создает жестко закодированную зависимость, которую я бы лучше не вводил. Например, сделать его несколько сложнее, чтобы пользователь мог выбирать цветовые схемы. –

+0

Вы поняли это в конце? – DenNukem

+0

Пока Apple не реализует логику окраски UINavigation в UIToolbar для UISegmentedControl, я был отнесен на использование свойства tintColor. –

ответ

7

Похоже, что: segmentedController.tintColor = [UIColor darkGrayColor]; решает вашу проблему.

Чтобы удалить «зависимость», подкласс UISegmentedControl и установить оттенок в конструкторе.

CustomSegmentedControl.m

- (id)initWithItems:(NSArray*)items { 
    if(self = [super initWithItems:items]) { 
     self.tintColor = [UIColor darkGrayColor]; 
    } 
    return self; 
} 
+0

Я думаю, вы просто двигаете зависимость, а не избавляетесь от нее. Например, если я изменил цвет панели инструментов на «зеленый» - мне нужно было бы найти и найти каждую строку кода, как это, и изменить ее. Я бы предпочел не устанавливать свое приложение таким образом. Я хочу, чтобы сегментированный бар «автоматически» отсылался от своего родителя. Действительно, он делает это автоматически при размещении в UINavigationController. Если вы измените стиль UNavigationBar на полупрозрачный черный - любой дочерний UISegmentedController автоматически следует за пакетом. –

+0

К сожалению, когда UISegmentedControl размещен внутри UIToolbar, он автоматически не отображает параметр стиля/цвета на панели инструментов, и, как вы показали, я должен четко указать, какой именно цвет. В этом примере я определяю это как «зависимость», и я ищу решение, которое не вводит эту зависимость. Я не хочу устанавливать цвет в нескольких местах. –

+0

Поскольку это подкласс, цвет появляется только один раз в вашем коде. Это особенность объектно-ориентированного дизайна. В вашем приложении может быть 100 экземпляров CustomSegmentedControl, но цвет указывается только один раз. – bentford

Смежные вопросы