iOS: Làm thế nào để một hoạt ảnh đối với ràng buộc tự động thanh toán mới (chiều cao)


123

Tôi chưa bao giờ làm việc với autolayout hạn chế trước đó. Tôi có một ứng dụng nhỏ mới đang phát triển và nhận thấy rằng các chế độ xem của NIB được mặc định là tự động thanh toán. Vì vậy, tôi nghĩ rằng tôi sẽ tận dụng cơ hội để làm việc với nó và cố gắng tìm hiểu xem Apple sẽ đi đâu với điều này.

Thử thách đầu tiên:

Tôi cần thay đổi kích thước của MKMapView và tôi muốn chuyển nó sang vị trí mới. Nếu tôi làm điều này theo cách tôi đã quen:

[UIView animateWithDuration:1.2f
     animations:^{
         CGRect theFrame = worldView.frame;
         CGRect newFrame = CGRectMake(theFrame.origin.x, theFrame.origin.y, theFrame.size.width, theFrame.size.height - 170);
         worldView.frame = newFrame;
}];

... thì MKMapView sẽ 'bắt' trở lại chiều cao ban đầu bất cứ khi nào một chế độ xem anh chị em được cập nhật (trong trường hợp của tôi, tiêu đề của UISegmentedControl đang được cập nhật [myUISegmentedControl setTitle:newTitle forSegmentAtIndex:0]).

Vì vậy, những gì tôi nghĩ tôi muốn làm là thay đổi các ràng buộc của MKMapView từ mức ngang bằng với chiều cao của chế độ xem gốc thành tương đối với phần trên cùng của UISegmentedControl mà nó đang bao gồm:V:[MKMapView]-(16)-[UISegmentedControl]

Điều tôi muốn là chiều cao MKMapView rút ngắn để một số điều khiển bên dưới chế độ xem bản đồ được tiết lộ. Để làm như vậy, tôi nghĩ rằng tôi cần thay đổi ràng buộc từ chế độ xem kích thước đầy đủ cố định thành chế độ xem có giới hạn dưới cùng với đầu của UISegmentedControl ... và tôi muốn nó hoạt ảnh khi chế độ xem thu nhỏ lại thành kích thước mới.

Làm thế nào để một người đi về điều này?

Chỉnh sửa - hoạt ảnh này không hoạt ảnh mặc dù dưới cùng của chế độ xem di chuyển lên 170 ngay lập tức:

    [UIView animateWithDuration:1.2f
         animations:^{
             self.nibMapViewConstraint.constant = -170;

    }];

nibMapViewConstraintđược nối dây trong IB tới giới hạn Không gian dọc dưới cùng.


1
Tôi biết rằng bạn có thể dễ dàng thay đổi giá trị không đổi của ràng buộc trong khối [UIView animateWithDuration ..] để tạo hiệu ứng thay đổi chiều cao. Bạn cần tạo IBOutlet cho ràng buộc đó và kết nối nó trong xib của bạn, hoặc giữ một tham chiếu đến nó nếu bạn đã tạo nó trong mã (hoặc lặp qua tất cả các ràng buộc để tìm kiếm nó). Không chắc chắn về cách tạo hoạt ảnh liên quanBằng các thay đổi nhưng tôi đã đọc rằng bạn chỉ nên thay đổi các giá trị không đổi chứ không phải các giá trị khác của một ràng buộc (đối với các giá trị khác, hãy tạo một ràng buộc mới).
yuf

Hừ! tôi nghĩ tôi có thể làm được nhưng tôi không thấy nó hoạt hình. Nó thay đổi, thành công và nằm trong khối hoạt ảnh, nhưng không hoạt ảnh!?!
Meltemi

Tìm thấy câu trả lời của tôi ở đây: < stackoverflow.com/questions/12926566/… >
Meltemi

1
Đừng quên [view layoutIfNeeded], đó cũng là vấn đề của tôi haha. Đó là cùng một câu hỏi đã giải quyết vấn đề của tôi.
yuf

Câu trả lời:


179

Sau khi cập nhật ràng buộc của bạn:

[UIView animateWithDuration:0.5 animations:^{[self.view layoutIfNeeded];}];

Thay thế self.viewbằng một tham chiếu đến dạng xem chứa.


4
hoạt động cho chính chế độ xem, tuy nhiên các chế độ xem có ràng buộc đối với chế độ xem đó chỉ di chuyển ngay lập tức. Tôi làm gì? ty
dietbacon

7
bạn cũng cần gọi bố cục nếu cần trên các khung nhìn đó. tuy nhiên, nó không thực sự hoạt động bình thường vì điều này cũng sẽ tạo hiệu ứng làm mới chế độ xem. Làm cách nào để bạn tạo hiệu ứng điều chỉnh ràng buộc chỉ trong các chế độ xem khác?
ngb

3
Hãy lưu ý: Nếu sử dụng, UIViewAnimationOptionBeginFromCurrentStatecác ràng buộc về bố cục sẽ được đặt TRƯỚC hoạt ảnh!
Robert

12
Thay vì gọi layoutIfNeededcho mỗi người trong số những quan điểm, chỉ cần gọi[[self.view superview] layoutIfNeeded];
Flying_Banana

2
@ngb bạn cần thay đổi hằng số ràng buộc bên trong khối hoạt ảnh. Bằng cách đó, ràng buộc thay đổi với hoạt ảnh và bạn có thể tiếp tục sử dụng UIViewAnimationOptionBeginFromCurrentState.
Eran Goldin

86

Điều này phù hợp với tôi (Cả iOS7 và iOS8 +). Nhấp vào ràng buộc bố cục tự động mà bạn muốn điều chỉnh (trong trình tạo giao diện, ví dụ như ràng buộc trên cùng). Tiếp theo hãy biến nó thành IBOutlet;

@property (strong, nonatomic) IBOutlet NSLayoutConstraint *topConstraint;

Hoạt hình trở lên;

    self.topConstraint.constant = -100;    
    [self.viewToAnimate setNeedsUpdateConstraints]; 
    [UIView animateWithDuration:1.5 animations:^{
        [self.viewToAnimate layoutIfNeeded]; 
    }];

Hoạt ảnh trở lại vị trí ban đầu

    self.topConstraint.constant = 0;    
    [self.viewToAnimate setNeedsUpdateConstraints];  
    [UIView animateWithDuration:1.5 animations:^{
        [self.viewToAnimate layoutIfNeeded];
    }];

2
WOW !! Điều này thực sự thực sự hoạt động! Câu trả lời này đã giúp tôi mở rộng tầm mắt. Cảm ơn bạn rất nhiều! - Erik
Erik van der Neut

2
@ErikvanderNeut nó cũng dành cho tôi, rất vui vì nó hữu ích. Từ bây giờ tôi sẽ chuyển sang các ràng buộc hoạt ảnh hơn là vị trí khung.
DevC

đừng bỏ lỡ để thêm: [containerView layoutIfNeeded]; Nó đảm bảo rằng tất cả các thao tác bố trí đang chờ xử lý đã được hoàn thành TRƯỚC khối animateWithDuration.
ingconti

11

Có một hướng dẫn rất hay từ chính apple giải thích cách sử dụng hoạt ảnh với autolayout. Theo liên kết này và sau đó tìm video có tên "Tự động bố cục theo ví dụ" Nó cung cấp một số nội dung thú vị về tự động xuất và phần cuối cùng là về cách sử dụng hoạt ảnh.



1

Hầu hết mọi người sử dụng autolayout để bố trí các mục trên chế độ xem của họ và sửa đổi các ràng buộc bố cục để tạo hoạt ảnh.

Một cách dễ dàng để thực hiện việc này mà không cần nhiều mã là tạo UIView bạn muốn tạo hoạt ảnh trong Storyboard và sau đó tạo một UIView ẩn mà bạn muốn UIView kết thúc. Bạn có thể sử dụng bản xem trước trong xcode để đảm bảo cả hai UIView đều ở nơi bạn muốn. Sau đó, ẩn UIView kết thúc và hoán đổi các ràng buộc bố cục.

Có một podfile để hoán đổi các ràng buộc bố cục được gọi là SBP nếu bạn không muốn tự viết.

Đây là một hướng dẫn .


0

Không cần sử dụng thêm IBOutlet referenceràng buộc thay vì điều này, bạn có thể trực tiếp accesshoặc updateđã áp dụng ràng buộc được áp dụng bởi Programmaticallyhoặc từ Interface Builderbất kỳ chế độ xem nào sử dụng KVConstraintExtensionsMasterthư viện. Thư viện này cũng đang quản lý Cumulativehành vi của NSLayoutConstraint.

Để thêm Ràng buộc chiều cao trên containerView

 CGFloat height = 200;
 [self.containerView applyHeightConstrain:height];

Để cập nhật Ràng buộc chiều cao của containerView với hoạt ảnh

[self.containerView accessAppliedConstraintByAttribute:NSLayoutAttributeHeight completion:^(NSLayoutConstraint *expectedConstraint){
        if (expectedConstraint) {
            expectedConstraint.constant = 100;

            /* for the animation */ 
            [self.containerView  updateModifyConstraintsWithAnimation:NULL];
      }
    }];
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.