Swift — как дать тень UISearchBar, но * не * его кнопку отмены?

У меня есть панель поиска, к которой я применил тень, и, как вы можете видеть, здесь, кнопка отмены тоже отбрасывает свою тень. Я бы хотел, чтобы тень ограничивалась текстовым полем поиска. Вот с чего я начинаю:

    let searchBar = UISearchBar()
    searchBar.placeholder = "KAT Milkshake"
    searchBar.backgroundImage = UIImage()
    searchBar.barTintColor = UIColor.white
    searchBar.compatibleSearchTextField.leftView?.tintColor = UIColor.gray
    searchBar.compatibleSearchTextField.backgroundColor = UIColor.white

    searchBar.layer.shadowColor = UIColor.black.cgColor
    searchBar.layer.shadowOpacity = 0.25
    searchBar.layer.shadowOffset = CGSize(width: 2, height: 2)
    searchBar.layer.shadowRadius = 5

Что я пробовал:

  1. Я попытался изменить внешний вид кнопки отмены с помощью UIBarButtonItem.appearance(whenContainedInInstancesOf: [UISearchBar.self]), но оказалось, что тень этого объекта — отдельная. Обратите внимание на тонкую разницу вокруг букв после того, как я применил другую тень, изменив свойства тени внешнего вида .

  2. Назначение кнопке белого фона изображения не сработало, что я и сделал, открыв searchBar.value(forKey: "cancelButton") as! UIButton. Тень применяется вокруг всего изображения и выглядит еще хуже.

  3. К сожалению, не удалось настроить границы слоя панели поиска (searchBar.layer.frame = CGRect(x: searchBar.frame.minX, y: searchBar.frame.minY, width: searchBar.frame.width - cancelButton.frame.width, height: searchBar.frame.height)). Я выделил слой панели поиска для наблюдения за этим, и тень кнопки отмены сохраняется .

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

Есть ли способ обойти это? Я использую Swift 5 и iOS 14.

Вы можете найти UITextField в UISearchBar и настроить его. Вы можете искать расширения для доступа к textField из searchBar.   —  person srna    schedule 18.11.2020

@ibrahimyilmaz Вау, спасибо! Я чувствую себя глупо из-за того, что не думаю об этом. Это почти работает — вызывает некрасивое обрезание верхних и нижних теней. Я отправлю ответ, если выясню, как это исправить, не уменьшая радиус тени.   —  person srna    schedule 18.11.2020

См. также:  Найти и вернуть диапазоны всех вхождений данной строки в Swift
Понравилась статья? Поделиться с друзьями:
IT Шеф
Комментарии: 1
  1. srna

    Как предложил Ибрахимьилмаз, добавление тени в UITextField вместо UISearchBar сделало свою работу. Просто пришлось изменить мои ограничения высоты и привязки макета, чтобы справиться с обрезкой.

    Я выполнил этот пример пользователя Joshpy, чтобы получить доступ к текстовому полю. Для iOS ›= 13 создать тень очень просто:

        searchBar.searchTextField.layer.shadowColor = UIColor.black.cgColor
        searchBar.searchTextField.layer.shadowOpacity = 0.25
        searchBar.searchTextField.layer.shadowOffset = CGSize(width: 2, height: 2)
        searchBar.searchTextField.layer.shadowRadius = 5
    
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: