Hoşgeldin. Soru sormak veya cevaplamak için hemen üye ol.

Vertical CollectionView Cell İçince Horizantal CollectionView

0 oy
211 kez görüntülendi
9, Ağustos, 2015 ios development kategorisinde huseyinvural tarafından soruldu
23, Ağustos, 2015 huseyinvural tarafından yeniden gösterildi
Merhaba biraz sorum öncesi yalakalık gibi olucak ama, nerdeyse türkçe hiç bir kaynağın bulunmadığı bir ortamda böyle detaylıca ve ilgiyle soru cevaplıyor oluşunuz takdire şayan, paylaşımlarınız için minnettarım. Söyle bir sorunum var aslen web tarafında bu sektörde olmama rağmen mobil tarafına swift ile giriş yaptım ve bocalıyorum.

Dikey collection hücreleri içine yatay collection hücreleri yerleştirmek istiyorum. Bunun için storybord yardımı ile bir view oluşturup bunun içince bir collection view a ide ara yüzünden ekleyip 4 adet hücreyi oluşturdum. Buraya kadarki delegete işlemiyle ilgili bir sorunum yok, daha sonra oluşan her hücreye atanmış olan class içinde programatik olarak bir collection view daha ekleyip horizantal olarak ayarladım, bu işlem sonucunda ilk hücrede görüntülememe rağmen her tekrarda eklediğimi düşünüdüğüm collection view içindeki yatay collection view sadece ilk hücrede gözüküyor, subview sayılarına baktığımda diğerlerine hiç eklenmediğini görüyorum.

projeye aşağıdaki linkten ulaşabilirsiniz.

https://drive.google.com/open?id=0B4MEF11v_cH3VktqNUtuM1h2Wnc

işin garip tarafı collection view değilde bir label eklemek istediğimde gayet normal ekleniyor ama ikinci bir collection viewı bir türlü ekleyemedim takıldım kaldım çok araştırdım ama beceremedim. Şimdi burdan ileriyede gidemiyorum önümce duvar gibi kaldı.

Ben delege işlemlerinde bir yanlışlık yaptığımı düşündüm temel olrak delege yapısını araştırıp öğrensemde sanırım burada hata yapıyorum. Böyle ve daha farklı karmaşık çalışmalarda delegete işlemi genel olarak nasıl kullanılır ufak bir analatabilirseniz çok, mutlu olurum. Biliyorum işiniz gücünüz vardır, çok şey istiyorum ama inanın çok araştırmama rağmen doğru kaynağı bulamadım. Yardımcı olacağınızı umuyorum. Çok teşekkürler.

1 cevap

+2 oy
10, Ağustos, 2015 yasin tarafından cevaplandı
28, Ağustos, 2015 huseyinvural tarafından seçilmiş
 
En İyi Cevap

viewController şöyle;

import UIKit

class ViewController: UIViewController, UICollectionViewDelegate,UICollectionViewDataSource, UICollectionViewDelegateFlowLayout {

    @IBOutlet weak var vCollectionView: UICollectionView!
    let content = ["caps1","caps2","caps3","caps4"];
    let cellReuseIdentifier:String = "myCell"

    override func viewDidLoad() {
        super.viewDidLoad()
        self.vCollectionView.registerClass(vCollectionViewCell.self, forCellWithReuseIdentifier: self.cellReuseIdentifier)
        // Do any additional setup after loading the view, typically from a nib.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }


    func collectionView(vCollectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return self.content.count;
    }

    func collectionView(vCollectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
        let vCell:vCollectionViewCell = (vCollectionView.dequeueReusableCellWithReuseIdentifier(self.cellReuseIdentifier, forIndexPath: indexPath) as? vCollectionViewCell)!
        return vCell;
    }
}

vCollectionViewCell'de şöyle olmalı;

class vCollectionViewCell: UICollectionViewCell, UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout {

    var collectionView: UICollectionView!
    let cellReuseIdentifier:String = "myInnerCell"
    var layout: UICollectionViewFlowLayout = UICollectionViewFlowLayout()


    override init(frame: CGRect) {
        super.init(frame: frame)

        self.layout.sectionInset = UIEdgeInsets(top: 10, left: 10, bottom: 10, right: 10)
        self.layout.itemSize = CGSize(width:self.frame.width-40, height:self.frame.height-100)
        self.layout.scrollDirection = UICollectionViewScrollDirection.Horizontal

        self.collectionView = UICollectionView(frame:self.frame, collectionViewLayout: self.layout)
        self.collectionView.backgroundColor = UIColor.purpleColor()
        self.collectionView.frame = self.bounds
        self.collectionView.dataSource = self
        self.collectionView.delegate = self
        self.collectionView.registerClass(UICollectionViewCell.self, forCellWithReuseIdentifier: self.cellReuseIdentifier)
        self.collectionView.reloadData()
        self.addSubview(self.collectionView)
    }

    required init(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }


    func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return 10
    }

    func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCellWithReuseIdentifier(self.cellReuseIdentifier, forIndexPath: indexPath) as! UICollectionViewCell
        cell.backgroundColor = UIColor.orangeColor()
        return cell
    }

}
10, Ağustos, 2015 huseyinvural tarafından yorumlandı
Selamlar, öncelikle hızlı cevabın için bu içerikten faydalanacak herkes adına çok teşekkür ederim. Yazdığın kodları detaylıca inceledim benim yazdıklarımlada karşılaştırdığımda, collection'ın frame değerini yazmadığımı farketim kendi kodlarıma bunu ekleyince sorun hallolmuş oldu, kusura bakma yeni olduğum için böyle şeyler gözümden kaçıyor.

Yazımda eminim bir çok hata görmüşsündür fakat bunların haricinde çalışmamasını genel sebebi söylediğim gibi frame değerinin eksikliğimiydi.

Ayrıca senin yapmış olduğun örnekteki gibi init methodu ile başlattığımda story board da tanımlamış olmama rağmen senin yazdığın örnekteki gibi registerClass işlemini didload kısmında yapmamı tekrar istiyor bunun mantığını anlyamadım storyboard dan tanımlamış olmam neden yeterli gelmiyor bu normal birşeymi ?

Son olarak UICollectionView ile UICollectionViewFlowLayout un farkı nedir söyleyebilirmisin ? Çok soru sorduğumu biliyor affına sığınıyorum :D Verdiğin vermediğim tüm cevaplar için teşekkür ederim çok yardımcı oldun.
11, Ağustos, 2015 yasin tarafından yorumlandı
UITableView veya collectionView'de satır veya hücreleri oluştururken reusable bir yapı kurmak önemlidir.
aksi takdirde uygulama performansında ciddi sıkıntılar baş gösteriri.
uygulamanız bu yanlış yapıyla da çalışabilir, ilk bakış da bir şey anlamayabilir ve herşeyin yolunda olduğunu düşünebilirsiniz.

mesela sizin örneğinizde kurduğunuz yapı daha önceden register edilmiş tek bir UICollectionView kullanmak yerine, dikey olarak scroll etitiğiniz collection view cell'lerin ekran görünür alanına girdiklerinde her defasında yeniden render edilmelerine neden oluyor.
ayrıca cellForItemAtIndexPath metodu içerisinde’de bu cell’lerin içeriğini her scroll edildikleri ve ekran görünür alanına girdiklerinde yeniden oluşturuluyor. oldukça yanlış bir yol.
kendi örneğinizde bu problemi cell’lerin içerisine atadığınız ve random text’ler oluşturan UILabel’lar içerisinde rahatlıkla gözlemleyebilirsiniz mesela.
collectionView’i scroll ettiğinizde en alttaki ekran dışında kalan cell’deki text her defasında değişiyor.
problem sadece frame değerlerini set etmenizle alakalı değil yani, kurduğunuz yapıyla ilgili.

benim verdiğim örnekteyse;
viewControler / viewDidLoad metodumuz içerisinde bir defa ya mahsus custom UICollectionViewCell subclass’ımız olan vCollectionViewCell class’ını bir reusable identifier’la set ediyoruz.

bu sayede cellForItemAtIndexPath delegate metodu collectionView scroll’edildiğinde ekran görünür alanına giren bir cell’i, viewDidLoad metodumuz içerisinde kullandığımız reusable identifier’ı kullanarak initiate’ediyor ve bu custom sublass’ımızda kendi içeriğini oluşturuyor. bu kadar.

artık collectionView’imiz her defasında scroll edildiğinde oluşturulmuş herhangi bir cell ekran dışında kaldığında kaldırılacak ve tekrar ekran içerisine girdiğinde identifier kullanılarak yeniden eklenecek. yeniden oluşturulmaları gibi bir durum söz konusu olmayacak yani. ekran dışında kalan ve hiç oluşturulmamış cell’ise ekrana girdiğinde oluşturulacak.
11, Ağustos, 2015 huseyinvural tarafından yorumlandı
böyle detaylıca inceleyip anlattığınız için çok teşekkür ederim. gerçekten takdir edilecek  bir iş yapıyorsunuz.  
Bu arada bir not, sitede yorum girdiğimiz textarea alanı yaklaşık 300 karakter sonra kasmaya karakter girilirken yavaşlamaya başlıyor. Crhom browserda mac ve win7 de denedim böyle bir sorun var sitede bilginiz olsun.

İyi çalışmalr
11, Ağustos, 2015 yasin tarafından yorumlandı
evet textarea'ile ilgili sorunu ben de yeni fark ettim, benim browser'dan kaynaklandığını düşünmüştüm. demekki siteyle ilgili bir sorun. inceleyeceğim. Uyardığınız için teşekkürler.
...