2017-05-07 38 views
1

我想放置在下列 佈局三個View:我看不到這個錯誤在這個NSLayoutConstraints

的ImageView:II 爲textLabel:TT TitleLabel:TL 空間:S

SSSSSS- TL-SSSSS
IISSSSTT --------------
SSSSSSSSSSSSSS

我這個當前的代碼如下:

let views = ["imageView": imageView, "titleLabel": titleLabel, "messageLabel": messageLabel] as [String : Any] 
     var constraints = [NSLayoutConstraint]() 

     constraints += NSLayoutConstraint.constraints(withVisualFormat: "H:|[imageView]-[titleLabel]|", options: [], metrics: nil, views: views) 
     constraints += NSLayoutConstraint.constraints(withVisualFormat: "V:|-([email protected])-[titleLabel]-([email protected])-|", options: [], metrics: nil, views: views) 
     constraints += NSLayoutConstraint.constraints(withVisualFormat: "V:|[imageView]-[messageLabel]-([email protected])-|", options: [], metrics: nil, views: views) 
     constraints += NSLayoutConstraint.constraints(withVisualFormat: "V:|[imageView]-([email protected])-[titleLabel]-([email protected])-[messageLabel]-([email protected])-|", options: [], metrics: nil, views: views) 
     imageHeightConstraint = NSLayoutConstraint(item: imageView, attribute: .height, relatedBy: .equal, toItem: imageView, attribute: .height, multiplier: 0, constant: 0) 
     constraints.append(imageHeightConstraint!) 

它的工作...幾乎沒有問題。 我沒有收到我想要的佈局,但我收到了一些可接受的佈局,並帶有一些錯誤。

但控制檯也報告一些事情,讓我令人擔憂:

可能至少在以下列表中的制約因素之一是你不想要一個 。嘗試這一點:(1)看看每個約束,並嘗試找出你不期望的 ; (2)找到添加了不想要的約束或約束並修復它的代碼。 ( 「」, 「」, 「」, 「」)

有人能幫助我嗎? 我對通用的NSLayoutConstraints沒有太多的經驗,特別是在Swift中。

如果你能幫助我獲得希望的佈局或修復控制檯想要修復的東西,那將是非常棒的。

非常感謝!

+0

創建手動約束是痛苦的。你是否嘗試過使用pod,如[Cartography](https://github.com/robb/Cartography)? – Macabeus

+0

還沒有。我可以使用它,但我會先看看其他答案。謝謝! – user3422907

回答

1

讓我們調試這個。如果您使用的是視覺格式約束,則該想法應該是對每個視圖都有一個HorizontalVertical約束。但是我發現你對視圖有很多限制。

此外,請記住將每個視圖的translateAutoresizingMask設置爲false

讓我們跟蹤約束條件。

constraints += NSLayoutConstraint.constraints(withVisualFormat: "H:|[imageView]-[titleLabel]|", options: [], metrics: nil, views: views) 

這裏ImageViewtitleLabel有1個horizo​​natal contsraints。繼續前進,我已將總數計算在下面。

constraints += NSLayoutConstraint.constraints(withVisualFormat: "V:|-([email protected])-[titleLabel]-([email protected])-|", options: [], metrics: nil, views: views) 
    constraints += NSLayoutConstraint.constraints(withVisualFormat: "V:|[imageView]-[messageLabel]-([email protected])-|", options: [], metrics: nil, views: views) 

    constraints += NSLayoutConstraint.constraints(withVisualFormat: "V:|[imageView]-([email protected])-[titleLabel]-([email protected])-[messageLabel]-([email protected])-|", options: [], metrics: nil, views: views) 

上述約束是相互矛盾的。 爲什麼?因爲您已經聲明Vertical限制[ImageView - messageLabel]而現在您正在製作[imageView - titleLabel - messageLabel]

imageHeightConstraint = NSLayoutConstraint(item: imageView, attribute: .height, relatedBy: .equal, toItem: imageView, attribute: .height, multiplier: 0, constant: 0) 

上述約束是沒有用的,也因爲你設置的imageView高度約束本身,它應該與它的superview或常數。

上面的計數,你有額外的約束說謊。

ImageView: H: 1 and V: 2 // You have extra height contraitns. 
    titleLabel: H: 1 and V: 2 
    messageLabel: H: 0 and V: 1 

答案很簡單,你只需要每個約束一個約束。對於例如

// ImageView contrainst 
    constraints += NSLayoutConstraint.constraints(withVisualFormat: "H:|[imageView]-[titleLabel]|", options: [], metrics: nil, views: views) 
    constraints(withVisualFormat: "V:|[imageView]-([email protected])-[titleLabel]-([email protected])-[messageLabel]-([email protected])-|", options: [], metrics: nil, views: views) 
0

您是否嘗試添加行yourView.translatesAutoresizingMaskIntoConstraints = false? 我以編程方式設置約束時遇到了這個問題,並添加了這一行,並沒有給我面臨的問題。