Swift 更新 addConstraint
Swift update addConstraint
我在更新约束时遇到问题。
我使用这段代码添加约束。
var oldHeight = 92 + ((catAmount-10)*100)
self.mainViewport.addConstraint(NSLayoutConstraint(item: self.mainViewport, attribute: .Height, relatedBy: NSLayoutRelation.Equal, toItem: nil, attribute: .NotAnAttribute, multiplier: 0, constant: CGFloat(oldHeight)))
此代码 100% 有效,但是当用户向下滚动时,我需要向 ViewController 添加更多信息,因此我需要将约束更新为。但我得到蚂蚁错误。
无法同时满足约束条件。
可能至少以下列表中的约束之一是您不想要的。试试这个:(1)查看每个约束并尝试找出您不期望的; (2) 找到添加了不需要的约束或约束的代码并修复它。 (注意:如果您看到不理解的 NSAutoresizingMaskLayoutConstraints,请参阅 UIView 属性 translatesAutoresizingMaskIntoConstraints 的文档)
(
"",
“”
)
我尝试通过以下代码删除约束:
self.mainViewport.removeConstraint(NSLayoutConstraint(item: self.mainViewport, attribute: .Height, relatedBy: NSLayoutRelation.Equal, toItem: nil, attribute: .NotAnAttribute, multiplier: 0, constant: CGFloat(oldHeight)))
但它不会删除旧的,所以我无法添加新的或更新约束。
我做错了什么?如何在需要时不断更新约束?
P.S。我正在使用 ScrollViewController 和一个包含信息的 ViewController。
代码更新。
class CategoryViewController: UIViewController, UIScrollViewDelegate {
var CategoriesConstraint : NSLayoutConstraint!
/** **/
var aukstis = 92 + (catAmount*100)
self.mainViewport.setTranslatesAutoresizingMaskIntoConstraints(false)
self.CategoriesConstraint = NSLayoutConstraint(item: self.mainViewport, attribute: .Height, relatedBy: NSLayoutRelation.Equal, toItem: nil, attribute: .NotAnAttribute, multiplier: 0, constant: CGFloat(aukstis))
if(catAmount == 10){
self.mainViewport.addConstraint(self.CategoriesConstraint)
self.showApp(1,secondJson: 0)
} else {
self.CategoriesConstraint.constant = CGFloat(aukstis)
self.mainViewport.updateConstraints()
self.mainViewport.setNeedsLayout()
self.mainViewport.layoutIfNeeded()
}
您需要保留对原始约束的引用(在您创建它时返回),以便您可以更新它(最好,或者在需要时删除它)。
请注意,删除在您当前的代码中不起作用,因为您正在创建一个新约束并尝试将其删除,但它实际上尚未附加到视图。
self.xxxConstraint = NSLayoutConstraint(item: self.mainViewport, attribute: .Height, relatedBy: NSLayoutRelation.Equal, toItem: nil, attribute: .NotAnAttribute, multiplier: 0, constant: CGFloat(oldHeight))
self.mainViewport.addConstraint(self.xxxConstraint)
我在更新约束时遇到问题。
我使用这段代码添加约束。
var oldHeight = 92 + ((catAmount-10)*100)
self.mainViewport.addConstraint(NSLayoutConstraint(item: self.mainViewport, attribute: .Height, relatedBy: NSLayoutRelation.Equal, toItem: nil, attribute: .NotAnAttribute, multiplier: 0, constant: CGFloat(oldHeight)))
此代码 100% 有效,但是当用户向下滚动时,我需要向 ViewController 添加更多信息,因此我需要将约束更新为。但我得到蚂蚁错误。
无法同时满足约束条件。 可能至少以下列表中的约束之一是您不想要的。试试这个:(1)查看每个约束并尝试找出您不期望的; (2) 找到添加了不需要的约束或约束的代码并修复它。 (注意:如果您看到不理解的 NSAutoresizingMaskLayoutConstraints,请参阅 UIView 属性 translatesAutoresizingMaskIntoConstraints 的文档) ( "", “” )
我尝试通过以下代码删除约束:
self.mainViewport.removeConstraint(NSLayoutConstraint(item: self.mainViewport, attribute: .Height, relatedBy: NSLayoutRelation.Equal, toItem: nil, attribute: .NotAnAttribute, multiplier: 0, constant: CGFloat(oldHeight)))
但它不会删除旧的,所以我无法添加新的或更新约束。
我做错了什么?如何在需要时不断更新约束?
P.S。我正在使用 ScrollViewController 和一个包含信息的 ViewController。
代码更新。
class CategoryViewController: UIViewController, UIScrollViewDelegate {
var CategoriesConstraint : NSLayoutConstraint!
/** **/
var aukstis = 92 + (catAmount*100)
self.mainViewport.setTranslatesAutoresizingMaskIntoConstraints(false)
self.CategoriesConstraint = NSLayoutConstraint(item: self.mainViewport, attribute: .Height, relatedBy: NSLayoutRelation.Equal, toItem: nil, attribute: .NotAnAttribute, multiplier: 0, constant: CGFloat(aukstis))
if(catAmount == 10){
self.mainViewport.addConstraint(self.CategoriesConstraint)
self.showApp(1,secondJson: 0)
} else {
self.CategoriesConstraint.constant = CGFloat(aukstis)
self.mainViewport.updateConstraints()
self.mainViewport.setNeedsLayout()
self.mainViewport.layoutIfNeeded()
}
您需要保留对原始约束的引用(在您创建它时返回),以便您可以更新它(最好,或者在需要时删除它)。
请注意,删除在您当前的代码中不起作用,因为您正在创建一个新约束并尝试将其删除,但它实际上尚未附加到视图。
self.xxxConstraint = NSLayoutConstraint(item: self.mainViewport, attribute: .Height, relatedBy: NSLayoutRelation.Equal, toItem: nil, attribute: .NotAnAttribute, multiplier: 0, constant: CGFloat(oldHeight))
self.mainViewport.addConstraint(self.xxxConstraint)