從iOS 8 SDK開始,現在有identifier
property on NSLayoutConstraint。請注意,此屬性自iOS 7起私人存在(僅適用於Apple),但現在已在iOS 8中公開,即使在iOS 7上運行時也允許使用該屬性。
使用此屬性可以輕鬆地爲您的約束設置一個獨特的簡短描述來幫助調試。例如,使用:
NSLayoutConstraint *constraint = [label autoPinEdge:ALEdgeLeft toEdge:ALEdgeRight ofView:imageView];
constraint.identifier = @"Label Left Padding";
// ...or using PureLayout v2.0+:
[[label autoPinEdge:ALEdgeLeft toEdge:ALEdgeRight ofView:imageView] autoIdentify:@"Label Left Padding"];
// PureLayout v2.0+ also supports a block-based version to set an identifier to many constraints at once:
[UIView autoSetIdentifer:@"Constraints to position image view" forConstraints:^{
// ...a bunch of PureLayout API calls here that create constraints...
}];
然後,你會看到這個標識旁邊控制檯約束打印,如果有一個約束的例外。
另一個方便的調試工具:
蘋果對UIView的命名UIConstraintBasedLayoutDebugging
一個非常方便的類別(在UIView.h
聲明),其中包括一個方法:
- (NSArray *)constraintsAffectingLayoutForAxis:(UILayoutConstraintAxis)axis;
您可以調用此方法在任何視圖,傳遞水平軸或垂直軸(因爲每個軸的約束都是獨立的),並獲取影響沿該軸的位置和大小的所有約束的列表。請注意,Apple表示這應該只用於調試 - 絕不會發布使用此API的代碼!
您可以調用'_subtreeDescription'通過增加對'UIView'臨時類聲明的方法 - 讓編譯器不會抱怨 - 然後就調用它。 – ravron 2014-09-02 13:59:24
如果可能,你能舉一個例子嗎?我不確定我是否遵守。 – dMurdZ 2014-09-02 14:03:21
在進一步調查中,'_subtreeDescription'只能在NSView(OS X)上使用,而不能在UIView中使用,所以這種方法不會對你有所幫助。您可能需要仔細查看日誌消息以查找相關視圖的內存地址。然後,嘗試通過在適當的地方暫停執行來檢查您的子視圖的地址來找到該視圖。或者,使用lldb遞歸地詢問違規視圖的超級視圖。這會讓你追溯它的祖先。 – ravron 2014-09-02 14:11:30