Как оживить пользовательский NSView - PullRequest
0 голосов
/ 25 октября 2018

Исходя из фона 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.Представление не анимируется, оно отображает полный круг.

Кто-нибудь может указать, где я делаю неправильно?

enter image description here

...