NIC

11

ile UICollectionViewCell tanımlama Doğru bir şekilde anlıyorsam, UICollectionViewCell içeriği, contentView özelliğine ve arka plana backgroundView içine girmelidir. Ben contentView veya backgroundView hiç söz yoktur Interface Builder bir UICollectionViewCell sürüklemek OysaNIC

. Alt görünümler eklerseniz, bunlar tüm hücreyi contentView veya backgroundView değil, üst öğesi olarak kullanır.

UICollectionViewCell'u IB ile tanımlamanın doğru yolu nedir?

cevap

14

Bu doğru değildir

"Ben subviews eklerseniz, bu contentView değil, onun ebeveyn olarak bütün hücre olacak". Bir UICollectionViewCell uygulamasında sürükler ve UI öğeleri eklerseniz, bunları içerik görünümüne ekliyorsunuz demektir. Nesneler listesinde görünmüyor olması, orada olmadığı anlamına gelmez (aynı şey NSBox için de geçerlidir - IB'de görünmeyen bir içerik görünümüne sahiptir). Eğer collectionView: didSelectItemAtIndexPath: ise, cellForItemAtIndexPath dosyasını kaydeder ve alt görünümlerine bakarsanız, sadece bir tane bulursunuz ve cell.contentView ile oturum açtığınızda aynıdır. Eğer alt raporlarını kaydederseniz, UI öğelerinizi göreceksiniz.

Şimdi, arka plan görüntüsü olarak, IB'den erişebileceğiniz bir şey olduğunu düşünmüyorum. Bir UIView ile bir xib dosyanız olabilir ve ardından bunu hücrenin backgroundView özelliğine atayın.

+2

Yarı gerçek. Bunu daha önce denedim ve işe yaramadı. Ancak UIView'i sürükleyip UICollectionViewCell alt sınıfını değiştirdim. Sadece tam olarak söylediklerini yaparsanız çalışır: bir UIColllectionViewCell kütüphaneden sürükleyin ve sonra türü değiştirin. Çok hacky. – hpique

+1

@hpique Alt sınıftan önce doğru nesne türüyle başlamalısınız.UICollectionViewCell ile başlayarak, UIView ile elde edemeyeceğiniz tüm varsayılan özelliklerini ve verilerini elde edersiniz. – rdelmar

+0

Kötü çünkü 'contentView' örtük. Göremediğimden beri, bir türden başlayarak ya da diğeriyle fark yaratan bir deneme yanılma hatası olduğunu bilemedim. – hpique

7

Daha iyi bir seçenek olmaması nedeniyle, contentView ve backgroundView için ayrı nib dosyaları kullanıyorum. Sonra benim UICollectionViewCell alt sınıfta:

- (id)initWithFrame:(CGRect)frame 
{ 
    self = [super initWithFrame:frame]; 
    if (self) 
    { 
     NSArray *contentViewNib = [[NSBundle mainBundle] loadNibNamed:@"CollectionViewCellContentView" owner:self options:nil]; 
     [self.contentView addSubview:contentViewNib[0]]; 
     NSArray *backgroundViewNib = [[NSBundle mainBundle] loadNibNamed:@"CollectionViewCellBackgroundView" owner:self options:nil]; 
     self.backgroundView = backgroundViewNib[0]; 
    } 
    return self; 
} 
+0

Sadece sınıfınızı koleksiyon görünümü ile kaydediyorsunuz ve ardından xib'lerinizi hücre sınıfının initWithFrame'ine yüklüyor musunuz? – topwik

+0

daha sonra xib kodunuzda kurmuş olabileceğiniz tüm çıkışlara erişebiliyor musunuz? – topwik

+1

bu şekilde, şimdiye kadar anlatabildiğim kadarıyla, bu xib'lerin herhangi bir içeriğini değiştirmeyi planlamıyorsanız, sadece iyidir. Bu xib'lerde hücre başına değişen dinamik içerik, etiket veya metin alanları olmaz mıydı? – topwik

0

Bu, Xcode 8 için yeni olup olmadığından emin değilim, ancak UICollectionViewCell, backgroundView ve selectedBackgroundView'u bağlamak için çıkışlar içerir.

enter image description here

Bu sayede size toplama görünümü hücreye bir UIView (veya alt sınıfı) ekleyebilir ve çıkışları birine ya bağlayın. Bu sayede IB kullanarak bunları tanımlayabilirsiniz. Bu yardımcı olur

enter image description here

Umut!