2013-07-17 23 views
14

sonra eski hücrelerin uzaklaştırılması değil. Birine dokunduğunuzda, ızgarayı açar ve bazı ayrıntılarla bir alt görünüm gösterir. Şunun gibi:UICollectionView Ben resim ızgarası ile UICollectionView sahip kaydırma

Supposed to look like this

Ben UICollectionViewLayoutAttributes ayarlama ve seçilen öğenin geçerli satırın altındaki tüm hücreler için transform3D mülkiyet çevirisini ayarlayarak benim UICollectionViewLayout içinde ızgara açın. Bu gerçekten güzel çalışıyor ve başka bir hücreyi diğerlerine göre farklı bir boyuta yerleştirmek için ilk denememden çok daha iyi bir animasyon ve daha basit bir yaklaşım.

Neyse ... Bu çoğu zaman işleri, ama sonra sonra kullanmaya devam ben toplama görünümünde eski görselleri görebilirsiniz. Onlar hayalet hücreler gibidir. Onları tıklayamıyorum, koleksiyon görünümünden düzgün bir şekilde çıkarılmadılar ve muslukları önleyen ve sadece rahatsızlık veren hücrelerin üstüne otururlar. Şunun gibi:

Problem looks like this

bu hücreler yapıyoruz niye Herhangi bir fikir?

DÜZENLEME: ben eklemek istiyorum , ben gerçekten hızlı toplama görünümü kaydırırken sadece olur düşünüyorum. Hala devam ederse test etmek için kendi UICollectionViewFlowLayout değiştirmeyi yazdım. Öyle.

DÜZENLEME 2: 3d dönüşümler veya düzen bununla hiçbir ilgisi yoktur. UICollectionView'da bir hata olmalı. Sadece hızlı bir şekilde kaydırarak, durma noktasına gelip ekranda görüntülenenleri sorgulayarak izin verebilirim. Genellikle hücre sayısı iki katına çıkar, ancak birbirlerinin üzerine yığılmış olduklarından gizlenirler. Yukarıda benim uygulamam, yaptıkları çeviri nedeniyle onları ortaya koyuyor.

Bu

gerçekten çok performansını olumsuz etkileyebileceğini.

çözüm benim yanıta bakın.

+0

bir ekran görüntüsü gönderebilir misiniz? –

+0

Tuhaf rastlantısal an, bunu birkaç saat önce gördü. Profil sayfanıza baktım. Bir uygulama için bir fikir vardı. Flickr API için arama yapıldı. Github'da FlickrKit'i gördüm. İsmini tanıdım. LOL! Netception! – Fogmeister

+0

evet, etrafta dolaşıyorum ..... ve sen Leeds'deyim ve ben Leeds'im ... aslında, oraya sürmek üzere. – bandejapaisa

cevap

14

Sorularımın ikinci düzenlemesinde bunun neden gerçekleştiğine ilişkin ayrıntılar ve işte benim geçici çözümüm. O kurşun geçirmez değil, ama benim durumumda çalışır ve somethign benzer karşılaşırsanız sen benim çözüm çimdik olabilir: bandejapaisa giden tarihiyle

- (void) removeNaughtyLingeringCells { 

    // 1. Find the visible cells 
    NSArray *visibleCells = self.collectionView.visibleCells; 
    //NSLog(@"We have %i visible cells", visibleCells.count); 

    // 2. Find the visible rect of the collection view on screen now 
    CGRect visibleRect; 
    visibleRect.origin = self.collectionView.contentOffset; 
    visibleRect.size = self.collectionView.bounds.size; 
    //NSLog(@"Rect %@", NSStringFromCGRect(visibleRect)); 


    // 3. Find the subviews that shouldn't be there and remove them 
    //NSLog(@"We have %i subviews", self.collectionView.subviews.count); 
    for (UIView *aView in [self.collectionView subviews]) { 
     if ([aView isKindOfClass:UICollectionViewCell.class]) { 
      CGPoint origin = aView.frame.origin; 
      if(CGRectContainsPoint(visibleRect, origin)) { 
       if (![visibleCells containsObject:aView]) { 
        [aView removeFromSuperview]; 
       } 
      } 
     } 
    } 
    //NSLog(@"%i views shouldn't be there", viewsShouldntBeThere.count); 

    // 4. Refresh the collection view display 
    [self.collectionView setNeedsDisplay];  
} 

ve

- (void) scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate { 
    if (!decelerate) { 
     [self removeNaughtyLingeringCells]; 
    } 
} 

- (void) scrollViewDidEndDecelerating:(UIScrollView *)scrollView { 
    [self removeNaughtyLingeringCells]; 
} 
+1

Çok teşekkür ederim! Benim durumumda, aynı durumda 'Gizli' hücrelerin kaldırılması gayet iyi çalışıyor. Ayrıca, bu sorunu yeniden üretme yolum: 1. Çok hızlı ilerleyin. 2. Yavaşlamanın durmasını bekleyin. 3. Bir hücreyi siler. 4. Animasyonu silmek için bekleyin. –

2

Hızlı bir başka yorumunu: iOS 6 altında sadece UICollectionView'un da animasyonlu geçişler için bir alışkanlık haline geldiğini buldum. Orijinal hücreler oldukları yerde kalacak, kopyalar yapılabildi ve daha sonra kopyalar canlandırılacaktı. Genellikle orijinallerin üstünde ama her zaman değil. Yani basit bir sınır testi yeterli değildi.

- (void)didAddSubview:(UIView *)subview 
{ 
    [super didAddSubview:subview]; 

    // 
    // iOS 6 contains a bug whereby it fails to remove subviews, ever as far as I can make out. 
    // This is a workaround for that. So, if this is iOS 6... 
    // 
    if(![UIViewController instancesRespondToSelector:@selector(automaticallyAdjustsScrollViewInsets)]) 
    { 
     // ... then we'll want to wait until visibleCells has definitely been updated ... 
     dispatch_async(dispatch_get_main_queue(), 
     ^{ 
      // ... then we'll manually remove anything that's a sub of UICollectionViewCell 
      // and isn't currently listed as a visible cell 
      NSArray *visibleCells = self.visibleCells; 
      for(UIView *view in self.subviews) 
      { 
       if([view isKindOfClass:[UICollectionViewCell class]] && ![visibleCells containsObject:view]) 
        [view removeFromSuperview]; 
      } 
     }); 
    } 
} 

Açıkçası bu testi biraz daha doğrudan olamaz 'bu iOS 6'nın olduğunu' utanç verici ama bir kapalı gizli:

Bu nedenle aşağıdakileri sağladığından UICollectionView özel bir alt sınıfını yazdı gerçek kodumdaki kategori. bandejapaisa en cevabın

+0

Hızlı kaydırma çağrısı performBatchUpdate sırasında bu garip "hayalet" etkisini görüyordum: animasyonlar ve ne oldu * fikri * vardı. Koleksiyon görünümünün şu anda ekran üstü bir hücre için yeni bir hücre oluşturduğuna hiç benzemedim. Iyi yakalama, teşekkürler – SG1

0

A Swift UICollectionView uzatma sürümü:

extension UICollectionView { 

    func removeNaughtyLingeringCells() { 

     // 1. Find the visible cells 
     let visibleCells = self.visibleCells() 
     //NSLog("We have %i visible cells", visibleCells.count) 


     // 2. Find the visible rect of the collection view on screen now 
     let visibleRect = CGRectOffset(bounds, contentOffset.x, contentOffset.y) 
     //NSLog("Rect %@", NSStringFromCGRect(visibleRect)) 


     // 3. Find the subviews that shouldn't be there and remove them 
     //NSLog("We have %i subviews", subviews.count) 
     for aView in subviews { 
      if let aCollectionViewCell = aView as? UICollectionViewCell { 

       let origin = aView.frame.origin 
       if (CGRectContainsPoint(visibleRect, origin)) { 
        if (!visibleCells.contains(aCollectionViewCell)) { 
         aView.removeFromSuperview() 
        } 
       } 

      } 
     } 

     // 4. Refresh the collection view display 
     setNeedsDisplay() 
    } 
}