2013-10-31 12 views
16

Tôi có một cái nhìn bảng và một ô bên trong nó. Ô chứa ba nhãn: nhãn tiêu đề và hai nhãn bên dưới một nhãn với nhau. Đôi khi, tôi cần ẩn hai nhãn đó bên dưới nếu chúng không chứa dữ liệu và thay đổi "Không gian trên cùng thành vùng chứa" của "Nhãn tiêu đề" thành "Trung tâm Y thành vùng chứa". Và tất nhiên trở lại các ràng buộc trở lại khi hai nhãn chứa dữ liệu. Dưới đây là một ảnh chụp màn hình của dự án trình diễn đơn giản chỉ để thể hiện ý tưởng:Làm thế nào để thay đổi ràng buộc nhãn trong thời gian chạy?

enter image description here

CẬP NHẬT Max MacLeod câu trả lời chỉ để đi đúng hướng. Bí quyết là đẩy nhãn tiêu đề xuống khi nhãn thứ nhất và thứ hai bị ẩn. Vì vậy, chúng tôi cần đặt không gian dưới cùng cho chế độ xem vùng chứa cho nhãn đầu tiên và thứ hai thay vì tạo không gian trên cùng cho chế độ xem vùng chứa cho nhãn tiêu đề. Và ẩn/unhiding nên được thực hiện bằng cách có chiều cao cửa hàng (chiều cao hạn chế cho nhãn đầu tiên và thứ hai) và thiết lập giá trị liên tục của họ bằng không (và thiết lập giá trị trở lại khi unhiding). Tôi cũng đã tải lên số source code example to Github.

Trả lời

32

Chọn nhãn tiêu đề, và một trong những nhãn thấp hơn, và thêm một hạn chế không gian dọc mới phản ánh khoảng cách giữa chúng. Tiếp theo, loại bỏ nhãn tiêu đề Không gian trên cùng để hạn chế vùng chứa. Có thể bạn đã có điều này (không thể nhìn thấy từ màn hình lấy). Nếu bạn làm thế, điều đó tốt.

Bây giờ, hãy tạo hai giới hạn chiều cao cho mỗi nhãn thấp hơn. IBOutlet những người đến lớp học của bạn.

Sau đó, ẩn hai nhãn thấp hơn bất cứ khi nào bạn cần bằng cách đặt từng giới hạn độ cao constant thành 0.f.

Điều đó sẽ hiển thị chúng ẩn và hạ thấp nhãn tiêu đề ở trên để nó bây giờ được đặt ở giữa theo chiều dọc Y trong vùng chứa.

Sẽ thực hiện lại các bước một lần nữa (quá dài để nhận xét!). Chuỗi các vấn đề với IB là đầu tiên bạn phải thêm một ràng buộc mới trước khi bạn có thể xóa một cái cũ. Tạm thời bạn sẽ có một hạn chế thừa. Đó là bởi vì IB sẽ không cho phép sự mơ hồ. Vì vậy, trước tiên thêm ràng buộc không gian dọc mới. Điều đó sẽ xác định vị trí Y của nhãn trên. Sau đó, loại bỏ không gian dọc thừa để hạn chế container từ nhãn trên. Bây giờ nhãn đó sẽ được định vị bằng cách sử dụng không gian dọc tương ứng với các nhãn thấp hơn. Tiếp theo, thêm các ràng buộc chiều cao cho mỗi nhãn thấp hơn và liên kết đến lớp với một IBOutlet. Một điều khác, thực sự bạn sẽ cần các nhãn thấp hơn để bị ràng buộc vào vùng chứa với một ràng buộc không gian phía dưới. Khi chiều cao của chúng bị giảm về 0, chúng sẽ biến mất và nhãn trên sẽ di chuyển thấp hơn để giả định vị trí trung tâm Y.

Để hoàn nguyên, chỉ cần đặt lại constant thành giá trị ban đầu.

Đây là cách tiếp cận tốt hơn nhiều so với thêm/xóa các ràng buộc, đó là một hoạt động nặng. Lưu ý rằng bạn có thể muốn thêm hai nhãn thấp hơn vào chế độ xem "vùng chứa" để chúng có thể được hiển thị/ẩn dưới dạng một. Ngoài ra, nó sẽ gọn gàng mã như bạn thực sự muốn không gian dọc được giữa nhãn trên của bạn, và cả hai nhãn thấp hơn là chỉ một.

Xem thêm câu trả lời của tôi AutoLayout with hidden UIViews?

+0

Ý của bạn là "thêm một ràng buộc mới để làm cho nhãn tiêu đề có một khoảng trống thẳng đứng". Những loại hạn chế nó nên được? Tôi đã pined nhãn thấp hơn với nhãn tiêu đề bằng cách hạn chế không gian dọc. – Centurion

+0

Nếu tôi loại bỏ ràng buộc "Top space to container" thì IB sẽ hiển thị lỗi với "Need constraint for Y position" – Centurion

+0

vâng trước tiên, bạn cần cung cấp cho nó ràng buộc mới sau đó thêm ràng buộc mới - bây giờ. IB sẽ không cho phép sự mơ hồ –

-3

Hiếm khi bạn có thể khéo léo dễ hiểu và một số ví dụ thực hành khi đến Tài liệu Apple, nhưng đây là trường hợp chính xác của ngoại lệ trong quy tắc.

Cá nhân tôi thấy tài liệu này dễ hiểu và rõ ràng. Cách tốt nhất để trở thành một guru tự động bố trí trong thời gian :)

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

Về cơ bản, thời gian chạy có nghĩa là "lập trình".

Vì vậy, câu trả lời cho câu hỏi của bạn nằm ở đây:

https://stackoverflow.com/a/12623006/517119

+0

Liên kết Apple bị hỏng. hãy xem xét cập nhật nó. –

0

Tôi đang làm một việc rất giống bản thân mình. Vì vậy, thêm một ràng buộc chiều rộng cho cả hai nhãn. Bạn được phép thay đổi giá trị không đổi trong khi ràng buộc được áp dụng - chỉ giữ một tham chiếu đến nó. Trong trường hợp của tôi, tôi có một mảng mà tôi đặt những ràng buộc mà tôi định thay đổi.

Khi bạn muốn ẩn nhãn, hãy thay đổi giá trị c thành 0 - bạn cũng có thể thực hiện điều này trong khối hoạt ảnh. Để hiển thị thay đổi giá trị.

Bạn cũng có thể làm cho chiều rộng của không gian trên bằng với không gian phía dưới, vì vậy khi các chế độ xem ẩn hoặc hiển thị, bạn giữ cho "nhóm" các mục được căn giữa.

Lưu ý rằng bạn cũng có thể thêm hoặc xóa các ràng buộc nhưng chi phí cho iOS để xử lý.

5

Đặt nhãn bạn muốn ẩn vào chế độ xem, sau khi mọi thứ có ràng buộc bố cục chính xác, thêm ràng buộc chiều cao vào chế độ xem vùng chứa và kết nối ràng buộc vào thuộc tính IBOutlet.

Hãy chắc chắn rằng các đặc tính của bạn là strong

trong mã yo chỉ phải thiết hằng số 0 và kích hoạt nó, tho che giấu nội dung, hoặc tắt nó để hiển thị nội dung. Điều này là tốt hơn so với rối tung lên với giá trị không đổi một tiết kiệm-khôi phục lại nó. Đừng quên gọi layoutIfNeeded sau đó.

@property (strong, nonatomic) IBOutlet UIView *myContainer; 
@property (strong, nonatomic) IBOutlet NSLayoutConstraint *myContainerHeight; //should be strong!! 

-(void) showContainer 
{ 
    self.myContainerHeight.active = NO; 
    self.myContainer.hidden = NO; 
    [self.view layoutIfNeeded]; 
} 
-(void) hideContainer 
{ 
    self.myContainerHeight.active = YES; 
    self.myContainerHeight.constant = 0.0f; 
    self.myContainer.hidden = YES; 
    [self.view layoutIfNeeded]; 
} 

Một khi bạn đã thiết lập, bạn có thể kiểm tra nó trong IntefaceBuilder bằng cách thiết lập hạn chế của bạn để 0 và sau đó trở lại giá trị ban đầu. Đừng quên kiểm tra các ưu tiên ràng buộc khác vì vậy khi ẩn không có xung đột gì cả. cách khác để kiểm tra nó là đặt nó là 0 và đặt mức ưu tiên là 0, nhưng, bạn không nên quên khôi phục nó về mức ưu tiên cao nhất một lần nữa.

+0

Câu trả lời tuyệt vời ... tôi biết chúng tôi có thể giữ một lối thoát cho ràng buộc n có một ràng buộc giữ chỗ ..nhưng bây giờ biết tat chúng tôi có thể hoạt động các khó khăn –

+0

Tôi vui vì bạn tìm thấy câu trả lời của tôi hữu ích, cảm ơn. –

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