2015-10-29 13 views
8

Bất kỳ ý tưởng nào để giải quyết sự kiện UICollectionView của tôi gặp sự cố khi cuộn chế độ xoay?UICollectionView gặp sự cố khi cuộn chế độ xoay (thuộc tính bố cục cho mục bổ sung tại đường dẫn chỉ mục đã thay đổi mà không làm mất hiệu lực ..)

Tôi đang sử dụng cách tiếp cận sau để cuộn và xoay riêng và mỗi cách có vẻ hoạt động tốt. Tôi vừa mới lưu ý khi làm cả hai việc cùng một lúc, tôi có thể bị tai nạn này. Vì vậy, nó có vẻ là một cái gì đó để làm với thực tế khi tôi xoay thiết bị và các thuộc tính bố trí mới đang được tính toán trong preparLayout, rằng việc di chuyển liên tục đang kích hoạt "invalidateLayoutWithContext (invalidContext)" (xem bên dưới).

Ý tưởng? Có cách nào để đặt bất kỳ phản ứng di chuyển nào đang giữ (hoặc bỏ qua chúng) trong khi quay không?

Rotation Cách tiếp cận Trong viewWillLayoutSubviews trong bộ điều khiển xem tôi làm mất hiệu lực toàn bộ bố trí

self.cal.collectionViewLayout.invalidateLayout() 

cuộn tiếp cận Để cho phép tôi có một "dính" điểm trang trí (tiêu đề) Tôi không vô hiệu hóa toàn bộ bố cục, vì nó làm giảm hiệu suất, nhưng làm như sau. Trong lớp học bố trí tôi ghi đè shouldInvalidateLayoutForBoundsChange

override func shouldInvalidateLayoutForBoundsChange(newBounds: CGRect) -> Bool { 
     let invalidContext : UICollectionViewLayoutInvalidationContext = self.invalidationContextForBoundsChange(newBounds) 

     // Keep Header Sticky 
invalidContext.invalidateDecorationElementsOfKind(GCCalendarLayoutKind_Decorative1, atIndexPaths: [headerDecorativeIndexPath]) 

     // Apply Invalidation 
     self.invalidateLayoutWithContext(invalidContext)   

     // Return normal super return (just in case of future IOS upgrades) 
     return super.shouldInvalidateLayoutForBoundsChange(newBounds) 
    } 

Lưu ý ở đây tôi đang vô hiệu các trang trí View (tiêu đề), trong khi lỗi với các vụ tai nạn là về quan điểm bố trí bổ sung của tôi là khác nhau.

Lỗi

2015-10-30 07: 14: 30,181 test3_collectionview [17.086: 3.102.132] * thất bại Assertion trong - [UICollectionViewData validateLayoutInRect:], /BuildRoot/Library/Caches/com.apple.xbs/Sources/UIKit_Sim/UIKit-3512.29.5/UICollectionViewData.m: 408 2015-10-30 07: 14: 30.185 test3_collectionview [17086: 3102132] * Chấm dứt ứng dụng do ngoại lệ không bị bắt 'NSInternalInconsistencyException ', lý do:' thuộc tính bố cục cho mục bổ sung tại đường dẫn chỉ mục ({length = 2, path = 0 - 0}) đã thay đổi từ chỉ số đường dẫn: ({length = 2, path = 0 - 0}); phần tử loại: (Decorative1); frame = (0 1085.5; 320 16); zIndex = 1; đến chỉ mục đường dẫn: ({length = 2, path = 0 - 0}); phần tử loại: (Decorative1); frame = (0 853.5; 320 16); zIndex = 1; mà không hủy bỏ hiệu lực bố trí' *** Đầu tiên gọi ném stack:

+0

Nếu bạn không ghi đè phương thức 'shouldInvalidateLayoutForBoundsChange', sự cố có tiếp tục xảy ra không? – Lefteris

+0

@Loại bỏ sự cố không xảy ra trong trường hợp này, tuy nhiên tôi không chắc chắn làm cách nào để đạt được những gì tôi theo sau mà không ảnh hưởng đến hiệu suất collectionView (nghĩa là không chắc chắn sau đó cách sử dụng phương thức invalidateLayoutWithContext) – Greg

Trả lời

1

Tôi không chắc chắn đây sẽ là đủ nhưng tôi sẽ cho nó một cái gì đó thử cùng những dòng này (một cái nhìn bộ sưu tập là một cái nhìn cuộn):

import CoreGraphics 

class myController: UIViewController, UIScrollViewDelegate { 

    var myScrollView = UIScrollView() 

    override func viewDidLoad() { 
     self.view.addSubview(myScrollView) 
    } 

    // This will capture rotation events 
    override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) { 
     self.myScrollView.scrollEnabled = false 
     coordinator.notifyWhenInteractionEndsUsingBlock({_ in self.myScrollView.scrollEnabled = true}) 
     super.viewWillTransitionToSize(size, withTransitionCoordinator: coordinator) 
    } 

    func scrollViewDidScroll(scrollView: UIScrollView) { 
     // This will not ignore scroll but perhaps can help keeping things "tidy" and "performant" during rotation. Not sure 
     if myScrollView.scrollEnabled == false { 
      let offset = scrollView.contentOffset 
      myScrollView.setContentOffset(offset, animated: false) 
     } 
    } 
} 
+0

không chắc chắn để giải quyết vấn đề của tôi? nơi "invalidateLayoutWithContext" phù hợp với ... – Greg

+0

Nếu tôi có đặc quyền (ngày hôm qua) để nhận xét tôi sẽ có, một cách thích hợp hơn, hãy đăng một bình luận thay thế. Bạn dường như không có sự cố khi bạn không ghi đè 'shouldInvalidateLayoutForBoundsChange'. Ý tưởng ngây thơ của tôi là, tốt, thực sự ngây thơ: khi có một sự kiện xoay, đóng băng di chuyển và ngăn chặn tương tác người dùng (để giữ cho mọi thứ "sạch"), đồng thời bạn đã đặt scrollEnabled = false. Khi cuộn được tắt, bạn có thể "tạm ngưng" 'shouldInvalidateLayoutForBoundsChange' (tức là sử dụng hành vi mặc định). Có lẽ tôi đang thiếu một cái gì đó rất quan trọng ở đây. – Eppilo

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