簡體   English   中英

如何確定NSLayoutConstraint是水平還是垂直?

[英]How to determine if NSLayoutConstraint is horizontal or vertical?

這看起來應該是一個簡單的任務,但有沒有辦法以編程方式告訴NSLayoutConstraint是水平還是垂直約束?

我能想到嘗試做出這種差異的唯一方法是調用[constraint description]; 然后在結果字符串中搜索"V:""H:"

我想找到這些信息的原因是我在storyboardprototype UITableViewCell上設置了兩個幾乎相同的約束,唯一的區別是一個描述了與superview的水平距離,另一個描述了垂直。 我想刪除垂直,以編程方式添加約束來描述在我的服務器返回某個參數的情況下添加的新視圖。

任何建議都會非常有幫助!

編輯:

我接受了greymouser的答案,因為他的解釋是一個很棒的答案,也是我最終解決這個描述的方式,但也想要歸功於@kongtomorrow,在greymouser在這里回答我之前也通過twitter建議了這個答案! 謝謝您的幫助!

這是我用來查找約束的實際代碼:

NSArray *constraints = [bubble constraints];

for (NSLayoutConstraint *constraint in constraints) {
    if ([[constraint firstItem] isEqual:messageLabel] && [[constraint secondItem] isEqual:bubble] && [constraint secondAttribute] == NSLayoutAttributeTop) {
        [bubble removeConstraint:constraint];
    }
}

上面匹配約束的firstItem,secondItem和secondAttribute,以合理確定我正在查看正確的約束,然后我刪除它並成功添加我的新約束描述!

並不是的。 VFL映射到底層的NSLayoutConstraint +:constraintWithItem:attribute:relatedBy:toItem:attribute:multiplier:constant: call。

但是,如果在約束上檢查firstAttribute或secondAttribute NSLayoutAttribute屬性,則可以推斷它是水平還是垂直。 如果你從VFL生成約束,它們可能不是非常復雜,所以這可能是一個簡單的推論。例如,如果在superview的設置為NSLayoutAttributeLeft遇到NSLayoutAttributeLeft而對於子視圖,則secondAttribute是NSLayoutAttributeLeft ,那么它可能是橫向的。 但只有可能。

您可能只想堅持解析描述,可能NSLayoutConstraint以添加水平/垂直屬性,或維護記錄H或V的字典中每個約束的輔助數據。

如果您特別要檢查與容器的視圖距離有關的約束,我認為這是可行的。 水平約束的第一個和第二個屬性是NSLayoutAttributeLeadingNSLayoutAttributeTrailing ,而Vertical約束將具有NSLayoutAttributeTopNSLayoutAttributeBottom

此外,如果使用IB設置這些約束,您實際上可以為它們創建出口。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM