UICollectionView aralık kenar boşlukları


181

UICollectionViewFotoğrafları gösteren bir tane var . Koleksiyon görünümünü kullanarak oluşturdum UICollectionViewFlowLayout. İyi çalışıyor ama kenar boşluklarında boşluk olmasını istiyorum. Bunu kullanarak yapmak mümkün mü yoksa UICollectionViewFlowLayoutkendim uygulamak zorunda mıyım UICollectionViewLayout?

Yanıtlar:


333

collectionView:layout:insetForSectionAtIndex:Yöntemi sizin için kullanabilir UICollectionViewveya nesnenize ekli nesnenin sectionInsetözelliğini ayarlayabilirsiniz :UICollectionViewFlowLayoutUICollectionView

- (UIEdgeInsets)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout insetForSectionAtIndex:(NSInteger)section{
    return UIEdgeInsetsMake(top, left, bottom, right);
}

veya

UICollectionViewFlowLayout *aFlowLayout = [[UICollectionViewFlowLayout alloc] init];
[aFlowLayout setSectionInset:UIEdgeInsetsMake(top, left, bottom, right)];

Swift 5 için güncellendi

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets {
       return UIEdgeInsets(top: 25, left: 15, bottom: 0, right: 5)
    }

35
Dikey akış düzeni kullanırken işe yarayacak sol ve sağ ekler görmüyorum ...
John

1
Şimdi alt sınıflı UICollectionViewFlowLayout sectionInset yönteminin geçersiz kılınmasının da hiçbir etkisi yoktur. Aşağıda açıklanan ayar özelliği çalışır.
Dren

4
Not: UICollectionViewDelegateFlowLayoutyöntemi kullanmak için ViewController delegeleri listenize eklemeyi unutmayıninsetForSectionAtIndex
David Douglas

98

Arayüz Oluşturucu'da aşağıdaki ekran görüntüsünde gösterildiği gibi ekleri ayarlama

UICollectionView için bölüm iç metinlerini ayarlama

Böyle bir şeyle sonuçlanacaktır:

Bölüm girişlerine sahip bir koleksiyon görünümü hücresi


2
Harika bir cevap, sadece bölüm aralığının iyi çalışması için minimum boşlukla oynamanız gerektiğini belirtmek istedim.
Smit Yash

75

Üzerine aralığı eklemek için entire UICollectionView :

UICollectionViewFlowLayout *flow = (UICollectionViewFlowLayout*) collection.collectionViewLayout;
flow.sectionInset = UIEdgeInsetsMake(topMargin, left, bottom, right);

Aynı satırdaki öğeler (yatay olarak kaydırıyorsanız sütun) ve boyutları arasındaki boşlukla oynamak için :

flow.itemSize = ...;
flow.minimumInteritemSpacing = ...;

5
Bu işe yarıyor, ancak collection.collectionViewLayout@Pooja örneğinde olduğu gibi bir oyuncu kadrosuna ihtiyaç duyuyor: UICollectionViewFlowLayout *flow = (UICollectionViewFlowLayout*) self.collectionViewLayout;
jwj

Hızlı Dökümif let flow = collectionViewLayout as? UICollectionViewFlowLayout { flow.itemSize = CGSize(width: 100, height: 100) }
Emily

41

Bu sayfadaki bazı yanlış bilgileri düzeltmek için:

1- minimum InterteremSpacing : Aynı satırdaki öğeler arasında kullanılacak minimum boşluk.

Varsayılan değer: 10.0.

(Dikey olarak kaydırılan bir ızgara için bu değer, aynı satırdaki öğeler arasındaki minimum aralığı temsil eder.)

2- minimumLineSpacing : Izgaradaki öğe satırları arasında kullanılacak minimum boşluk.

Ref: http://developer.apple.com/library/ios/#documentation/uikit/reference/UICollectionViewFlowLayout_class/Reference/Reference.html


2
Bu, bölümler arasındaki boşluğu etkilemez, sadece aynı bölümdeki öğeler arasında mı?
Crashalot

@Crashalot - minimumLineSpacing demek istemediğinizden emin misiniz? yani her hücre hattı? Gerçekten bölümler kullanıyorsanız Bölüm Ekleri için seçenekler de vardır.
Chucky

Bu benim için storyboard arayüzü üzerinden yaptım. Yalnızca yatay koleksiyon görünümleri için bir çözüm arıyordum. Teşekkürler +10
kemicofa hayalet

41

Hızlı 4

    let flow = collectionView.collectionViewLayout as! UICollectionViewFlowLayout // If you create collectionView programmatically then just create this flow by UICollectionViewFlowLayout() and init a collectionView by this flow.

    let itemSpacing: CGFloat = 3
    let itemsInOneLine: CGFloat = 3
    flow.sectionInset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)
    let width = UIScreen.main.bounds.size.width - itemSpacing * CGFloat(itemsInOneLine - 1) //collectionView.frame.width is the same as  UIScreen.main.bounds.size.width here.
    flow.itemSize = CGSize(width: floor(width/itemsInOneLine), height: width/itemsInOneLine)
    flow.minimumInteritemSpacing = 3
    flow.minimumLineSpacing = 3

XCode 11.4'ü DÜZENLE ve 5'i kaydır

let flow = collectionView.collectionViewLayout as! UICollectionViewFlowLayout

çalışmıyor. Aşağıdaki işleri kullanın.

let flow = UICollectionViewFlowLayout()

resim açıklamasını buraya girin


Boşluğa renk ayarlamanın bir yolu var mı?
Martín Serrano

1
@ MartínDaniel Sadece set backgroundColorarasında collectionView. Ya da süper görünüm ne olursa olsun.
William Hu

1
ancak kenarlarda kenar
boşluğu

@ user924 Kenarlardaki kenar boşlukları UIEdgeInsets (üst: sol: alt: sağ:) ile ayarlanabilir. Dikey olarak kaydırılıyorsa, sol / sağ ekleri ayarlayın. Yatay olarak kaydırıyorsanız, üst ve alt iç metinleri ayarlayın.
Marcy

9

Modern Swift, Otomatik Düzen Hesaplaması

Bu konu zaten bir sürü yararlı cevap içeriyor olsa da , William Hu'nın cevabına dayanan modern bir Swift sürümü eklemek istiyorum . Ayrıca iki şeyi geliştirir:

  • Farklı satırlar arasındaki boşluk artık aynı satırdaki öğeler arasındaki boşlukla eşleşecektir.
  • Minimum genişlik ayarlandığında kod, bir satırdaki öğe sayısını otomatik olarak hesaplar ve bu stili akış düzenine uygular.

İşte kod:

// Create flow layout
let flow = UICollectionViewFlowLayout()

// Define layout constants
let itemSpacing: CGFloat = 1
let minimumCellWidth: CGFloat = 120
let collectionViewWidth = collectionView!.bounds.size.width

// Calculate other required constants
let itemsInOneLine = CGFloat(Int((collectionViewWidth - CGFloat(Int(collectionViewWidth / minimumCellWidth) - 1) * itemSpacing) / minimumCellWidth))
let width = collectionViewWidth - itemSpacing * (itemsInOneLine - 1)
let cellWidth = floor(width / itemsInOneLine)
let realItemSpacing = itemSpacing + (width / itemsInOneLine - cellWidth) * itemsInOneLine / max(1, itemsInOneLine - 1))

// Apply values
flow.sectionInset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)
flow.itemSize = CGSize(width: cellWidth, height: cellWidth)
flow.minimumInteritemSpacing = realItemSpacing
flow.minimumLineSpacing = realItemSpacing

// Apply flow layout
collectionView?.setCollectionViewLayout(flow, animated: false)

itemsInOneLine1 ise , buradaki sıfıra bölündüğü için bir NaN ile sonuçlanır:itemsInOneLine / (itemsInOneLine - 1)
TylerJames

1
@TylerJames Teşekkürler! Sorunu çözmek için kodu ayarladım;)
fredpi

8

setMinimumLineSpacing:ve -Object setMinimumInteritemSpacing:üzerinde kullanın UICollectionViewFlowLayout.


Hayır beklendiği gibi çalışmıyor. setMinimumLineSpacing: Aynı satırdaki öğeler arasında kullanılacak minimum boşluk. Ve setMinimumInteritemSpacing şöyledir: Izgaradaki öğelerin satırları arasında kullanılacak minimum boşluk. Benim sorum elementler arasındaki boşluk değil kenar boşlukları hakkında. Örneğin. İlk elemanın sol ve üst aralığı.
Mert

dikey bir srollDirection varsayarsak, ilk ve son satırın üst ve alt aralıkları için contentInset öğesini kullanabilirsiniz. Ayrıca marjlarınızı Hücrelerinize ekleyebilirsiniz.
Jonathan Cichon

8

collectionViewFlowLayout.sectionInsetVeya collectionView:layout:insetForSectionAtIndex:komutunu kullanmak doğrudur.

Ancak, collectionView ürününüzde birden çok bölüm varsa ve tüm collectionView öğesine kenar boşluğu eklemek istiyorsanız, scrollView contentInset öğesini kullanmanızı öneririm:

UIEdgeInsets collectionViewInsets = UIEdgeInsetsMake(50.0, 0.0, 30.0, 0.0);
self.collectionView.contentInset = collectionViewInsets;
self.collectionView.scrollIndicatorInsets = UIEdgeInsetsMake(collectionViewInsets.top, 0, collectionViewInsets.bottom, 0);

5

CollectionItemS arasına boşluk koymak için bunu kullanın

Bu iki Satırı viewdidload'a yaz

UICollectionViewFlowLayout *collectionViewLayout = (UICollectionViewFlowLayout*)self.collectionView.collectionViewLayout;
collectionViewLayout.sectionInset = UIEdgeInsetsMake(<CGFloat top>, <CGFloat left>, <CGFloat bottom>, <CGFloat right>)

5

Set insetForSectionAtözelliği UICollectionViewFlowLayouteklenmiş nesne seninUICollectionView

Bu protokolü eklediğinizden emin olun

UICollectionViewDelegateFlowLayout

hızlı

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets {
        return UIEdgeInsets (top: top, left: left, bottom: bottom, right: right)
    }

Amaç - C

- (UIEdgeInsets)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout insetForSectionAtIndex:(NSInteger)section{
    return UIEdgeInsetsMake(top, left, bottom, right);
}

2

Hedef-C'de

CGFloat spacing = 5;
UICollectionViewFlowLayout *flow = (UICollectionViewFlowLayout*)_habbitCollectionV.collectionViewLayout;
flow.sectionInset = UIEdgeInsetsMake(0, spacing, 0, spacing);
CGFloat itemsPerRow = 2;
CGRect screenRect = [[UIScreen mainScreen] bounds];
CGFloat oneMore = itemsPerRow + 1;
CGFloat width = screenRect.size.width - spacing * oneMore;
CGFloat height = width / itemsPerRow;

flow.itemSize = CGSizeMake(floor(height), height);
flow.minimumInteritemSpacing = spacing;
flow.minimumLineSpacing = spacing;

Tek yapmanız gereken itemsPerRow değerini değiştirmek ve satır başına öğe sayısını buna göre güncellemek. Ayrıca, az ya da çok genel boşluk istiyorsanız boşluk değerini değiştirebilirsiniz.

resim açıklamasını buraya girin resim açıklamasını buraya girin


1
Güzel ... Mükemmel Çalış.
sohil

1

Belirtilen hücrelere kenar boşlukları eklemek için bu özel akış düzenini kullanabilirsiniz. https://github.com/voyages-sncf-technologies/VSCollectionViewCellInsetFlowLayout/

extension ViewController : VSCollectionViewDelegateCellInsetFlowLayout 
{
    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForItemAt indexPath: IndexPath) -> UIEdgeInsets {
        if indexPath.item == 0 {
            return UIEdgeInsets(top: 0, left: 0, bottom: 10, right: 0)
        }
        return UIEdgeInsets.zero
    }
}

0

Hızlı 4 ve autoLayout'ta, sectionInset öğesini şu şekilde kullanabilirsiniz :

let layout = UICollectionViewFlowLayout()
        layout.scrollDirection = .vertical
        layout.itemSize = CGSize(width: (view.frame.width-40)/2, height: (view.frame.width40)/2) // item size
        layout.sectionInset = UIEdgeInsetsMake(10, 10, 10, 10) // here you can add space to 4 side of item
        collectionView = UICollectionView(frame: self.view.bounds, collectionViewLayout: layout) // set layout to item
        collectionView?.register(ProductCategoryCell.self, forCellWithReuseIdentifier: cellIdentifier) // registerCell
        collectionView?.backgroundColor = .white // background color of UICollectionView
        view.addSubview(collectionView!) // add UICollectionView to view

-1

Her bölüm arasına 10 piksel ayırma eklemek için şunu yazın

flowLayout.sectionInset = UIEdgeInsetsMake(0.0, 0.0,10,0);

UICollectionReusableView tür UICollectionElementKindSectionFooter kullanırken, çözümünüz çalışmaz
Pratik Jamariya

-1
- (UIEdgeInsets)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout insetForSectionAtIndex:(NSInteger)section {       
         return UIEdgeInsetsMake(7, 10, 5, 10);    
   }
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.