2017-08-29 36 views
0

我已經創建了一個自定義UIView A嵌入到另一個自定義UIView B,因爲我想重用視圖。Xcode自定義UIView沒有正確顯示

(不能發佈超過2幅圖像,所以省略)

我使用的SWIFT代碼如下:

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

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

private func setupView() 
{ 
    let view = viewFromNibForClass() 
    view.autoresizingMask = [ 
     .flexibleWidth, 
     .flexibleHeight 
    ] 
    view.frame = bounds 
    addSubview(view) 
} 

private func viewFromNibForClass() -> UIView 
{ 
    let bundle = Bundle(for: type(of: self)) 
    let nib = UINib(nibName: String(describing: type(of: self)), bundle: bundle) 
    let view = nib.instantiate(withOwner: self, options: nil).first as! UIView 
    return view 
} 

當放置幾個的UIView A(在堆疊)插入的UIView B時,視圖會隨機跳到到超級視圖的左上方,有時超出視圖框架。我必須暫時將調整大小的蒙版更改爲:

view.autoresizingMask = [ 
     .flexibleWidth, 
     .flexibleHeight, 
     .flexibleTopMargin, 
     .flexibleBottomMargin, 
     .flexibleLeftMargin, 
     .flexibleRightMargin 
    ] 

然後在進行調整後將其更改回來。但仍然,我無法應用任何簡單的約束,如高度或距離superview.leading沒有遇到多個衝突

Custom UIView B containing several UIView A

要解決所有的衝突,我必須刪除所有的約束和繼續。然後,將UIView B放入我的主要故事板中的視圖控制器中,再次會導致視圖跳轉到某個奇怪的位置。我認爲這歸因於第一個查詢中列出的UIView A的異常行爲。

Generic view controller containing UIView B

感謝任何幫助或指針!

回答

0

在仔細檢查每個文件(缺少刪除並從頭開始)之後,我意識到XIB文件具有在Identity Inspector中引用自己的自定義類。這可能導致它遞歸地調用它的init(coder aDecoder: NSCoder),因此它的位置失去了作用。之前沒有檢測到這一點,因爲我沒有使用Autolay的自定義視圖,一切都很好。是的,該文件的XIB的所有者已正確設置。刪除了錯誤,一切都很好。