2015-09-01 66 views
0

我在Swift中做了一個簡單的自定義視圖,其中有一張帶有照片和一些標籤的背景圖像視圖。然後,我將自定義視圖添加到故事板,並且顯示效果良好,可以看到背景圖片和標籤。iOS自定義視圖不立即顯示圖像

但是,當我在我的設備上運行我的應用程序時,圖像視圖不會立即顯示,如果我導航到另一個視圖,然後返回,它將顯示。我只有一個計時器,它在我的場景中安排了一些後臺任務。我在這裏錯過了什麼嗎?

這裏是我的自定義視圖的代碼

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(「dashboardSegue」,發件人:無)。我只注意到不僅客戶視圖,而且現場的兩個進度條也不顯示。

+1

我們可以看到一些代碼嗎? – rocky

+0

不知道爲什麼,但我刪除了scence導航代碼performSegueWithIdentifier(「dashboardSegue」,發件人:無),使用segue直接顯示視圖和我的第二個視圖顯示完全沒有延遲。 –

回答

0

最好顯示你的代碼,但我猜你的計時器卡在主UI線程。當你導航到另一個視圖時,你的timer.invalidate()被調用。嘗試刪除NSTimer以查看它是否正常工作。

+0

這可能是原因,我會嘗試在新線程中啓動計時器,看看會發生什麼。如果這不起作用,我會回來更多的細節。謝謝。 –

+0

我將計時器添加到runloop,但不起作用。我註釋掉了viewDidLoad和viewWillApper中的所有代碼,但仍然無效。如果我將場景設置爲初始視圖,那麼它顯示得非常快。任何關於差異的想法? –

+0

如果是這樣,我想你的觀點可能不會從故事板被引用。你可以嘗試以編程方式添加你的視圖嗎?或者,如果你可以在github上分享你的代碼。 –