UIAlertController не превращает все элементы в фоновом режиме в черно-белый - PullRequest
0 голосов
/ 22 октября 2018

РЕДАКТИРОВАТЬ: Репозиторий с моим решением: UIAlertControllerDimmed


После отображения UIAlertController большая часть фона становится «затемненной» и становится черно-белой.Некоторые элементы становятся темнее, но не становятся черно-белыми.

Эти элементы (сверху вниз на скриншоте):

  • UIImageView внутри UINavigationItem
  • Кнопка UIB с красным фоновым цветом и белым изображением
  • UIImageView внутри UITabBarItem

with alert controller

Я не смог найти ничего, связанного сЭта тема.Что мне нужно изменить, чтобы затемнить эти элементы?

Вот без UIAlertController:

without alert controller]

Ответы [ 3 ]

0 голосов
/ 23 октября 2018

Я думаю, что здесь происходит то, что вы устанавливаете tintColor некоторых элементов, и вы получаете другое поведение для tintColor, чем для backgroundColor или textColor (или цвета вimage).

Когда появляется предупреждение или лист действий, iOS 7 автоматически уменьшает цвет оттенка представлений позади него.Чтобы отреагировать на это изменение цвета, пользовательский подкласс представления, который использует tintColor в своем рендеринге, должен переопределить tintColorDidChange для обновления рендеринга при необходимости.

Например, я создал простое приложение, которое отображает контроллер предупреждений.Я установил цвет оттенка левой кнопки, чтобы очистить цвет, а цвет текста - синий:

enter image description here

Я установил цвет оттенка правой кнопки на системный зеленый цвет:

enter image description here

Когда я запускаю приложение и представляю контроллер оповещений, он выглядит так

До:

enter image description here

После:

enter image description here

InЧтобы получить поведение, которое вы ищете, вы должны следовать совету в ответе @ Александра.Вам нужно будет создать на экране версии четырех изображений в оттенках серого и анимировать переход к ним.

0 голосов
/ 24 октября 2018

Спасибо за вашу помощь.

Чтобы иметь более гибкое решение, я решил создать подкласс UIAlertController, который будет снимать скриншот, превращать его в оттенки серого и вставлять за * 1004.* когда это будет представлено.Таким образом, он работает, не выполняя никакой дополнительной работы, и вам не нужно реализовывать анимацию затухания для каждого отдельного элемента, который по умолчанию не превращается в цвета в оттенках серого.

Github repo: UIAlertControllerDimmed

0 голосов
/ 23 октября 2018

Вы можете использовать вспомогательную функцию для анимации изменения цвета

fileprivate func dimElements(highlight: Bool) {
    UIView.animate(withDuration: 0.3) {
        self.sendButton.backgroundColor = highlight ? .red : .gray
    }
}

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

let alert = UIAlertController(title: "Error", message: "Oops!", preferredStyle: .alert)
let okAction = UIAlertAction(title: "Ok", style: .cancel, handler: {_ in self.dimElements(highlight: true) })
alert.addAction(okAction)
self.dimElements(highlight: false)
present(alert, animated: true, completion: nil)
...