2015-10-29 16 views
8

UICollectionView öğesinin, döndürme sırasındaki kaydırma sırasında düşmesine neden olan herhangi bir fikir nasıl giderilir?UICollectionView, döndürme sırasında döndürme yaparken kilitleniyor (dizin yolundaki ek öğe için düzen özellikleri geçersiz kılmadan değiştirildi ..)

Kaydırma ve döndürme için ayrı ayrı aşağıdaki yaklaşımı kullanıyorum ve her biri iyi çalışıyor gibi görünüyor. Her iki şeyi aynı anda yaparken, bu çökmeyi alabileceğimi fark ettim. Bu nedenle, cihazı döndürdüğümde ve layout düzeninde yeni düzen özelliklerinin hesaplanmasında, sürekli kaydırma işleminin "invalidateLayoutWithContext (invalidContext)" (aşağıya bakınız) tetiklenmesiyle ilgili bir şey gibi görünüyor.

Fikirler? Döndürme sırasında herhangi bir kaydırma yanıtı beklemeye (ya da yok saymaya) imkan veren bir yol var mı? Ben bütün düzenini

self.cal.collectionViewLayout.invalidateLayout() 

Kaydırma Yaklaşım geçersiz görünümü kumandam viewWillLayoutSubviews ise

Rotasyon Yaklaşım bana "bağlantılı" dekoratif görünümü (başlık) bulundurmalarını sağlamak amacıyla Bilmiyorum Performansı öldürdüğü için tüm düzeni geçersiz kılar, ancak aşağıdakileri yapın. gürültüyle hata benim tamamlayıcı görünüm düzenleri farklı olma konusunda ise düzen sınıfta ben Dekoratif Görünüm (başlık) geçersiz ediyorum burada 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) 
    } 

Not geçersiz kılar.

hata

2015-10-30 07: 14: 30,181 test3_collectionview [17086: 3.102.132] içinde * onaylama hatası - [UICollectionViewData validateLayoutInRect:], /BuildRoot/Library/Önbellek/com.apple.xbs/Kaynaklar/UIKit_Sim/UIKit-3512.29.5/UICollectionViewData.m: 408 2015/10/30 07: 14: 30,185 test3_collectionview [17086: 3.102.132] * uygulamasını Sonlandırma nedeniyle yakalanmamış istisna 'NSInternalInconsistencyException ', sebep:'için düzen özellikleridizin yolundaki ek öğe ({length = 2, yol = 0 - 0}) dizin yolundan değiştirildi: ({length = 2, path = 0 - 0}); eleman tür: (Dekoratif1); çerçeve = (0 1085.5; 320 16); zIndex = 1; dizinine yol: ({uzunluk = 2, yol = 0 - 0}); eleman tür: (Dekoratif1); çerçeve = (0 853.5; 320 16); zIndex = 1; düzeni' geçersiz olmadan *** İlk atış çağrı yığını:

+0

'shouldInvalidateLayoutForBoundsChange' yöntemini geçersiz kılmazsanız, kilitlenme gerçekleşir mi? – Lefteris

+0

@Bu durumda kazara oluşmaz, bu durumda, koleksiyonumun performansını etkilemeden sonra neyi elde ettiğime emin değilim (yani, invalidateLayoutWithContext yaklaşımını nasıl kullanacağından emin değilsiniz) – Greg

cevap

1

bu yeterli olacaktır emin değilim ama ben bu satırlar boyunca bir deneyin bir şey (bir koleksiyon görünümü bir kaydırma görünümünü ise) verecek:

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

Bu girişimin nasıl olduğundan emin değil misiniz? Sorunumu gidermek için? "invalidateLayoutWithContext" nereye sığar? – Greg

+0

Eğer (dün) yorum yapma ayrıcalığım olsaydı, daha uygun olurdu, bunun yerine bir yorum gönderdim. 'ShouldInvalidateLayoutForBoundsChange' seçeneğini geçersiz kılmazken kilitlenmeyiniz. Benim naif fikrim, gerçekten, çok naif: bir rotasyon olayı olduğunda, kaydırma işlemini dondurun ve kullanıcı etkileşimini engelleyin (işleri "temiz tutmak"), aynı zamanda scrollEnabled = false değerini ayarlayın. Kaydırma devre dışı bırakıldığında 'shouldInvalidateLayoutForBoundsChange' ("varsayılan davranışı kullan") durumunda "askıya alabilirsiniz". Belki burada çok önemli bir şey eksik. – Eppilo

İlgili konular