6

我使用故事板設置了按鈕的約束。我在約束的屬性中看到了一個選項「標識符」。使用故事板中的標識符設置NSLayoutConstraint的引用

Screenshot of constraint's properties

我想對這個約束參考,以改變其值碼,移動對象。

我怎樣才能從這個標識符該NSLayoutContraint參考。

我閱讀文檔,它是這樣寫的

@interface NSLayoutConstraint (NSIdentifier) 
/* For ease in debugging, name a constraint by setting its identifier, which will be printed in the constraint's description. 
Identifiers starting with UI and NS are reserved by the system. 
*/ 
@property (nullable, copy) NSString *identifier NS_AVAILABLE_IOS(7_0); 

@end 

所以我意識到,這是用於調試目的。

如果我想要得到它,使用它?我看到這個鏈接,但沒有給出令人滿意的答案:How to get NSLayoutConstraint's identifier by Its pointer?

+0

在這裏http://useyourloaf.com/blog/using-identifiers-to-debug-autolayout.html –

+7

最好的解釋這簡單得多你們班約束鏈接到一個IBOutlet屬性。從「新引用出口」拖動,就像從任何其他元素(如標籤或文本字段)中拖出一樣。 – Paulw11

+0

謝謝你的建議,但我正在使用這個東西,所以想寫一小段代碼,所以我正在尋找更好的方法。 @ Paulw11 –

回答

8

我假設你有一個插座爲按鈕設置,所以你有一個可用的參考。所以首先,從您的按鈕中檢索視圖的約束。然後遍歷數組,並在每次迭代中比較每個約束的標識屬性與您在Interface Builder中輸入的值。看起來你在Objective-C編碼,所以Objective-C代碼示例如下。將@「標識符」更改爲您在Interface Builder中設置的任何值。

NSArray *constraints = [button constraints]; 
int count = [constraints count]; 
int index = 0; 
BOOL found = NO; 

while (!found && index < count) { 
    NSLayoutConstraint *constraint = constraints[index]; 
    if ([constraint.identifier isEqualToString:@"identifier"]) { 
     //save the reference to constraint 
     found = YES; 
    } 

    index++; 
} 
+0

約束不會存儲在按鈕本身。約束必須安裝在約束中涉及的所有視圖的共同祖先視圖上。它可能會安裝在最接近的共同祖先(這可能是其中一個涉及的觀點本身),但理論上可能在更遠的祖先上。對於問題中顯示的約束,它將位於按鈕的超級視圖上。這是爲什麼通過標識符搜索是如此糟糕的方法的一部分。 –

+0

@Ken Thomases是的,同意這是一個糟糕的選擇。但是,iOS開發人員堅持說,無論出於何種原因,他/她都想從代碼中檢索它。按鈕本身被用來說明邏輯,但是,是的,約束可以由視圖本身(寬度或高度)或父視圖保持,具體取決於約束的類型。 – strwils

+1

@KenThomases,感謝您的回答和評論,但我認爲它窮人迭代整個約束並罰款一個數組。就像我製作一組限制條件並從組中找到它們。 Apple必須允許用戶從其標識中找到約束。 –

16

斯威夫特3

let filteredConstraints = button.constraints.filter { $0.identifier == "identifier" } 
if let yourConstraint = filteredConstraints.first { 
     // DO YOUR LOGIC HERE 
} 
7

斯威夫特3

我寫了一個快速的NSView擴展,它很好地處理此。

extension NSView { 
    func constraint(withIdentifier: String) -> NSLayoutConstraint? { 
     return self.constraints.filter { $0.identifier == withIdentifier }.first 
    } 
} 

用法:

if let c = button.constraint(withIdentifier: "my-button-width") { 
    // do stuff with c 
} 
0

對於一個共同的看法容器這個作品內調整一組按鈕。每個子視圖/按鈕必須使用一個公共標識符(例如「高度」)。

@IBAction func btnPressed(_ sender: UIButton) { 
    for button in self.btnView.subviews{ 
     for constraint in button.constraints{ 
      if constraint.identifier == "height"{ 
       constraint.constant = constraint.constant == 0 ? 30:0 
      } 
     } 
    } 
    UIView.animate(withDuration: 0.3) {() -> Void in 
     self.view.layoutIfNeeded() 
    } 
} 
相關問題