SORU
8 Aralık 2012, CUMARTESİ


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
25 Mart 2013, PAZARTESİ


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)));
}

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Arun Kumar

    Arun Kumar

    18 Mart 2010
  • The Amazing Atheist

    The Amazing

    20 Kasım 2006
  • TrenchTech Computer Repair Tutorials

    TrenchTech C

    19 EYLÜL 2014