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

问题描述 投票:1回答:2

总是遇到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  

任何解决这个问题的提示都是值得欢迎的。

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

ios cocoa-touch swift3 nslayoutconstraint
2个回答
1
投票

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

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

关键是使类@IBDesignable - 允许Interface Builder和Auto-Layout引擎使用类的内在大小来正确地调整大小/位置/显示它。

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


1
投票

Epilogue

这个问题自己消失了。

继续练习,Xcode IDE强调了视图设计中的一些关键点,我被邀请“点击图标”进行修复;其中一个问题与冲突的约束有关。

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

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

我的想法是,Apple必须更新它自己的在线文档,以避免人们放松心情,试图弄清楚为什么事情不会像预期的那样发挥作用。

© www.soinside.com 2019 - 2024. All rights reserved.