После обновления до Xcode 10 я понял, что подпрограмма draw(_ rect: CGRect)
моего пользовательского UIView (класс, производный от UIView) в моем приложении вызывалась с неправильным rect
. Действительно, он всегда вызывается с rect
, являющимся полным кадром базового UIView, вместо rect
, определяемого setNeedsDisplay(_ rect: CGRect)
.
Вот фрагмент кода, который можно запустить как игровую площадку, который, по крайней мере, в моей настройке показывает ошибочное поведение, описанное выше, в минималистичных настройках:
import Foundation
import UIKit
import PlaygroundSupport
class CustomView: UIView {
override func draw(_ rect: CGRect) {
print("rect = \(rect)")
}
}
let customView = CustomView(frame: CGRect(origin: CGPoint.zero, size: CGSize(width: 200.0, height: 200.0)))
PlaygroundPage.current.liveView = customView
print("test")
customView.setNeedsDisplay(CGRect(origin: CGPoint.zero, size: CGSize(width: 100.0, height: 100.0)))
Результат, который я получаю,
прямоугольник = (0,0, 0,0, 200,0, 200,0)
проверка
прямоугольник = (0,0, 0,0, 200,0, 200,0)
Первый напечатанный вывод для rect - это стандартная полная перерисовка представления, но второй после печати "test" приводит к проблеме. Выходные данные получаются в результате перерисовки из-за вызова customView.setNeedsDisplay
перед этим и должны представлять собой меньший указанный прямоугольник (0.0, 0.0, 100.0, 100.0)
.
Итак, мои очевидные вопросы:
- Можете ли вы воспроизвести это поведение?
- Я упускаю что-то очевидное?
- Это ошибка?