iOS自定义视图不会立即显示图像

时间:2015-09-01 00:50:38

标签: ios swift

我在Swift中制作了一个简单的自定义视图,其背景图像视图包含照片和前面的一些标签。然后我将自定义视图添加到我的故事板中,它显示得很好,我可以看到背景图像和标签。

但是当我在我的设备上运行我的应用程序时,图像视图不会立即显示,如果我导航到另一个视图然后返回,则显示它。我只有一个计时器,它在我的场景中在后台安排了一些任务。我在这里错过了什么吗?

以下是我的自定义视图的代码

import UIKit

@IBDesignable class GaugeView: UIImageView {

    @IBOutlet weak var speedLabel: UILabel!

    let circlePathLayer = CAShapeLayer()
    var circleRadius: CGFloat = 50.0

    var speed: CGFloat {
        get {
            return circlePathLayer.strokeEnd
        }
        set {
            speedLabel.text = String(format: "%.2f", newValue)

            if newValue < 20.0 {
                circlePathLayer.strokeColor = UIColor.blueColor().CGColor
            } else if newValue >= 25.0 {
                circlePathLayer.strokeColor = UIColor.redColor().CGColor
            } else {
                circlePathLayer.strokeColor = UIColor.yellowColor().CGColor
            }

            if (newValue > 50) {
                circlePathLayer.strokeEnd = 1
            } else if (newValue < 0) {
                circlePathLayer.strokeEnd = 0
            } else {
                circlePathLayer.strokeEnd = newValue / 49.9
            }
        }
    }

    required init(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)

        xibSetup()
    }

    override init(frame: CGRect) {
        super.init(frame: frame)

        xibSetup()
    }

    override func layoutSubviews() {
        super.layoutSubviews()

        circleRadius = bounds.width / 2 - 2.6
        circlePathLayer.frame = bounds
        circlePathLayer.path = circlePath().CGPath
    }

    // Our custom view from the XIB file
    var view: UIView!
    let nibName = "GaugeView"

    func xibSetup() {
        view = loadViewFromNib()
        // use bounds not frame or it'll be offset
        view.frame = bounds
        // Make the view stretch with containing view
        view.autoresizingMask = UIViewAutoresizing.FlexibleWidth | UIViewAutoresizing.FlexibleHeight
        // Adding custom subview on top of our view (over any custom drawing > see note below)
        addSubview(view)
        // Configure speed circle layer
        configure()
    }

    func configure() {
        speed = 0.0
        circlePathLayer.frame = bounds
        circlePathLayer.lineWidth = 6
        circlePathLayer.fillColor = UIColor.clearColor().CGColor
        circlePathLayer.strokeColor = UIColor.blueColor().CGColor
        layer.addSublayer(circlePathLayer)
        backgroundColor = UIColor.whiteColor()
    }

    func circleFrame() -> CGRect {
        var circleFrame = CGRect(x: 0, y: 0, width: 2*circleRadius, height: 2*circleRadius)
        circleFrame.origin.x = CGRectGetMidX(circlePathLayer.bounds) - CGRectGetMidX(circleFrame)
        circleFrame.origin.y = CGRectGetMidY(circlePathLayer.bounds) - CGRectGetMidY(circleFrame)
        return circleFrame
    }

    func circlePath() -> UIBezierPath {
        let center: CGPoint = CGPointMake(CGRectGetMidX(circlePathLayer.bounds), CGRectGetMidY(circlePathLayer.bounds))
        let start = CGFloat(1.33 * M_PI_2)
        let end = CGFloat( 1.64 * M_2_PI)
        return UIBezierPath(arcCenter: center, radius: circleRadius, startAngle: start, endAngle: end, clockwise: true)
    }

    func loadViewFromNib() -> UIView {
        let bundle = NSBundle(forClass: self.dynamicType)
        let nib = UINib(nibName: nibName, bundle: bundle)
        let view = nib.instantiateWithOwner(self, options: nil)[0] as! UIView

        return view
    }

}

然后我将自定义视图添加到我的故事板并使用performSegueWithIdentifier(&#34; dashboardSegue&#34;,sender:nil)以编程方式导航到场景。我不仅注意到了客户视图,而且还没有显示场景中的两个进度条。

1 个答案:

答案 0 :(得分:0)

它可以更好地显示您的代码,但我猜您的计时器卡在主UI线程中。导航到其他视图时,系统会调用timer.invalidate()。尝试删除NSTimer以查看其是否正常运行。