1

アプリに円形のプログレス バーがあり、ユーザーが費やした予算のパーセンテージが表示されます。進行状況バーは、ユーザーが円形の進行状況バーのあるビューに切り替えるたびに更新する必要があります。また、ユーザーがアプリを開くたびに更新する必要があります。

現時点では、私が理解できない何らかの理由で、アプリが開かれたとき (マルチタスクで閉じられたとき) にのみ更新され、ユーザーがそのビューに切り替えた場合 (そうあるべきです) は更新されません。私は多くの調査を行いましたが、解決策を見つけることができませんでした。

円を作成するコードは次のとおりです。

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)
}

そして、これが私がプログレスサークルを更新するために(試して)使用しているコードです。このコードは viewDidAppear() にあります:

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()
}

私はこの問題を約1週間抱えているので、誰かが解決策を持っていることを本当に願っています. ありがとう。

4

1 に答える 1

3

ビュー コントローラーが表示さviewDidAppear()れて呼び出されるたびに、まったく新しい ProgressCircleビューを作成し、それを背面に送信します。ProgressCircle他の場所で行っていない限り、から を削除したようには見えませんbudgetDisplayView。私は正しいですか?

私が正しければ、アプリが完全に閉じられた状態から開かれたviewDidAppear()ときに、そのView Controllerで初めて呼び出され、観察中に単一のプログレスサークルが作成されて表示されます。次回そのビュー コントローラーが表示され、viewDidAppear()再度呼び出されると、別のプログレス サークルが作成され、前回作成された円の後ろに追加されます。その後も毎回同じことが起こります。見えないのはそのためだと思います。簡単なテストとして (ただし、長期的な解決策ではありません)、次の行にコメントを付けてみてください: self.budgetDisplayView.sendSubviewToBack(circle). それが役立つことを願っています。

于 2014-10-07T12:21:11.733 に答える