Я использую этот подход, чтобы вырезать закругленное прямоугольное «окно» из фона:
override func draw(_ rect: CGRect) {
guard let rectsArray = rectsArray else {
return
}
for holeRect in rectsArray {
let holeRectIntersection = rect.intersection(holeRect)
if let context = UIGraphicsGetCurrentContext() {
let roundedWindow = UIBezierPath(roundedRect: holeRect, cornerRadius: 15.0)
if holeRectIntersection.intersects(rect) {
context.addPath(roundedWindow.cgPath)
context.clip()
context.clear(holeRectIntersection)
context.setFillColor(UIColor.clear.cgColor)
context.fill(holeRectIntersection)
}
}
}
}
В layoutSubviews()
Я обновляю цвет фона и добавляю мой прямоугольник «оконная рамка»:
override func layoutSubviews() {
super.layoutSubviews()
backgroundColor = self.baseMoodColour
isOpaque = false
self.rectsArray?.removeAll()
self.rectsArray = [dragAreaView.frame]
}
Я добавляю прямоугольник сюда, потому что layoutSubviews()
обновляет размер "оконной рамы" (т. Е. Прямоугольник изменяется после layoutSubviews()
запуска).
Основной механизмработает как положено, однако, если я изменю цвет фона, окно выреза заполняется черным.Поэтому мне интересно, как я могу анимировать изменение цвета фона при такой настройке?То есть я хочу анимировать цвет области за пределами окна выреза (окно остается чистым).
Я пытался обновить backgroundColor
напрямую, а также с помощью didSet
в аксессоре пользовательской переменной цвета в моем подклассе UIView, но оба вызывают одно и то же заполнение "окна".
var baseMoodColour: UIColor {
didSet {
self.backgroundColor = baseMoodColour
self.setNeedsDisplay()
}
}