2017-07-04 14 views
4

XCodeでカスタムコントローラを設計していますが、コントローラの状態によっては、myImage?.draw(in: rect)を上書きしたdraw(_ rect: CGRect)関数内で呼び出してイメージを表示します。IBDesignableクラス描画UIImageがストーリーボードに表示されない

画像はアプリに正しく表示されますが、ストーリーボードには表示されません。はこれを説明するために、私はアプリやストーリーボードの両方で表示される同じ描画関数内でベジェリング、コメントを追加しました:

Controller as displayed in app

Controller as displayed in storyboard

は、問題を調査したが、私はそれがあってよいと考えています画像はオプションであるという事実とは関係ありません。私はクラスの完全な実装を削ってきた

error: IB Designables: Failed to render and update auto layout status for SermonViewController (1zk-bD-8it): The agent crashed 

:明示的にアンラップ、しかし、(すなわちmyImage!.draw(in: rect)呼び出しがクラッシュにストーリーボード自動レイアウトを起こし

import UIKit 

@IBDesignable class DownloadIndicatorControl: UIView { 

    let requestDownloadImage = UIImage(named: "requestDownloadImage") 
    let lineWidth: CGFloat = 3.0 
    override func draw(_ rect: CGRect) { 

     // Draw Image 
     requestDownloadImage?.draw(in: rect) 

     // Draw ring around image 
     let radius: CGFloat = fmin(self.bounds.width, self.bounds.height)/2 - lineWidth/2 
     let center: CGPoint = CGPoint(x: self.bounds.size.width/2, y: self.bounds.size.height/2) 
     let disk: UIBezierPath = UIBezierPath() 
     disk.lineWidth = lineWidth 
     disk.addArc(withCenter: center, 
        radius: radius, 
        startAngle: CGFloat(-Double.pi/2), 
        endAngle: CGFloat(2 * Double.pi - Double.pi/2), 
        clockwise: true) 
     disk.stroke() 
    } 

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

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

ものはありますそのI

答えて

3

UIImage(名前付き:)メソッドはメインバンドルを使用しますが、Interface Builderはリソースを別の方法で読み込みます。

これを試してみてください:

UIImage(命名:中:compatibleWith :)

import UIKit 

@IBDesignable class DownloadIndicatorControl: UIView { 

var requestDownloadImage: UIImage? 
let lineWidth: CGFloat = 3.0 

override func draw(_ rect: CGRect) { 

    // Draw Image 
    requestDownloadImage?.draw(in: rect) 

    // Draw ring around image 
    let radius: CGFloat = fmin(self.bounds.width, self.bounds.height)/2 - lineWidth/2 
    let center: CGPoint = CGPoint(x: self.bounds.size.width/2, y: self.bounds.size.height/2) 
    let disk: UIBezierPath = UIBezierPath() 
    disk.lineWidth = lineWidth 
    disk.addArc(withCenter: center, 
       radius: radius, 
       startAngle: CGFloat(-Double.pi/2), 
       endAngle: CGFloat(2 * Double.pi - Double.pi/2), 
       clockwise: true) 
    disk.stroke() 
} 

override init(frame: CGRect){ 
    super.init(frame: frame) 
    self.setup() 
} 

required init?(coder aDecoder: NSCoder) { 
    super.init(coder: aDecoder) 
    self.setup() 
} 

override func prepareForInterfaceBuilder() { 
    super.prepareForInterfaceBuilder() 
    self.setup() 
} 

internal func setup() { 
    let bundle = Bundle(for: DownloadIndicatorControl.self) 
    requestDownloadImage = UIImage(named: "download", in: bundle, compatibleWith: nil) 
} 
} 

enter image description here

関連する問題