2015-03-13 32 views
16

Şu anda UICollectionViewCells boyutları hesaplamak için aşağıdaki pasajı var On UICollectionView Geçersiz Kılan Düzen:Sınırlar Değişiklikler

- (CGSize)collectionView:(UICollectionView *)mainCollectionView 
        layout:(UICollectionViewLayout *)collectionViewLayout 
    sizeForItemAtIndexPath:(NSIndexPath *)atIndexPath 
{ 
    CGSize bounds = mainCollectionView.bounds.size; 
    bounds.height /= 4; 
    bounds.width /= 4; 
    return bounds; 
} 

Bu çalışır. Ancak, şimdi viewDidLoad'da bir klavye gözlemcisini ekliyorum (bu, görüntülenmeden önce UICollectionView için temsilci ve veri kaynağı yöntemlerini tetikliyor ve kendisini storyboard'dan yeniden boyutlandırıyor). Sınırlar yanlıştır. Ayrıca rotasyonu desteklemek istiyorum. UICollectionView boyutu değiştirirse, bu iki kenarlı durumu ele almak ve boyutları yeniden hesaplamak için iyi bir yol nedir?

cevap

38

toplama görünüm değişikliklerinin sınırları shouldInvalidateLayoutForBoundsChange: geçersiz kılmak ve YES dönmek olduğunda düzeninizi geçersiz için çözüm. Ayrıca belgelerinde belirtildiği oluyor: https://developer.apple.com/documentation/uikit/uicollectionviewlayout/1617781-shouldinvalidatelayoutforboundsc

- (BOOL)shouldInvalidateLayoutForBoundsChange:(CGRect)newBounds 
{ 
    return YES; 
} 

Bu durum rotasyon desteği kapsamalıdır. i .. sonsuz çağrılan -viewWillLayoutSubviews` başvurum çünkü `yöntemin asmak, denedim ben yanlış bir kontrolöre bu kodu koymak ne zaman o viewWillTransitionToSize:withTransitionCoordinator:

- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator 
{ 
    [super viewWillTransitionToSize:size 
      withTransitionCoordinator:coordinator]; 

    [coordinator animateAlongsideTransition:^(id<UIViewControllerTransitionCoordinatorContext> context) 
    { 
     [self.collectionView.collectionViewLayout invalidateLayout]; 
    } 
           completion:^(id<UIViewControllerTransitionCoordinatorContext> context) 
    { 
    }]; 
} 
+1

Geçişin yanında canlandırın .... çok parlak. Teşekkür ederim! – 3rdFunkyBot

7
  1. Koleksiyon görünüm boyutu değiştirildiğinde durumu ele almalısınız. Yönlendirmeyi veya kısıtlamaları değiştirirseniz, viewWillLayoutSubviews yöntemi tetiklenecektir. Geçerli koleksiyon görünümü düzenini geçersiz kılmalısınız. Düzeni invalidateLayout yöntemiyle geçersiz hale getirdikten sonra UICollectionViewDelegateFlowLayout yöntemleri tetiklenir.

İşte örnek kod:

 
- (void)viewWillLayoutSubviews { 
    [super viewWillLayoutSubviews]; 
    [mainCollectionView.collectionViewLayout invalidateLayout]; 
} 
+9

uygulamak etmezse? Ayrıca süper konuşabilir miyim? – igrek

+0

Bu, aynı zamanda VC A ve döndürdüğünüzde, düzenini güncellemek için VC B'ye ihtiyacınız varsa, böylece kullanıcı, eğer sekme çubuğu görünümü denetleyicilerinde A, B ve C gibi özel düzenlerinizin olması gerektiğinde de iyidir. VC B'ye ilişkin sekmeler, hala düzgün bir şekilde döndürülen bir görünüm gösterir. – JohnZ

İlgili konular