2013-06-24 41 views
6

Khi người dùng thực hiện một số hành động, tôi cần kéo một số UICollectionView từ dưới lên đến một độ cao nhất định. Vì trạng thái mới đó hoàn toàn không bắt buộc, chế độ xem bộ sưu tập được tạo ngay trước khi được trình bày theo cách đó. Hoạt ảnh từ dưới lên trên được thực hiện bằng các thay đổi đối với thuộc tính constant của NSLayoutConstraint và gọi tới [view layoutIfNeeded] trong một số khối hoạt ảnh.Ngăn hiển thị hoạt ảnh UICollectionViewCell khi trình bày UICollectionView

Vấn đề là, làm những việc theo cách đó làm cho các tế bào xuất hiện theo một cách không mong muốn: chúng mở rộng từ góc trên cùng bên trái đến kích thước được chỉ định của chúng. Tôi muốn chế độ xem bộ sưu tập xuất hiện và có tất cả các ô đã được đặt ra ở kích thước và hình thức cuối cùng của chúng.

Tôi biết những thứ như phương pháp của UIView setAnimationEnabled:, nhưng tôi không thể tìm thấy cách thức và nơi tôi nên sử dụng (nếu đó là cách để đi).

Tôi đoán sự cố là do các ô xem bộ sưu tập đang được thêm vào phân cấp chế độ xem ngay trước khối hình động có chứa lệnh gọi tới [superview layoutIfNeeded]. Điều này có thể dẫn UIKit nghĩ rằng nó cũng sẽ animate những thay đổi đó đối với bố cục. Nếu đó là trường hợp giải pháp có thể là một cái gì đó dọc theo cách loại trừ khỏi hoạt ảnh, những thay đổi cụ thể đối với phân cấp khung nhìn.

+0

Chạy vào một số lỗi tương tự trong ứng dụng của tôi - cho ví dụ, khi tôi khởi động nó trong chế độ giả lập, toàn bộ màn hình của ứng dụng mở rộng ra ngoài từ góc trên bên trái và một số đoạn văn bản nhất định đôi khi "nhảy" lên góc trái của người giám sát của họ và sau đó biến đổi thành vị trí. Tương tự như vậy tôi làm một số hình ảnh động với những hạn chế trong các phần khác nhau của ứng dụng của tôi. Sẽ đánh giá cao một câu trả lời cho câu hỏi này :) –

Trả lời

10

Mở rộng từ góc trên cùng bên trái thường là triệu chứng gọi layoutIfNeeded trong khối hoạt ảnh khi chế độ xem ban đầu chưa bao giờ được đặt ra. Về cơ bản, bạn đang làm động tác thông qua bố cục ban đầu, nơi tất cả các bản xem trước đã bắt đầu tại CGRectZero.

Để giải quyết nó, bạn cần hai điều:

  • Đảm bảo các hạn chế bạn đang chỉnh sửa có liên quan đến vị trí của xem bộ sưu tập, không phải là kích thước. Điều này có nghĩa là bạn không trình bày chế độ xem bộ sưu tập của mình bằng cách thay đổi chiều cao của nó từ 0 thành giá trị cuối cùng.
  • Gọi layoutIfNeeded trên chế độ xem của bạn trước khi bạn chỉnh sửa ràng buộc, sau đó gọi lại lần nữa trong khối hoạt ảnh sau khi bạn đã thực hiện thay đổi. Bằng cách này, bạn chỉ làm hoạt hình thay đổi mà bạn đã chỉ định cho ràng buộc, thay vì toàn bộ bố cục.
+1

Nó đã hoạt động! Cảm ơn bạn rất nhiều! Để tham khảo, những gì tôi muốn làm là tạo ra một ràng buộc có mức ưu tiên thấp có thể làm cho chiều cao khung nhìn bằng với chiều cao cửa sổ, gọi 'layoutIfNeeded', thiết lập ràng buộc ưu tiên cao hơn để đè lên phần trước và thực hiện hoạt ảnh ! Và nó hoạt động rất đẹp! – matehat

+0

Tôi sẽ chỉ có thể thưởng tiền thưởng trong vòng 22 giờ ... – matehat

+0

Lợi dụng các ưu tiên là một ý tưởng tuyệt vời! Tôi sắp viết một cái gì đó tương tự bản thân mình và tôi thường giữ tham chiếu đến các ràng buộc khác nhau xung quanh, nhưng tôi sẽ thử nó theo cách của bạn lần này. – jrturton

0

Tôi đã gặp sự cố này trong khoảng 3 ngày và cuối cùng đã nhận được giải pháp. Đơn giản chỉ cần tôi thêm khối hình ảnh động để được gọi sau khi một bộ đếm thời gian rất nhỏ

UIView.animateWithDuration(0.5, delay: 0, usingSpringWithDamping: 0.5, initialSpringVelocity: 7 , options: .CurveEaseInOut, animations: { 
      self.view.layoutIfNeeded() 
     }){ _ in} 

sẽ

let delayTime = dispatch_time(DISPATCH_TIME_NOW, Int64(0.1 * Double(NSEC_PER_SEC))) 
    dispatch_after(delayTime, dispatch_get_main_queue()) { 
     self.changeConstraint() 
    } 

private func changeConstraint(){ 

     UIView.animateWithDuration(0.5, delay: 0, usingSpringWithDamping: 0.5, initialSpringVelocity: 7 , options: .CurveEaseInOut, animations: { 
      self.view.layoutIfNeeded() 
     }){ _ in} 
} 

Xem sự kỳ diệu :)

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