2017-06-27 44 views
0

我正在構建一個自定義的UIView類似於導航欄,並且想在故事板中的視圖控制器內顯示此欄。 酒吧有兩個部分。一個用於背景的UIView和一個用於波形圖的UIImageView。我的問題是,如果我在故事板中使用該自定義視圖,只有背景UIView get生活呈現和圖像不。如果我爲圖像設置了@IBInspectable並將其設置爲檢查器中的UIImageView,它就可以工作。自定義視圖中的圖像沒有得到實時渲染

這裏是酒吧的樣子:

Bar1

這就是它看起來像在視圖控制器: Bar2

這裏是我的代碼(SWIFT 3):

TopBar.swift

@IBDesignable 
class TopBar: UIView { 

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

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

    func initView() { 
     let bundle = Bundle(for: type(of: self)) 
     let nib = UINib(nibName: "TopBar", bundle: bundle) 
     let view = nib.instantiate(withOwner: self, options: nil).first as! UIView 

     view.frame = bounds 
     view.autoresizingMask = [.flexibleWidth, .flexibleHeight] 

     addSubview(view) 
    } 
} 
+0

'view'的高度是多少? –

+0

背景視圖是52,圖像是14 –

+0

嘗試背景視圖高度30和圖像14 –

回答

0

與Reinier梅麗安和許多試驗和錯誤很多討論之後,我就想通了,是什麼原因造成的問題。

在我的Assets.xcassets文件夾中,我導入了僅用於iPhone設備的圖像。在檢查器中將此設置爲Universal後,所有內容都與我的問題中列出的代碼一起工作。

反正,非常感謝來Reinier Melian幫助我! (https://stackoverflow.com/users/6190582/reinier-melian

0

嘗試實現您的awakeFromNib方法,並添加prepareForInterfaceBuilder方法

override func awakeFromNib() { 
    super.awakeFromNib() 
    self.initView() 
} 

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

EDITED

,因爲我使用這個類所有的時間這很奇怪,在我的故事板工作得很好渲染

import UIKit 

@IBDesignable class GenericXibView: UIView { 

    @IBInspectable var nibName:String? 
    /** 
    View name. 
    */ 
    func getNibName() ->String? 
    { 
     return nibName 
    } 

    /** 
    View itself. 
    */ 
    var vView : UIView!; 

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

    /** 
    Class construct. Initialize the view. 
    */ 
    public override init(frame oFrame: CGRect) { 

     super.init(frame: oFrame); 
     self.setup(); 
    } 

    /** 
    Class construct. Initialize the view. 
    */ 
    public required init?(coder oDecoder: NSCoder) { 

     super.init(coder: oDecoder); 
     self.setup(); 
    } 

    /** 
    Initialize the custom view and add it to this. 
    */ 
    fileprivate func setup() { 

     assert(self.getNibName() != nil, "View with empty nib name can't be instatiated") 

     self.vView = UINib(nibName: self.getNibName()!, bundle: Bundle(for: type(of: self))).instantiate(withOwner: self, options: nil)[0] as! UIView; 

     self.vView.translatesAutoresizingMaskIntoConstraints = false; 

     self.addSubview(vView); 

     self.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|-0-[view]-0-|", options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: ["view":self.vView])); 
     self.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:|-0-[view]-0-|", options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: ["view":self.vView])); 

     //  self.vImgUser.layer.cornerRadius = (self.vImgUser.frame.size.width/2); 
     //  self.vImgUser.layer.masksToBounds = true; 
     self.setNeedsLayout(); 
    } 

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

    /* 
    // Only override draw() if you perform custom drawing. 
    // An empty implementation adversely affects performance during animation. 
    override func draw(_ rect: CGRect) { 
     // Drawing code 
    } 
    */ 

} 

還請確保您的班級在您的xib文件中設置爲fileOwner

希望這有助於

+0

這兩種方法不會改變任何東西。是的,我已經將文件所有者自定義類設置爲TopBar.swift –

+0

@KaiKuhlmann您嘗試過嗎? –

+0

當然我嘗試 –