2015-03-04 15 views
8

Trong một số dự án mà tôi cố gắng tìm hiểu có một số mã:SetTranslatesAutoresizingMaskIntoConstraints: NO cho là gì?

[[[self foregroundContentView] contentView] addSubview:[self hueLabel]]; 
[[[self foregroundContentView] contentView] addSubview:[self hueSlider]]; 

[[[self foregroundContentView] contentView] addSubview:[self saturationLabel]]; 
[[[self foregroundContentView] contentView] addSubview:[self saturationSlider]]; 

[[[self foregroundContentView] contentView] addSubview:[self brightnessLabel]]; 
[[[self foregroundContentView] contentView] addSubview:[self brightnessSlider]]; 

[[[self foregroundContentView] contentView] addSubview:[self saveButton]]; 


[[self foregroundContentScrollView] addSubview:[self foregroundContentView]]; 
[[self foregroundContentScrollView] addSubview:[self imageView]]; 

[[self view] addSubview:[self backgroundView]]; 
[[self view] addSubview:[self foregroundContentScrollView]]; 

Mỗi điểm có một bộ tài sản setTranslatesAutoresizingMaskIntoConstraints để NO, ví dụ:

[[self saveButton] setTranslatesAutoresizingMaskIntoConstraints:NO]; 

Sau đó, nó cho biết thêm một số trở ngại đối với những quan điểm :

NSDictionary* views = @{ 
         @"backgroundView" : [self backgroundView], 
         @"foregroundContentScrollView" : [self foregroundContentScrollView], 
         @"foregroundContentView" : [self foregroundContentView], 
         @"hueLabel" : [self hueLabel], 
         @"hueSlider" : [self hueSlider], 
         @"saturationLabel" : [self saturationLabel], 
         @"saturationSlider" : [self saturationSlider], 
         @"brightnessLabel" : [self brightnessLabel], 
         @"brightnessSlider" : [self brightnessSlider], 
         @"saveButton" : [self saveButton], 
         @"imageView" : [self imageView] 
         }; 

[[self view] addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[backgroundView]|" options:0 metrics:nil views:views]]; 
[[self view] addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[backgroundView]|" options:0 metrics:nil views:views]]; 

[[self view] addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[foregroundContentScrollView]|" options:0 metrics:nil views:views]]; 
[[self view] addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[foregroundContentScrollView]|" options:0 metrics:nil views:views]]; 

[[self view] addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[foregroundContentView]|" options:0 metrics:nil views:views]]; 
[[self view] addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[foregroundContentView]|" options:0 metrics:nil views:views]]; 

[[self view] addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[hueLabel]-|" options:0 metrics:nil views:views]]; 
[[self view] addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[hueSlider]-|" options:0 metrics:nil views:views]]; 
[[self view] addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[saturationLabel]-|" options:0 metrics:nil views:views]]; 
[[self view] addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[saturationSlider]-|" options:0 metrics:nil views:views]]; 
[[self view] addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[brightnessLabel]-|" options:0 metrics:nil views:views]]; 
[[self view] addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[brightnessSlider]-|" options:0 metrics:nil views:views]]; 
[[self view] addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[saveButton]-|" options:0 metrics:nil views:views]]; 
[[self view] addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[imageView(==foregroundContentScrollView)]|" options:0 metrics:nil views:views]]; 

[[self view] addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-(>=30)-[hueLabel]-[hueSlider]-[saturationLabel]-[saturationSlider]-[brightnessLabel]-[brightnessSlider]-[saveButton]-(>=10)-[imageView(==200)]|" options:0 metrics:nil views:views]]; 

Các câu hỏi là:

  • setTranslatesAutoresizingMaskIntoConstraints:NO là gì? Tại sao khi tôi loại bỏ một trong những dòng với phương pháp đó, sau đó tất cả mọi thứ bị hỏng?
  • dòng đó làm gì?

    [[self view] addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[foregroundContentScrollView]|" options:0 metrics:nil views:views]]; 
    

Trả lời

16

Bố cục tự động là một tính năng tương đối gần đây. Điều đó có nghĩa là có ba loại mã trên mạng:

  • Mã không biết bố cục tự động. Nó sử dụng phương pháp tiếp cận lò xo-và-struts bởi vì nó không biết về bất cứ điều gì khác.
  • Mã nhận biết bố cục tự động nhưng chọn sử dụng lò xo và thanh chống, ít nhất trong một số trường hợp.
  • Mã sử ​​dụng bố cục tự động.

Điều này áp dụng cho mã của bạn, mã của khung công tác (UIKit) và mã của thư viện của bên thứ ba.

Do sự tồn tại của loại mã đầu tiên, tất cả các chế độ xem phải có hành vi lò xo và thanh chống cũ theo mặc định. Mã đó là nhận thức của bố trí tự động có thể biến rằng nếu nó muốn, nhưng mã mà không biết rõ ràng là không thể bật nó lên, bởi vì nó không biết nó có hoặc những gì tài sản để thiết lập để làm như vậy.

Bởi vì hành vi cũ của lò xo và thanh chống xung đột với hầu hết các cách bố cục tự động được sử dụng, mã sử dụng bố cục tự động thường phải tắt. Làm như vậy bằng cách đặt thuộc tính translatesAutoresizingMaskIntoConstraints thành NO.

Quyết định đó phải được để lại mã bộ điều khiển đặt chế độ xem được đề cập vào cấu trúc phân cấp, vì chỉ có mã đó mới biết cách sắp xếp chế độ xem trong bố cục (hoặc, trong trường hợp loại đầu tiên của mã, không "biết" nhưng sử dụng lò xo-và-struts ra khỏi sự thiếu hiểu biết).

Nếu bạn thất bại trong việc xóa translatesAutoresizingMaskIntoConstraints trong mã điều khiển của bạn có sử dụng bố trí tự động, bạn sẽ thường nhận trường hợp ngoại lệ do hạn chế về không thể thoả mãn.Các ngoại lệ sẽ bị bắt và hầu hết bị bỏ qua, nhưng hệ thống bố trí tự động sẽ phải bỏ qua một số ràng buộc của bạn để hoàn thành bố cục. Kết quả là, quan điểm của bạn có thể được đặt ra không chính xác.

dòng này:

[[self view] addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[foregroundContentScrollView]|" options:0 metrics:nil views:views]]; 

thêm trở ngại mà giữ foregroundContentScrollView điền SuperView của nó theo chiều ngang. Cạnh hàng đầu của chế độ xem đó sẽ được thực hiện để ngang bằng cạnh hàng đầu của superview, và cạnh sau của nó sẽ được thực hiện bằng cạnh của nó.

+0

Ý bạn là gì theo cách tiếp cận * lò xo và thanh chống *? – Honey

+1

Đó là cách thông tục mô tả cơ chế tự động hóa trước khi bố cục tự động được giới thiệu. Một mô tả các khía cạnh nào về kích thước của khung nhìn và quan hệ với người giám sát của nó là linh hoạt (giống như mùa xuân) và được cố định (kiểu tương tự) bằng cách sử dụng mặt nạ tự động hóa. Xem 'autoresizingMask' và' autoresizesSubviews'. –

0

của nó một cách cho quan điểm rằng đang sử dụng bố trí tự động bỏ qua suối cũ và thanh chống bố trí. Xem

https://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/AutolayoutPG/AdoptingAutoLayout/AdoptingAutoLayout.html

liên kết này cho một lời giải thích tuyệt vời. Nếu bạn muốn sử dụng bố trí tự động như bạn đang có, bạn sẽ muốn nghe bố trí tự động và không phải là lò xo và thanh chống. Đó là lý do tại sao nó được đặt thành NO.

Các vấn đề liên quan