Исходя из фона iOS.Я пытаюсь создать круговой обзор прогресса.Я могу сделать это, но когда я пытаюсь оживить рисование, это не происходит.
Пользовательский NSView:
var progressValue : CGFloat?
override func draw(_ dirtyRect: NSRect) {
super.draw(dirtyRect)
// Drawing code here.
drawSpinner(frame: dirtyRect, startAgnle: 90, progress: progressValue!)
}
func drawSpinner(frame: NSRect, startAgnle: CGFloat , progress: CGFloat) {
//// General Declarations
let context = NSGraphicsContext.current!.cgContext
//// Color Declarations
let orange = NSColor(red: 1, green: 0.54, blue: 0.16, alpha: 1)
//// Variable Declarations
let endAngle: CGFloat = CGFloat(90 + progress * 3.6)
//// Oval Drawing
NSGraphicsContext.saveGraphicsState()
context.translateBy(x: frame.minX + 0.50000 * frame.width, y: frame.minY + 0.50000 * frame.height)
let ovalRect = NSRect(x: -40, y: -40, width: 80, height: 80)
let ovalPath = NSBezierPath()
ovalPath.appendArc(withCenter: NSPoint(x: 0, y: 0), radius: ovalRect.width / 2, startAngle: startAgnle, endAngle: endAngle, clockwise: true)
var ovalTransform = AffineTransform()
ovalTransform.translate(x: ovalRect.midX, y: ovalRect.midY)
ovalTransform.scale(x: 1, y: ovalRect.height / ovalRect.width)
ovalPath.transform(using: ovalTransform)
orange.setStroke()
ovalPath.lineWidth = 4
ovalPath.lineCapStyle = .round
ovalPath.lineJoinStyle = .bevel
ovalPath.stroke()
NSGraphicsContext.restoreGraphicsState()
}
и в контроллере представления:
func loadSpinner(){ //calling this in viewDidAppear
let spinner = SpinnerView.init(frame: NSMakeRect(10, 10, 150, 150 ))
spinner.progressValue = 0
self.view.addSubview(spinner)
for _ in 1...100 {
delay(delay: 1.0) {
spinner.progressValue? -= 1.0
spinner.needsDisplay = true
spinner.displayIfNeeded()
}
}
}
func delay(delay:Double, closure:@escaping ()->()) {
DispatchQueue.main.asyncAfter(deadline: .now()+delay) {
closure()
}
}
Метод draw rect вызывается, как и ожидалось.Представление должно анимировать круг с уменьшением значения прогресса от 0 до -100.Представление не анимируется, оно отображает полный круг.
Кто-нибудь может указать, где я делаю неправильно?