2015-06-26 36 views
7

adresindeki düzeni güncelleştirmiyor Bu, portre modundayken uygulamanın görünümüdür. o yatay moda döndürüldüğünde enter image description hereKoleksiyon Görünümü, Rotation

o film şeridi aracılığıyla oluşturulur burada enter image description here

UICollectionViewController gösterildiği gibi UIWindow dönen olmadığını gösteren bu

enter image description here

görünüm ayıklayıcıya benziyor. shouldInvalidateLayoutForBoundsChange'u uygulayan UICollectionViewFlowLayout alt sınıflarını denedim, ancak sorunumu gidermiyor.

- (BOOL)shouldInvalidateLayoutForBoundsChange:(CGRect)newBounds { 
    CGRect oldBounds = self.collectionView.bounds; 
    if (CGRectGetWidth(newBounds) != CGRectGetWidth(oldBounds)) { 
     return YES; 
    } 
    return NO; 
} 

Lütfen nelerin kontrol edileceğine veya ek kod için hata ayıklama isteklerine ilişkin fikir verin.

Düzenleme - MirekE tarafından önerildiği gibi, CollectionView'a kısıtlamalar eklemeyi denedim, ancak yapamadım. Editör-> Pin için tüm seçenekler CollectionView için kullanılamaz. enter image description here

Düzen, Andrea'ya yanıt - Ben iOS8.3 hedeflediğim

. Benim anlayışım, rotasyon olarak adlandırılan ana yöntemin, UIContentContainerprotocol'dan olan viewWillTransitionToSize:withTransitionCoordinator: olmasıdır. Benim CollectionViewController aşağıdaki eklediniz, ancak aynı sorun sadece tuval üzerine toplama görünümü sürüklemek gibi görünüyor

-(void)viewWillTransitionToSize:(CGSize)size 
     withTransitionCoordinator:(id <UIViewControllerTransitionCoordinator>)coordinator { 
    [self.collectionView.collectionViewLayout invalidateLayout]; 
    [self.collectionView reloadData]; 
} 
+0

Her hücreye özgü kısıtlamalar verdiğiniz gibi görünüyor, gerekli mi? –

+0

Vinay - evet hücrenin içindeki etikette "topMargin" ve "centerX" kısıtlaması var, ancak hücrenin kendisinde herhangi bir kısıtlama yok. – Idr

+0

Doktora göre, bir noktada viewWillTransitionToSize uygulamasında süper uygulamayı çağırmanız gerektiğini düşünüyorum. –

cevap

1

Sorun, collectionView çıkışının düzgün ayarlanmamış olmasıydı. collectionView'u ayarladıktan sonra, hepsi düzgün çalışıyor.

collectionView çıkış ayarlanmamış:

enter image description here

collectionView çıkış seti:

enter image description here

1

devam, ancak herhangi kısıtlamaları eklemek vermedi. Böylece cihazı döndürdüğünüzde, boyut değişmez.

Film şeridinde koleksiyon görünümünü seçin, ardından Xcode'un altındaki Pin simgesine tıklayın ve üst, sol, alt ve sağ kenar boşlukları için kısıtlamalar ekleyin. Bunu yaptıktan sonra koleksiyon görünümü döndürme sırasında yeniden boyutlandırılmalıdır.

+0

Koleksiyon Görünümü Denetleyicisi'ni Tuval üzerine sürüklediğimde Koleksiyon Görünümü otomatik olarak eklenmiştir. Soruyu, Koleksiyon Görünümünü sabitlemeye çalıştığımda ne olduğunu göstermek için ekran görüntüsüyle güncelledim. Kısıtlama eklemek için herhangi bir seçenek mevcut değildir. Cevabını açıklayabilir misin? – Idr

+0

Benim önerim mevcut bir denetleyiciye sürüklenen bir koleksiyon görünümü için olurdu. Bu, CollectionViewController ise, bir şey yapmanıza gerek yoktur. Simülatörü, şu anda test etmek için oluşturduğum küçük bir projede döndürdüğümde alanı doğru bir şekilde doldurur. Belki de varsayılanları geçersiz kılan bazı özel kodlar eklediniz? Özelleştirmelerinizi yorumlamaya çalıştınız mı? – MirekE

9

Hangi iOS sürümünü hedeflediğinizi bilmiyorum, ancak döndürme işlemini ve görüntü denetçisinde aranan yöntemleri anladığınızı varsayalım. Düzeninize -reloadData
alt sınıf gerek yok bağlı

[self.collectionView.collectionViewLayout invalidateLayout]; 

ve belki: Eğer sadece aramak için ihtiyacı olan yöntemlerden birinde
.


DÜZENLEME Bu yöntemi kullanmak

, ben resized erdikten sonra toplama relayout gerektiğini çünkü çalışmıyor galiba: Ben takmak ne yapıyorum

- (void) willTransitionToTraitCollection:(UITraitCollection *)newCollection withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator { 
    [super willTransitionToTraitCollection:newCollection withTransitionCoordinator:coordinator]; 


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

} 


Animasyon sürecine düzeni geçersiz kılma süreci.

+0

Sorunuzu, cevabınıza bir yanıtla güncelledim. – Idr

+0

Cevabımı düzenliyorum – Andrea

4

Eğer UICollectionViewLayout ait özel bir uygulama varsa, yöntemleri geçersiz kılmak için deneyin:

override public func shouldInvalidateLayoutForBoundsChange(newBounds: CGRect) -> Bool { 
    let bounds = self.collectionView!.bounds; 
    return ((CGRectGetWidth(newBounds) != CGRectGetWidth(bounds) || 
     (CGRectGetHeight(newBounds) != CGRectGetHeight(bounds)))); 
} 

override public func invalidateLayout() { 
    cache.removeAll() // remove layout attributes ans settings if they exist 
    super.invalidateLayout() 

} 

Şerefe!