Градиентный слой не в нужном месте - PullRequest
0 голосов
/ 25 апреля 2019

У меня следующий код:

playView.layer.cornerRadius = 16
let gradient1 = CAGradientLayer()
gradient1.frame = playView.frame
gradient1.cornerRadius = 16
if #available(iOS 10.0, *) {
    // set P3 colour
} else {
    // set sRGB colour
}
gradient1.startPoint = CGPoint(x: 0, y: 0)
gradient1.endPoint = CGPoint(x: 1, y: 1)
playView.layer.insertSublayer(gradient1, at: 0)

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

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

В настоящее время у меня есть код в viewDidLoad (), и поэтому проблему можно решить, переместив код в viewDidAppear (), но затем, когда приложение загрузится, перед появлением градиента будет небольшая задержка, не давая гладкий внешний вид.

Есть ли другой способ, которым я могу вставить код, чтобы градиент показывался в правильном месте, в то же время находясь там, как только пользователь увидит экран? Или, в качестве альтернативы, способ заставить градиент заполнить представление, сохраняя при этом код в viewDidLoad ()?

РЕДАКТИРОВАТЬ: viewWillAppear () не работает, равно как и viewWillLayoutSubviews (). Наверняка там должно быть, чтобы решить это?

Ответы [ 3 ]

0 голосов
/ 25 апреля 2019

viewDidAppear () работает. Этот экран является корневым контроллером - я не знаю, имеет ли это значение или нет, но нет видимой задержки при применении градиентного фона.

Мне было бы интересно, если бы кто-нибудь мог объяснить это? У меня есть гистограмма в другой части приложения, и в viewDidAppear () есть код для завершения гистограммы, однако есть задержка при ее заполнении.

0 голосов
/ 26 апреля 2019

Изменить свойство layer.frame внутри viewDidLayoutSubviews метод. Это делается для того, чтобы убедиться, что подпредставление (playView) уже имеет правильный кадр.

0 голосов
/ 25 апреля 2019

Вы можете поместить внутрь этого блока:

override func viewWillLayoutSubviews() {
    super.viewWillLayoutSubviews()
}
...