繁体   English   中英

iOS 11:“无法同时满足约束”

[英]iOS 11: “Unable to simultaneously satisfy constraints”

总是遇到 FoodTracker教程; 遵循此步骤:“实现自定义控件”

https://developer.apple.com/library/content/referencelibrary/GettingStarted/DevelopiOSAppsSwift/ImplementingACustomControl.html#//apple_ref/doc/uid/TP40015214-CH19-SW1

并且在执行第一个检查点时,模拟器显示红色矩形而不是教程中指示的正方形; 在调试窗格中,我得到:

2018-02-09 11:19:42.130595+0100 FoodTracker[7439:80369] [MC] Lazy loading NSBundle MobileCoreServices.framework  
2018-02-09 11:19:42.131628+0100 FoodTracker[7439:80369] [MC] Loaded MobileCoreServices.framework  
2018-02-09 11:19:42.165143+0100 FoodTracker[7439:80369] [LayoutConstraints] Unable to simultaneously satisfy constraints.  
    Probably at least one of the constraints in the following list is one you don't want.  
    Try this:  
        (1) look at each constraint and try to figure out which you don't expect;  
        (2) find the code that added the unwanted constraint or constraints and fix it.  
(  
    "<NSLayoutConstraint:0x60400028a3c0 UIButton:0x7f8a0bd0e330.width == 44   (active)>",  
    "<NSLayoutConstraint:0x60400028cda0 'UISV-canvas-connection' FoodTracker.RatingControl:0x7f8a0bd08890.leading == UIButton:0x7f8a0bd0e330.leading   (active)>",  
    "<NSLayoutConstraint:0x60400028ce40 'UISV-canvas-connection' H:[UIButton:0x7f8a0bd0e330]-(0)-|   (active, names: '|':FoodTracker.RatingControl:0x7f8a0bd08890 )>",  
    "<NSLayoutConstraint:0x60400028c940 'UIView-Encapsulated-Layout-Width' FoodTracker.RatingControl:0x7f8a0bd08890.width == 200   (active)>"  
)  

Will attempt to recover by breaking constraint  
<NSLayoutConstraint:0x60400028a3c0 UIButton:0x7f8a0bd0e330.width == 44   (active)>  

Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger.  
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKit/UIView.h> may also be helpful.  
2018-02-09 11:19:42.165949+0100 FoodTracker[7439:80369] [LayoutConstraints] Unable to simultaneously satisfy constraints.  
    Probably at least one of the constraints in the following list is one you don't want.  
    Try this:  
        (1) look at each constraint and try to figure out which you don't expect;  
        (2) find the code that added the unwanted constraint or constraints and fix it.  
(  
    "<NSLayoutConstraint:0x60400028a370 UIButton:0x7f8a0bd0e330.height == 44   (active)>",  
    "<NSLayoutConstraint:0x60400028a320 'UISV-canvas-connection' FoodTracker.RatingControl:0x7f8a0bd08890.top == UIButton:0x7f8a0bd0e330.top   (active)>",  
    "<NSLayoutConstraint:0x60400028cf30 'UISV-canvas-connection' V:[UIButton:0x7f8a0bd0e330]-(0)-|   (active, names: '|':FoodTracker.RatingControl:0x7f8a0bd08890 )>",  
    "<NSLayoutConstraint:0x60400028c990 'UIView-Encapsulated-Layout-Height' FoodTracker.RatingControl:0x7f8a0bd08890.height == 110   (active)>"  
)  

Will attempt to recover by breaking constraint  
<NSLayoutConstraint:0x60400028a370 UIButton:0x7f8a0bd0e330.height == 44   (active)>  

Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger.  
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKit/UIView.h> may also be helpful.  

我认为以编程方式创建按钮并在此处应用自定义约束时会发生一些变化:(我正在使用 Swift 和 Xcode 9)

// Add constraints  
button.translatesAutoresizingMaskIntoConstraints = false  
button.heightAnchor.constraint(equalToConstant: 44.0).isActive = true  
button.widthAnchor.constraint(equalToConstant: 44.0).isActive = true  

欢迎任何解决问题的提示。

请注意,我正在构建一个自定义控件......我在谷歌上搜索的所有注释似乎都不适用。

结语

这个问题自己消失了。

继续练习,Xcode IDE 强调了视图设计的一些关键点,我被邀请“单击图标”进行修复; 这个问题之一与相互冲突的限制有关。

正如#DonMag 所建议的那样,RatingControl 类必须标记为@IBDesignable(此装饰器将在稍后的练习中添加),以便让 Xcode 立即查看自定义控件的最终结果。 几乎:星星不会出现并且控件不会自动缩放将星星添加到控件属性。 直到我关闭,再次打开并多次重建整个项目。

教程(为 Swift 3.2 编写)和实际 Xcode(在 Swift 4 中打开的默认项目适用)的差异。

我的想法是 Apple 必须更新它自己的在线文档,以避免人们在试图弄清楚为什么事情不像预期的那样工作时失去理智。

忽略我的前两个评论...

在该教程中,您将自定义ratingControl添加为垂直堆栈视图的排列子视图。 这就是为什么不需要约束的原因。

关键是使类@IBDesignable - 允许界面生成器和自动布局引擎使用类的固有大小来正确调整大小/位置/显示它。

(只是有点令人惊讶,它没有在教程中注明。)

我有同样的问题。 此外,红色方块看起来比教程中显示的要大。 对于红色方块接受尺寸44的约束,我不得不确保RatingControl被定位堆栈视图,而不是下方。

我附上了图像以澄清我所说的“内部”堆栈视图的含义。

错误重现,请注意堆栈视图层次结构外的红色矩形

错误已修复,红色矩形位于左侧的堆栈视图层次结构内

问题的发生是因为所有子视图的总宽度不等于 StackView 的宽度。

使用此计算可以解决问题:

let width = (self.frame.width - self.spacing * CGFloat(starCount-1))/CGFloat(starCount)
let height = self.frame.height

………………

for _ in 0..<starCount {
        let button = UIButton()
        button.translatesAutoresizingMaskIntoConstraints = false
        button.backgroundColor = UIColor.red
        button.heightAnchor.constraint(equalToConstant: height).isActive = true
        button.widthAnchor.constraint(equalToConstant: width).isActive = true
        button.addTarget(self, action: #selector(RatingControl.ratingButtonTapped(button:)), for: .touchUpInside)
        addArrangedSubview(button)
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM