2017-02-12 53 views
1

在嘗試以編程方式添加約束時引用此問題Making a custom UIView subview that fills its superview以編程方式添加約束時無法找到超級視圖?

我使用下面的代碼來添加兩個約束programmticly;但是,我收到一個錯誤,指出「無法解析約束格式」,因爲相關視圖沒有超級視圖。

private func setupDownView(view: UIView) { 
    let downView = try? DownView(frame: view.bounds, markdownString: "") 
    downView!.translatesAutoresizingMaskIntoConstraints = false 
    let viewsDict = ["view": downView!] 
    downView!.addConstraint(NSLayoutConstraint.constraints(
     withVisualFormat: "V:|-0-[view]-0-|", 
     options: [], 
     metrics: nil, 
     views: viewsDict)[0]) 
    downView!.addConstraint(NSLayoutConstraint.constraints(
     withVisualFormat: "H:|-0-[view]-0-|", 
     options: [], 
     metrics: nil, 
     views: viewsDict)[0]) 
    view.addSubview(downView!); 
} 

enter image description here

是否view自動成爲上海華一旦被添加到其子視圖?

我試圖在設置約束之前添加視圖addSubviewaddConstraint之前,並且出現錯誤「視圖層次結構未針對約束進行準備」。

enter image description here

setupDownView被稱爲在以下兩個地方,

@IBOutlet weak var cardTags: UIView! {didSet { setupDownView(view: cardTags)}} 
@IBOutlet weak var cardContent: UIView! { 
    didSet { 
     setupDownView(view: cardContent) 
     let tap = UILongPressGestureRecognizer(
      target: self, 
      action: #selector(QuizViewController.tapDownHandler) 
     ) 
     tap.minimumPressDuration = 0 
     cardContent.addGestureRecognizer(tap) 
    } 
} 
+0

你能否在下面提供答案作爲參考,對於那些有類似問題的人? –

+0

我添加了我的評論作爲答案。 – vacawama

回答

3

約束需要添加的觀點是在層次中。所以addSubview調用必須是之前addConstraint調用。

還要確保addConstraint叫上這是上海華盈,不downView,並且constraintsWithVisualFormat:返回的所有約束添加,不僅是第一個。

private func setupDownView(view: UIView) { 
    let downView = try? DownView(frame: view.bounds, markdownString: "") 
    downView!.translatesAutoresizingMaskIntoConstraints = false 
    view.addSubview(downView!); 

    let viewsDict = ["view": downView!] 
    view.addConstraints(NSLayoutConstraint.constraints(
     withVisualFormat: "V:|-0-[view]-0-|", 
     options: [], 
     metrics: nil, 
     views: viewsDict)) 
    view.addConstraints(NSLayoutConstraint.constraints(
     withVisualFormat: "H:|-0-[view]-0-|", 
     options: [], 
     metrics: nil, 
     views: viewsDict)) 

    view.layoutIfNeeded() 
} 
+0

謝謝。我試過你的代碼,但是我的'downView'消失了。 :( –

+0

什麼是錯誤? – Legoless

+0

沒有錯誤,它只是不顯示在視圖上。 –

1

從iOS 8開始,你不必確定哪個視圖添加約束條件,只需激活它們即可。對於個別限制,請將​​設置爲true。要激活整個約束數組,請使用便捷方法。

爲您的代碼,而不是做:

view.addConstraints(NSLayoutConstraint.constraints(
    withVisualFormat: "V:|-0-[view]-0-|", 
    options: [], 
    metrics: nil, 
    views: viewsDict)) 

你會使用:

NSLayoutConstraint.activate(NSLayoutConstraint.constraints(
    withVisualFormat: "V:|-0-[view]-0-|", 
    options: [], 
    metrics: nil, 
    views: viewsDict)) 

這工作,因爲限制已經知道他們指的是一個或多個視圖,並且可可可可觸摸可以找出視圖層次結構中的相應視圖來添加約束,這取決於視圖如何關聯(例如,兄弟姐妹,父/子,其他) 。

同樣的注意事項適用於此。您需要確保視圖在之前的視圖層次激活約束,否則您會收到錯誤。因此,在激活約束之前,請執行.addSubview

相關問題