6

Tôi đã đặt các ràng buộc của nút bằng bảng phân cảnh. Tôi thấy một tùy chọn, "Định danh" trong thuộc tính của ràng buộc.Lấy tham chiếu đến NSLayoutConstraint bằng cách sử dụng Mã định danh được đặt trong bảng phân cảnh

Screenshot of constraint's properties

Tôi muốn thực hiện một tài liệu tham khảo để hạn chế này, để thay đổi giá trị của nó trong mã, để di chuyển một đối tượng.

Làm cách nào tôi có thể tham chiếu đến số này NSLayoutContraint từ Số nhận dạng này.

Tôi đọc tài liệu, nó được viết như thế này

@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 

Vì vậy, tôi nhận ra rằng đó là cho mục đích gỡ lỗi.

Điều gì xảy ra nếu tôi muốn nhận và sử dụng? Tôi đã thấy liên kết này, nhưng không có câu trả lời thỏa đáng nào được đưa ra: How to get NSLayoutConstraint's identifier by Its pointer?

+0

giải thích tốt nhất ở đây http://useyourloaf.com/blog/using-identifiers-to-debug-autolayout.html –

+7

Nó đơn giản hơn nhiều để liên kết các hạn chế đối với một tài sản IBOutlet trong lớp học của bạn. Kéo từ "cửa hàng tham chiếu mới" giống như bạn làm từ bất kỳ phần tử nào khác, chẳng hạn như trường nhãn hoặc trường văn bản. – Paulw11

+0

Cảm ơn bạn đã gợi ý, nhưng điều này tôi đang sử dụng, vì vậy muốn viết đoạn mã nhỏ hơn, vì vậy tôi đang tìm kiếm một cách tốt hơn. @ Paulw11 –

Trả lời

8

Tôi giả sử bạn có một lối thoát được thiết lập cho nút để bạn có sẵn tham chiếu đến nó. Đầu tiên, lấy các ràng buộc của khung nhìn từ nút của bạn. Sau đó lặp qua mảng và trên mỗi lần lặp so sánh thuộc tính định danh của mỗi ràng buộc với giá trị bạn đã nhập trong Trình tạo giao diện. Có vẻ như bạn đang mã hóa trong Objective-C, vì vậy mẫu mã Objective-C bên dưới. Thay đổi @ "số nhận dạng" thành bất kỳ giá trị nào bạn đặt trong Trình tạo giao diện.

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

Ràng buộc sẽ không được lưu trữ trên chính nút đó. Các ràng buộc phải được cài đặt trên một khung nhìn tổ tiên chung của tất cả các khung nhìn có liên quan đến ràng buộc. Nó có lẽ sẽ được cài đặt trên tổ tiên chung gần nhất (có thể là một trong những quan điểm liên quan, chính nó) nhưng, theo lý thuyết, có thể là một tổ tiên xa hơn. Đối với các ràng buộc được hiển thị trong câu hỏi, nó sẽ được trên superview của nút. Đó là một phần lý do tại sao tìm kiếm theo định danh là một cách tiếp cận nghèo nàn như vậy. –

+0

@Ken Thomases Vâng, đã đồng ý rằng đó là một lựa chọn tồi. Tuy nhiên, Nhà phát triển iOS đã khăng khăng rằng anh/cô ấy muốn lấy nó từ mã vì bất kỳ lý do gì. Bản thân nút được sử dụng để minh họa logic, nhưng có, ràng buộc có thể được giữ bởi chính khung nhìn (chiều rộng hoặc chiều cao) hoặc khung nhìn cha mẹ tùy thuộc vào loại ràng buộc. – strwils

+1

@KenThomases, Cảm ơn bạn đã trả lời và nhận xét, nhưng tôi nghĩ rằng người nghèo của mình phải lặp lại toàn bộ ràng buộc và tốt nhất từ ​​mảng. Nó giống như tôi tạo ra một nhóm các ràng buộc và tìm chúng từ nhóm. Apple phải cho phép người dùng tìm thấy ràng buộc từ mã định danh của nó. –

16

Trong Swift 3,

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

Swift 3

tôi đã viết một phần mở rộng NSView nhanh chóng mà xử lý độc đáo này.

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

Cách sử dụng:

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

Đối với thay đổi kích thước một tập hợp các nút trong một container điểm chung các công trình này. Mỗi nút con/nút phải sử dụng số nhận dạng chung (ví dụ: "chiều cao").

@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() 
    } 
} 
Các vấn đề liên quan