Dinamik UİCollectionView neden düzeni ayarı açıklanamaz contentOffset değiştirin
Apple belgelerine göre (ve WWDC 2012'de lanse), Olası UICollectionView
dinamik olarak düzenini ayarlamak ve hatta bu değişiklikleri animasyon için:
Sana toplama bir görünüm oluştururken normal düzeni bir nesne belirtin ama aynı zamanda bir toplama düzenini dinamik olarak değiştirebilirsiniz. Düzen nesne collectionViewLayout özelliğinde saklanır. Doğrudan bu özelliği ayarlamak düzeni hemen, değişiklikleri animasyon olmadan günceller. Eğer bu değişiklikleri animasyon eklemek isterseniz, setCollectionViewLayout çağırmalısınız:animasyon: yöntem yerine.
Ancak uygulamada, UICollectionView
anlaşılmaz ve hatta geçersiz değişiklikleri contentOffset
, hücreleri, yanlış hareket etmesine sebep, bu özelliğin neredeyse kullanışsız yapmak için yapar buldum. Sorunu göstermek için, birlikte varsayılan bir görünüm koleksiyonu bir film şeridi içine düştü denetleyicisine bağlı aşağıdaki örnek kod koydum:
#import <UIKit/UIKit.h>
@interface MyCollectionViewController : UICollectionViewController
@end
@implementation MyCollectionViewController
- (void)viewDidLoad
{
[super viewDidLoad];
[self.collectionView registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:@"CELL"];
self.collectionView.collectionViewLayout = [[UICollectionViewFlowLayout alloc] init];
}
- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section
{
return 1;
}
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
UICollectionViewCell *cell = [self.collectionView dequeueReusableCellWithReuseIdentifier:@"CELL" forIndexPath:indexPath];
cell.backgroundColor = [UIColor whiteColor];
return cell;
}
- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath
{
NSLog(@"contentOffset=(%f, %f)", self.collectionView.contentOffset.x, self.collectionView.contentOffset.y);
[self.collectionView setCollectionViewLayout:[[UICollectionViewFlowLayout alloc] init] animated:YES];
NSLog(@"contentOffset=(%f, %f)", self.collectionView.contentOffset.x, self.collectionView.contentOffset.y);
}
@end
Denetleyicisi varsayılan viewDidLoad
UICollectionViewFlowLayout
ayarlar ve ekrandaki tek bir hücre görüntüler. Hücre seçildiğinde, denetleyici başka bir varsayılan UICollectionViewFlowLayout
oluşturur ve animated:YES
bayrağı ile toplama görünümünü ayarlar. Beklenen davranış, hücre taşımaz. Gerçek davranışı, ancak, hücrenin hangi noktada bile mümkün hücrenin arka ekrandaki kaydırma için değil off-ekran ilerleyin.
Konsolda oturum görünümlü contentOffset açıklanamaz (projem, (0, 0), (0, 205)) değiştiğini ortaya koymaktadır. solution for the non-animated case için bir çözüm (i.e. animated:NO
) koydum, ama animasyon ihtiyacım var beri, kimseye animasyon durum için bir çözüm veya geçici çözüm varsa bilmek çok ilgileniyorum.
Bir yan not olarak, özel test düzenleri ve aynı davranışı elde ettim.
CEVAP
Bu gün saçımı çekerek oldum ve yardımcı olabilecek durumum için bir çözüm bulmuş.
Benim durumumda ipad fotoğraflar uygulamasında fotoğraf gibi çöken bir düzen var. Üst üste fotoğraf albümleri gösterir ve fotoğrafları büyütür bir albüme dokunun. Ben ne iki ayrı UİCollectionViewLayouts ve [self.collectionView setCollectionViewLayout:myLayout animated:YES]
ile aralarında geçmek. o yüzden hücreleri animasyon önce atlama ile tam olarak sorun yaşıyordum ve contentOffset
olduğunu fark etti. Her şeyi denedim contentOffset
ile ama yine de animasyon sırasında atladı. tyler'ın çözüm üstünde çalıştı ama yine de animasyon ile uğraşıyor.
Ekrandaki bir kaç albüm vardı sadece, ekranı doldurmak için yeterli değil, bunun olduğunu fark ettim. Benim düzeni tavsiye olarak -(CGSize)collectionViewContentSize
geçersiz kılar. Koleksiyon içeriği görüntüleme sadece birkaç albüm olduğunda görüş boyutu içerik boyutu daha azdır. Tahsilat düzenleri arasında geçiş yapmak bir sıçramaya sebep oluyor.
Benim düzenleri bir özellik minHeight adlı kurdum ve toplama manzarası ebeveyn yüksekliği ayarlayın. -(CGSize)collectionViewContentSize
ben döndürmeden önce yüksekliği ben o yüksekliği ^ olduğundan emin olun . = minimum yüksekliği.
Gerçek bir çözüm değil ama gayet iyi çalışıyor. Bu görünüm içeren en az uzunlukta olacak şekilde toplama bakış contentSize
ayarı denemek istiyorum.
düzenleme: Manicaesar eklenen UİCollectionViewFlowLayout miras eğer kolay bir çözüm
-(CGSize)collectionViewContentSize { //Workaround
CGSize superSize = [super collectionViewContentSize];
CGRect frame = self.collectionView.frame;
return CGSizeMake(fmaxf(superSize.width, CGRectGetWidth(frame)), fmaxf(superSize.height, CGRectGetHeight(frame)));
}
Jilet dinamik Anonim tür RuntimeBinder...
Android arka Plan Ve Sebat Menü Çubuğu...
Neden nesne türü dinamik bir null başv...
Neden C# dinamik tip statik?...
Neden 'Bir veya daha fazla türde ...