2017-04-14 95 views
0

我們假設CustomView's大小爲300x300。 iconImageView有它的大小和分配的約束。我不知道要在UILabel多久才能成爲文字,所以我不想讓大小不一的UILabel。我的目標是將左側約束固定在iconImageView的右側,並且右側固定到customView用SnapKit自動調整UILabel

override func updateConstraints() { 
    super.updateConstraints() 

    iconImageView.snp.updateConstraints { (make) in 
     make.left.equalTo(customView).offset(10) 
     make.centerY.equalTo(customView) 
     make.size.equalTo(CGSize(width: 40.0, height: 40.0)) 
    } 

    nameLabel.snp.updateConstraints { (make) in 
     make.right.equalTo(customView).offset(-10) 
     make.left.equalTo(iconImageView.snp.right).offset(10) 
     make.centerY.equalTo(customView) 
    } 
} 

當我試試這個方法,我得到錯誤:Unable to simultaneously satisfy constraints.怎樣做這一個適當的方式?

+0

hmmm ...我剛試過你的代碼,它工作正常。我假設這個代碼是在'UIView'子類中? *該*視圖相對於其SuperView有適當的約束?而'customView'有適當的限制,使其300x300和位於該視圖內? – DonMag

+0

此代碼位於UIView子類中,並且相對於超級視圖具有適當的約束。當我滑動到另一個ViewController時出錯,因爲這個視圖是UIPageViewController的一部分。 – Billy

+0

嗯......猜猜我們需要更多關於何時出現錯誤的信息。不過,您應該首先閱讀有關在此處重寫'updateConstraints()'的討論(它可能只是爲您提供所需的信息):https://developer.apple.com/reference/uikit/uiview/1622512 -updateconstraints – DonMag

回答

0

那麼,我想你的子視圖不知道任何有關頂部/底部約束,這意味着該視圖不知道如何重新佈局自己。試試這個:

override func updateConstraints() { 
    super.updateConstraints() 

    iconImageView.snp.updateConstraints { (make) in 
     make.left.equalTo(customView).offset(10) 
     make.centerY.equalTo(customView) 

     // Also from my point of view this line \/ 
     // is not very readable 
     // make.size.equalTo(CGSize(width: 40.0, height: 40.0)) 
     // Changed to: 
     make.width.height.equalTo(40.0) 
    } 

    nameLabel.snp.updateConstraints { (make) in 
     make.right.equalTo(customView).offset(-10) 
     make.left.equalTo(iconImageView.snp.right).offset(10) 

     // Add: 
     make.top.equalTo(customView.snp.top) 
     make.bottom.equalTo(customView.snp.bottom) 
    } 
} 

如果你想保持你的標籤的「默認」的高度(空字符串等情況下),你可以添加:

make.height.greaterThanOrEqual(40.0) 

也自動佈局和框架沒有所以你應該在「updateConstraints」方法中佈局你的自定義視圖,類似於:

customView.snp.updateConstraints { (make) in 
    make.edges.equalTo(self) 
}