使用setNeedsDisplay更新UIView不起作用



我的应用程序中有一个循环进度条,显示用户预算支出的百分比。每次用户切换到带有循环进度条的视图时,进度条都应该更新。每次用户打开应用程序时,进度栏也应该更新。

目前,出于某种我不理解的原因,它只会在应用程序打开时更新(在多任务处理中关闭),如果用户切换到该视图(它应该切换到),它将永远不会更新。我做了大量的研究,但一直未能找到解决方案。

这是创建圆圈的代码:

var progress: CGFloat = 0
class ProgressCircle: UIView {
override func drawRect(rect: CGRect) {
    var ctx = UIGraphicsGetCurrentContext()
    var innerRadiusRatio: CGFloat = 0.6
    var path: CGMutablePathRef = CGPathCreateMutable()
    var startAngle: CGFloat = CGFloat(-M_PI_2)
    var endAngle: CGFloat = CGFloat(-M_PI_2) + min(1.0, progress) * CGFloat(M_PI * 2)
    var outerRadius: CGFloat = CGRectGetWidth(self.bounds) * 0.5 - 1.0
    var innerRadius: CGFloat = outerRadius * innerRadiusRatio
    var center = CGPointMake(CGRectGetMidX(rect), CGRectGetMidY(rect))
    //Code for background circle
    var context: CGContextRef = UIGraphicsGetCurrentContext()
    colourTheme = NSUserDefaults.standardUserDefaults().integerForKey("themeSettings")
    if colourTheme == 1 {
        CGContextSetFillColorWithColor(context, (UIColorFromRGB(0xEAEAEA)).CGColor)
    } else {
        CGContextSetFillColorWithColor(context, (UIColor.darkGrayColor()).CGColor)
    }
    var circleSize: CGFloat = 0
    switch height {
    case 480, 568:
        circleSize = 171
    default:
        circleSize = 250
    }
    var rectangle: CGRect = CGRectMake(0, 0, circleSize, circleSize)
    CGContextBeginPath(context)
    CGContextAddEllipseInRect(context, rectangle)
    CGContextDrawPath(context, kCGPathFill)
    UIGraphicsEndImageContext()
    if colourTheme == 1 {
        CGContextSetFillColorWithColor(context, (UIColor.darkGrayColor()).CGColor)
    } else {
        CGContextSetFillColorWithColor(context, (UIColorFromRGB(0xEAEAEA)).CGColor)
    }
    var circleXY: CGFloat = 0
    var circleWH: CGFloat = 0
    switch height {
    case 480, 568:
        circleXY = 35.95
        circleWH = 99.1
    default:
        circleXY = 52
        circleWH = 146
    }
    var rectangleSmall: CGRect = CGRectMake(circleXY, circleXY, circleWH, circleWH) //102.6
    CGContextBeginPath(context)
    CGContextAddEllipseInRect(context, rectangleSmall)
    CGContextDrawPath(context, kCGPathFill)
    UIGraphicsEndImageContext()
    //Code for progress radius
    CGPathAddArc(path, nil, center.x, center.y, innerRadius, startAngle, endAngle, false)
    CGPathAddArc(path, nil, center.x, center.y, outerRadius, endAngle, startAngle, true)
    CGPathCloseSubpath(path)
    CGContextAddPath(ctx, path)
    CGContextSaveGState(ctx)
    CGContextClip(ctx)
    if percent > 100 {
        CGContextDrawImage(ctx, self.bounds, UIImage(named: "RadialProgressFillOver").CGImage)
    } else {
        CGContextDrawImage(ctx, self.bounds, UIImage(named: "RadialProgressFill").CGImage)
    }
    CGContextRestoreGState(ctx)
}

这是我用来(尝试)更新进度圈的代码。此代码在视图中DidAppear():

override func viewDidAppear(animated: Bool) {
    //Show set up screen if user hasn't used AffordIt before.
    userReturned = NSUserDefaults.standardUserDefaults().boolForKey("userReturnedCheck")
    if userReturned == false {
        self.performSegueWithIdentifier("setupView", sender: self)
    }
    //Add circular progress bar to budget display view.
    var circleSize: CGFloat = 0
    var yCoord: CGFloat = 0
    switch height {
    case 480, 568:
        circleSize = 171
        yCoord = 249
    case 667:
        circleSize = 250
        yCoord = 249
    default:
        circleSize = 250
        yCoord = 279
    }
    progress = CGFloat(percent/100)
    var circleFrame = CGRect(x: (budgetDisplayView.bounds.width/2)-(circleSize/2), y: yCoord, width: circleSize, height: circleSize)
    var circle = ProgressCircle(frame: circleFrame)
    self.budgetDisplayView.addSubview(circle)
    self.budgetDisplayView.sendSubviewToBack(circle)
    circle.setNeedsDisplay()
    view.setNeedsDisplay()
    circle.backgroundColor = UIColor.clearColor()
}

我真的希望有人能解决这个问题,因为我已经有一个星期了。谢谢

每次出现视图控制器并调用viewDidAppear()时,都会创建一个全新的ProgressCircle视图并将其发送到后面。除非你在其他地方做,否则看起来你永远不会从budgetDisplayView中删除ProgressCircle。我说得对吗?

如果我是对的,当应用程序从完全关闭状态打开时,将在该视图控制器上首次调用viewDidAppear(),并将创建一个单个进度圈,并如您所观察到的那样显示。下一次显示视图控制器并再次调用viewDidAppear()时,会创建另一个进度圈,并将其添加到上次创建的进度圈后面!同样的事情每次都会发生。我想这就是你看不到的原因。作为一个快速测试(但不是一个长期解决方案),试着评论这行:self.budgetDisplayView.sendSubviewToBack(circle)。希望能有所帮助。

最新更新