При обычном отображении непрозрачный testView перекрывает родителя, и видна жёлтая область его слоя. Чёрный фон родителя виден только вне этой области.
Как определяется итоговый цвет экрана в iOS‑приложении
При обычном отображении непрозрачный testView перекрывает родителя, и видна жёлтая область его слоя. Чёрный фон родителя виден только вне этой области.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
В данном примере нужно понять, какой цвет в итоге будет виден пользователю на экране и почему именно он отображается. Обратите внимание на порядок установки свойств backgroundColor у UIView и его слоя, а также на то, как эти свойства взаимодействуют с аналогичными параметрами у корневого представления view.
func viewDidLoad() {
super.viewDidLoad()
let testView = UIView()
view.addSubview(testView)
testView.frame = view.bounds
testView.backgroundColor = .red
testView.layer.backgroundColor = UIColor.yellow.cgColor
view.backgroundColor = .green
view.layer.backgroundColor = UIColor.black.cgColor
}
Ответ
При обычном отображении непрозрачный testView перекрывает родителя, и видна жёлтая область его слоя. Чёрный фон родителя виден только вне этой области.
Внутри testView сначала задаётся красный фон UIView, затем непосредственно устанавливается жёлтый backgroundColor его backing layer. Аналогично слой корневого view получает чёрный после зелёного. Родительский фон не перекрашивает расположенный поверх него дочерний слой. Это предполагает ненулевые размеры, opacity/alpha по умолчанию и отсутствие дальнейших изменений UIKit. Однократный frame = view.bounds не обеспечивает последующий resize: используйте constraints или autoresizing. В переопределении UIViewController метод также должен иметь override.