Элемент управления обновлением с контроллером отображения поиска отображается поверх панели поиска.

Я реализовал простой контроллер табличного представления с контроллером отображения поиска, перетащенным через Interface Builder. Затем я включил обновление, чтобы элемент управления обновлением был виден, когда пользователь тянет вниз для обновления.

Проблема в том, что счетчик отображается над строкой поиска, хотя должен находиться под ней.

Я знаю, что причина в минимальном стиле поиска. Если вы используете стиль Prominent по умолчанию, проблема не существует.

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

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

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

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

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

self.refreshControl.layer.zPosition = self.searchDisplayController.searchBar.layer.zPosition - 1;

Как предотвратить появление счетчика вверху строки поиска при использовании стиля Minimal?


person Jordan H    schedule 17.06.2014    source источник
comment
Я думаю, что проблема Эндрю здесь в том, что вы не показываете нам, как вы реализуете эти варианты в своем коде, и поэтому было бы очень трудно указать на что-либо, что было бы правильным решением, кроме как написать целый учебник о том, как представления отображаются, складываются и взаимодействуют. Просто неопределенно сказать, что я делаю это таким образом, недостаточно информации.   -  person indivisible    schedule 13.07.2014
comment
Код для воспроизведения проблемы не требуется. Одна строка кода — это попытка решить проблему. Я указал все необходимое для решения проблемы: в IB перетащите контроллер табличного представления, добавьте контроллер отображения поиска, включите обновление на боковой панели, запустите приложение. Под вариантами, я полагаю, вы подразумеваете разные предоставленные скриншоты? Это поведение можно увидеть, проведя пальцем по экрану. Я не кодировал это поведение.   -  person Jordan H    schedule 13.07.2014
comment
Вы пытались установить для позиции z отрицательное число, то есть -1? Если эти другие компоненты используют положение Z, то, вероятно, было бы неплохо проверить это, чтобы увидеть, не перепутаны ли слои между двумя компонентами.   -  person Oxcug    schedule 14.07.2014
comment
@theMonster Спасибо, но изменение его на -1 приводит к тому, что счетчик вообще не отображается, за исключением случаев, когда он находится поверх панели поиска - такое же поведение, как и в коде, который я пробовал ранее.   -  person Jordan H    schedule 14.07.2014


Ответы (4)


Чтобы обойти эту ошибку для UISearchBarStyleMinimal, вы должны установить свойство backgroundImage для любого изображения. Только если установлено фоновое изображение, макет ведет себя правильно.

private extension UISearchBar {
    private func setBackgroundColorWithImage(color: UIColor) {
        let rect = self.bounds
        UIGraphicsBeginImageContext(rect.size)
        let context = UIGraphicsGetCurrentContext()
        CGContextSetFillColorWithColor(context, color.CGColor)
        CGContextFillRect(context, rect);

        let image = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        self.backgroundImage = image // here!
    }
}
person Marcin    schedule 25.04.2015
comment
Не могли бы вы написать этот код на языке C, пожалуйста? @Марчин - person Adela Toderici; 15.09.2015

Кажется, это ошибка стиля Minimal Bar. Если вы установите его на Prominent, вы не столкнетесь с проблемой. Если вы используете Prominent и пытаетесь удалить фон, вы также столкнетесь с этой проблемой. Единственный обходной путь, который я нашел, — попытаться имитировать стиль Minimal с примененным стилем Prominent.

person Jordan H    schedule 30.10.2014

Переместите элемент управления обновлением за строку поиска при его настройке.

refreshControl.layer.zPosition -= 1
person David C.    schedule 06.01.2017

Так что, если это кому-то поможет, у меня была такая же проблема, и быстрое решение — добавить элемент управления обновлением в качестве подвида self.view вместо tableheaderview. Это добавит контроллер выше всего остального, и, по крайней мере, вы сможете его увидеть. С другой стороны, я считаю, что вы могли бы полностью исправить, установив его под правильным layer.zPosition. Но у меня не было времени, чтобы полностью исправить это.

[self.view addSubview:self.refreshControl];
person Jorge    schedule 19.07.2014
comment
Добавление этого кода в viewDidLoad у меня не сработало, даже если я сначала удалю его из superview. Он по-прежнему отображается над строкой поиска. Вам приходилось делать что-то еще? - person Jordan H; 19.07.2014