Ios 使用计时器强制自定义视图重新绘制(或使其无效)

Ios 使用计时器强制自定义视图重新绘制(或使其无效),ios,swift2,Ios,Swift2,我已经创建了一个自定义小部件,它是动画的。现在我的问题是,当相应的数据更新时,我无法重新绘制视图 只是不要在密码里对我有任何异议。这是我在swift中的第一段代码,我既没有使用swift也没有使用Objective-C:-D 我也读过以下问题,但它们对我没有帮助: p、 s:我可以在控制台中看到打印(数字相位)的输出 p、 补充:我还使用了performselectornmainthread调用setNeedsDisplay函数 守则: import UIKit struct Digit

我已经创建了一个自定义小部件,它是动画的。现在我的问题是,当相应的数据更新时,我无法重新绘制视图

只是不要在密码里对我有任何异议。这是我在swift中的第一段代码,我既没有使用swift也没有使用Objective-C:-D

我也读过以下问题,但它们对我没有帮助:

p、 s:我可以在控制台中看到
打印(数字相位)
的输出

p、 补充:我还使用了
performselectornmainthread
调用
setNeedsDisplay
函数

守则:

import UIKit

struct Digit {
    var targetDigit: Int
    var currentDigit: Int
    var phase: Float
}

@IBDesignable class RollerCounter: UIView {
    var view: UIView!
    var viewRect: CGRect!
    var intNumber: Int
    var digits = [Digit]()
    let baseY = 20
    var timer: NSTimer?

    @IBInspectable var number: Int {
        get {
            return intNumber
        }
        set(number) {
            intNumber = number
            digits = []

            var tempNumber:Int = intNumber
            while tempNumber > 0 {
                digits.append(Digit(targetDigit: tempNumber % 10, currentDigit: Int(rand()) % 10, phase: 0.0))
                tempNumber /= 10
            }
        }
    }

    //init
    override init(frame: CGRect) {
        // set properties:
        intNumber = 1111
        super.init(frame: frame)

        // setup the thing!
        setup()
    }

    required init?(coder aDecoder: NSCoder) {

        intNumber = 1111

        super.init(coder: aDecoder)

        // setup the thing
        setup()
    }

    // Inital setup
    func setup() {
        let viewRect = CGRect(x: 0, y: 0, width: 280, height: 40)
        view = UIView(frame: viewRect)

        view.frame = bounds
        view.autoresizingMask = [.FlexibleWidth, .FlexibleHeight]

        addSubview(view)

        self.setNeedsDisplay()

        backgroundColor = UIColor(red: 1, green: 1, blue: 1, alpha: 0.0)
    }

    func animate() {
        timer = NSTimer.scheduledTimerWithTimeInterval(0.016, target: self, selector: Selector("tick"), userInfo: nil, repeats: true)
    }

    func tick() {
        for var digit in digits {
            digit.phase += Float(rand() % 100) / 100
            print(digit.phase)
        }

        setNeedsDisplay()

        //TEST: Also tested this
//      if let rect = viewRect {
//          drawRect(rect)
//      } else {
//          viewRect = CGRect(x: 0, y: 0, width: 280, height: 40)
//          drawRect(viewRect
//      }

    }


    // Only override drawRect: if you perform custom drawing.
    // An empty implementation adversely affects performance during animation.
    override func drawRect(rect: CGRect) {
        // Drawing code
        var tempNumber: Int = number
        let strTempNumber = String(tempNumber)

        var index: Int = 1
        let width = Float(rect.width)
        let charWidth: Float = Float(rect.width) / Float(strTempNumber.characters.count)
        let charHeight: CGFloat = 36

        let color = UIColor.blackColor()
        let font: UIFont = UIFont(name: "Helvetica Neue", size: charHeight)!
        let paraStyle = NSMutableParagraphStyle()
        paraStyle.lineSpacing = 6.0
        let skew = 0.1

        let textAttribs = [
            NSForegroundColorAttributeName: color,
            NSParagraphStyleAttributeName: paraStyle,
            NSObliquenessAttributeName: skew,
            NSFontAttributeName: font
        ]

        for digit in digits {

            let strCurrentDigit: NSString = String(digit.currentDigit) as NSString
            let strNextDigit: NSString = String(digit.currentDigit - 1) as NSString

            let xPos = width - Float(index) * charWidth
            let yPos = Float(baseY) + Float(charHeight) * digit.phase

            let point: CGPoint = CGPoint(x: Int(xPos), y: Int(yPos))
            strCurrentDigit.drawAtPoint(point, withAttributes: textAttribs)

            let nextDigitYPos = yPos - Float(charHeight) * 1.2
            let nextDigitPoint: CGPoint = CGPoint(x: Int(xPos), y: Int(nextDigitYPos))
            strNextDigit.drawAtPoint(nextDigitPoint, withAttributes: textAttribs)

            index++
            tempNumber /= 10
        }
    }
}
对不起,伙计们。我的错:-(

无效宣告系统没有问题。这里有问题:

for var digit in digits {
            digit.phase += Float(rand() % 100) / 100
            print(digit.phase)
        }
事实证明,对
阶段的更改只会反映在for循环内的本地digit实例中

但需要明确的是,
tick
方法中的
setNeedsDisplay()
调用对于更新视图至关重要