Панель пользовательского поиска scopeBar tintColor

StackOverflow https://stackoverflow.com/questions/1661061

  •  12-09-2019
  •  | 
  •  

Вопрос

Кому-нибудь удалось раскрасить область видимости UISearchBar, у нее есть свойство tintColor, но его настройка не влияет на подключенный scopebar UISegmentedControl.У меня есть ручка на панели, чтобы подкрасить ее, но, похоже, не работает, т.е.:

for (id subview in searchBar.subviews){
  if([subview isMemberOfClass:[UISegmentedControl class]]){
     UISegmentedControl *scopeBar=(UISegmentedControl *) subview;
    scopeBar.tintColor=UIColorFromRGB(0x990066);
 }
}

Твое здоровье, Нил

Это было полезно?

Решение

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

Из документов:UISegmentedControl использует это свойство, только если стилем сегментированного элемента управления является UISegmentedControlStyleBar .

Теперь панель управления разделена на сегменты выглядит похоже на UISegmentedControlStyleBar, но это не так, это какой-то недокументированный стиль:

NSLog(@"scope bar style is %d", scopeBar.segmentedControlStyle);
> scope bar style is 7

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

[scopeBar setSegmentedControlStyle:UISegmentedControlStyleBar];
[scopeBar setTintColor: UIColorFromRGB(0x990066)];
> scope bar style is 2

Внутренне существуют некоторые переменные экземпляра, влияющие на это:_segementedControlFlags.style и _barStyle, но вы не сможете взломать их, если не обойдете санкционированный API.

Лучше всего обсудить это с Apple и надеяться, что они включат исправление в будущий релиз.

Другие советы

Вышеперечисленные подходы у меня не сработали, и в итоге я использовал метод внешнего вида iOS.

[[UISegmentedControl appearanceWhenContainedIn:[UISearchBar class], nil] setTintColor:[UIColor whiteColor]];

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

scopeBar.segmentedControlStyle = UISegmentedControlStyleBar; //required for color change
for (id subview in self.searchDisplayController.searchBar.subviews )
{
    if([subview isMemberOfClass:[UISegmentedControl class]])
    {
        UISegmentedControl *scopeBar=(UISegmentedControl *) subview;
        scopeBar.tintColor =  [UIColor blackColor];         
    }
}

Если у вас есть область, похожая на белый прямоугольник, вокруг ваших кнопок, вы можете изменить ее цвет с помощью interface builder.

Я бы не сказал, что это выглядит "как задница", как у других, но и на самом деле это не идеально.

Просто выполните следующие действия, чтобы изменить оттенок панели задач:

Приведенный ниже код написан на C # (Xamarin).

SearchController.SearchBar.TintColor = UIColor.Green;

У меня есть нет удалось надежно настроить оттенок для оптической панели.

В итоге я изменил строку поиска tintColor ...ДО перехода в режим поиска, после чего я использую цвет по умолчанию, соответствующий полосе видимости.Затем, при отмене поиска, я меняю его обратно.

Одно место, которое я, кажется, здесь упускаю, - это переход, который происходит, когда соответствующий tableView прослушивается, в результате чего строка поиска теряет статус "первый ответчик".В этом случае цвет обратно не изменится.Причина:Я основываю это изменение цвета на нажатии кнопки отмены в строке поиска.

Реакция коленного рефлекса: searchBarCancelButtonClicked: должен быть вызван (при этом мы меняем оттенок обратно)...но это не может быть правдой, потому что Отмена не была нажата.Мне действительно нужен тип обнаружения "Поиск завершен".Может быть, просто присматривать за первым ответчиком и посмотреть, когда Панель пользовательского поиска входит в это состояние и выходит из него?

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

enter image description here

Измените цвет оттенка для изменения цвета панели прицела.Обратите внимание, что параметр barTintColor отличается - это изменит цвет строки поиска..

Это решение на языке Swift может быть адаптировано к objective-c.Вы можете найти сегментированное представление элемента управления, используя приведенную ниже функцию

func findSegmentedControl(view : UIView) -> UIView? {
    for v in view.subviews {
        if v is UISegmentedControl {
            print(v)
            return v
        } else {
            if let found = findSegmentedControl(view : v) {
                return found
            }
        }
    }
    return nil
}

а затем установите оттеночный цвет вида.вызов этой функции будет выглядеть следующим образом:

if let segmentedView = findSegmentedControl(view: searchController.searchBar) {                
            segmentedView.tintColor = UIColor.white
        }
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top