我正在看WWDC关于AutoLayout的谈话,并且我了解到,在视图上设置StoryboardID会使控制台输出的约束冲突更容易阅读(即,您得到一个名称而不只是一个地址)。他们向您展示了在Interface Builder中在何处设置StoryboardID(以前只是“标识符”),但是有没有办法在代码中进行设置?我正在尝试在一个100%编程的,具有许多无法满足的约束的应用程序中调试我自己未编写的大量复杂视图,并且(在某种程度上)在iOS 7中工作但在iOS中开始崩溃8.我希望清楚了解<UIView:0x8675309>
实际上是引起问题的原因。
我查看了UIView类引用,没有找到“标识符”或“ StoryboardID”。
如果答案是“不”,也不会太惊讶。毕竟,将其称为情节提要ID是有原因的。但是,我希望能收到一个确认和一个解决方法,以使AutoLayout控制台转储更具可读性。
我希望清楚了解实际上是引起问题的原因。
我有两个建议。
在Xcode中,在应用程序的同一次运行期间(最好在获得有关约束的控制台转储后立即运行),选择Debug-> View Debugging-> Capture View Hierarchy。
该应用程序暂停,并显示视图层次结构。选择一个视图,然后在对象检查器中显示其内存地址。当您找到地址为的地址时0x8675309
,就是那个地址。另外,您还可以在“大小”检查器中看到将该视图定位的约束。
实现我在书中提供的约束记录器实用程序。第二篇报告了视图层次结构以及标识符和约束。
这是实用程序;在他们之间,我节省了数小时的困惑:
extension NSLayoutConstraint {
class func reportAmbiguity (var v:UIView?) {
if v == nil {
v = UIApplication.sharedApplication().keyWindow
}
for vv in v!.subviews as [UIView] {
println("\(vv) \(vv.hasAmbiguousLayout())")
if vv.subviews.count > 0 {
self.reportAmbiguity(vv)
}
}
}
class func listConstraints (var v:UIView?) {
if v == nil {
v = UIApplication.sharedApplication().keyWindow
}
for vv in v!.subviews as [UIView] {
let arr1 = vv.constraintsAffectingLayoutForAxis(.Horizontal)
let arr2 = vv.constraintsAffectingLayoutForAxis(.Vertical)
NSLog("\n\n%@\nH: %@\nV:%@", vv, arr1, arr2);
if vv.subviews.count > 0 {
self.listConstraints(vv)
}
}
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句