您可以在不使用Storyboard的情况下在AutoLayout控制台输出中标记视图吗?

Gar*_*sco 4 cocoa-touch ios autolayout

我正在观看关于AutoLayout的WWDC会谈,并且我已经了解到在视图上设置StoryboardID会使控制台输出的约束冲突更容易阅读(即您获得的是名称而不仅仅是地址).它们向您展示在Interface Builder中设置StoryboardID(以前只是"标识符")的位置,但有没有办法在代码中执行此操作?我正在尝试调试一组我自己没有编写的大而复杂的视图,这是一个100%编程的应用程序,它具有许多不可满足的约束,并且(不知何故)在iOS 7中工作但在iOS中开始破解我希望能够清楚地了解哪个<UIView:0x8675309>实际上导致了这个问题.

我查看了UIView类的引用,没有找到"Identifier"或"StoryboardID".

如果答案是"不",那不会太惊讶.毕竟它被称为故事板ID是有原因的.但我希望得到一个确认,以及一个解决方法,以使AutoLayout控制台转储更可读.

Chr*_*hey 8

我参加聚会有点晚了,但我希望这会有所帮助。UIView 确实有一个非常简单的属性,通过它符合UIAccessibilityIdentification:

centerView.accessibilityIdentifier = "Center Foobar View"
containerView.accessibilityIdentifier = "Container BingBat View"
Run Code Online (Sandbox Code Playgroud)

这会产生您期望的调试器输出:

"<NSLayoutConstraint:0x7fe3fa3ade50 Center Foobar View.centerX == Container BingBat View.centerX (Names: Center Foobar View:0x7fe3fa3a1700, Container BingBat View:0x7fe3fa3856c0 )>",


mat*_*att 7

我希望能够清楚地了解哪个实际上导致了问题.

我有两个建议.

  1. 在Xcode中,在相同的应用程序运行期间(最好是在获得某些关于约束的控制台转储后),选择Debug - > View Debugging - > Capture View Hierarchy.

    应用程序暂停,您将看到您的视图层次结构.选择一个视图,然后在Object Inspector中显示其内存地址.当你找到一个地址的0x8675309那个时,就是那个.另外,您可以在Size Inspector中看到定位此视图的约束.

  2. 实现我在本书中提供的约束记录器实用程序.第二个报告视图层次结构以及标识符和约束.

这是公用事业; 在他们之间,我节省了数小时的困惑:

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)
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)