2016-06-08 13 views
6

Tôi có UIStackView với 5 bản xem trước. Tôi muốn có thể tạo hoạt ảnh cho chiều rộng của các bản xem trước này bằng cách cập nhật intrinsicContentSize hoặc cập nhật các ràng buộc của chúng. Làm thế nào tôi có thể làm cho stackView vẽ lại sau khi cập nhật bố cục của subview?Làm cách nào để có UIStackView cập nhật bố cục của nó?

 UIView.animateWithDuration(0.3, animations: { 
      viewToResize.compressed = true //changes intrinsicContentSize 
      viewToResize.invalidateIntrinsicContentSize() 
      self.stackView.layoutIfNeeded() //makes no difference 
      anotherSubview.hidden = true //adding this makes everything work 
}) 

Tôi đã thử nhiều cách khác nhau để cố gắng cập nhật stackView nhưng không có gì xảy ra. Cách duy nhất tôi có thể làm cho nó hoạt động là nếu tôi hiển thị/ẩn một subview bên trong khối hoạt hình, sau đó bố trí mới được hoạt hình chính xác, nhưng tôi không muốn làm điều này.

Tôi đã thấy câu hỏi này Animating UIStackView arrangedSubview content size change nhưng câu trả lời được đề xuất không hoạt động (không có hoạt ảnh nào).

+0

bạn đã thử xem.updateConstraints? –

+0

Có, trên stackXem và các bản xem trước, không có bất kỳ ảnh hưởng nào. –

Trả lời

6

Bạn không cần viewToResize.invalidateIntrinsicContentSize(), thay vào đó hãy hạn chế bản cập nhật của các bản xem phụ của bạn. Trong mã bên dưới, chúng tôi có hai bản xem trước trong số stackView và chúng tôi tạo một lối ra widthConstraint từ bảng phân cảnh. Sau đó, chúng tôi có thể tạo ảnh động chiều rộng của chế độ xem phụ bằng cách cập nhật hằng số widthConstraint trong khối hoạt ảnh. Lưu ý: Nếu một cái nhìn được chứa trong một cái nhìn chồng và bạn cố gắng để thay đổi khung xem, nó sẽ không thay đổi

class ViewController: UIViewController { 
    @IBOutlet var widthConstraint: NSLayoutConstraint! 

    @IBOutlet var stackView: UIStackView! 
    var compressed: Bool = true 

    @IBOutlet var start: UIButton! 

    @IBAction func onStart(sender: UIButton) { 
     UIView.animateWithDuration(3.0, 
            delay: 0.0, 
            usingSpringWithDamping: 0.3, 
            initialSpringVelocity: 10.0, 
            options: .CurveLinear, 
            animations: {() -> Void in 
            //self.stackView.invalidateIntrinsicContentSize() 
            self.widthConstraint.constant = (self.compressed == false) ? 100.0 : 200.0 
            self.compressed = !self.compressed 
            self.view.layoutIfNeeded() 
      }, completion: nil) 
    } 

Để biết thêm chi tiết, bạn có thể có một cái nhìn tại blog tuyệt vời này UIStackView, Auto Layout and Core Animation

+0

Làm cách nào để thực hiện điều này nếu tôi muốn 1 chế độ xem phụ có chiều rộng cố định và mặt còn lại để lấp đầy khoảng trống có sẵn? (Tôi muốn chuyển đổi giữa các khung nhìn) Tôi đã thử xóa/thêm các ràng buộc trong khối hoạt ảnh và nó hoạt động, nhưng phá vỡ các ràng buộc khác. –

+0

Trên thực tế việc thêm và loại bỏ các ràng buộc hoạt động tốt, nhưng tôi đã phải giảm mức ưu tiên để ngăn chặn các ràng buộc khác phá vỡ. –

+0

Tôi vừa cập nhật liên kết. – luiyezheng

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