web-dev-qa-db-ja.com

UICollectionViewの各Edgeの周囲にマージンを配置する

UICollectionViewに項目が入力されると、常に次のようにUICollectionViewの端に移動します。

---------------
|X X X X X X X|
|X X X X X X X|
|X X X X X X X|
|X X X X X X X|
|X X X X X X X|
|X X X X X X X|
---------------

各エッジの周りに次のようにマージンを配置したいと思います:

---------------
| X X X X X X |
| X X X X X X |
| X X X X X X |
| X X X X X X |
| X X X X X X |
| X X X X X X |
---------------

境界線をシミュレートするようにフレームを設定することにより、ホストしているUIView内にUICollectionViewを配置することでこれを達成しようとしましたが、フレーム内でスクロールするため、上部と下部が切り取られ、スクローラーもフレームの境界に表示されます。

私はAPIを見てきましたが、これを達成するために明白なものは何もありません。何か案は?

20
Adam

(UICollectionViewCell *)collectionView:(UICollectionView *)cv cellForItemAtIndexPath:(NSIndexPath *)indexPath {
}

セルの左側にマージンを与えることができます。

または、余白のあるカスタムセルを作成することもできます。

または、CollectionviewFlowLayoutのプロパティ。sectionInsetを設定できます。これは、最も簡単な方法です(FlowLayoutを使用する場合)。

7
Heckscheibe

これは古い質問ですが、UICollectionViewがUIScrollViewを継承していることを忘れないでください。

UICollectionView *collectionView = [[UICollectionView alloc] init];
collectionView.contentInset = UIEdgeInsetsMake(x.x, x.x, x.x, x.x);
// Swift 3 for good measure
let collectionView = UICollectionView()
collectionView.contentInset = UIEdgeInsets(top: x.x, left: x.x, bottom: x.x, right: x.x)

ContentInsetとsectionInsetの両方がビュー内のセルの間隔を変更する可能性があることに注意してください。詳細については、「 this 投稿」を参照してください。

40
Tyler Cloutier

以下の機能が利用できます。

- (UIEdgeInsets)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout insetForSectionAtIndex:(NSInteger)section
  {
      return UIEdgeInsetsMake(50, 50,15,50);
  }

1行でcollectionviewCellsを強制する方法を理解するには、数値をいじる必要があります。

UIEdgeInsetsMake ( CGFloat top,CGFloat left,CGFloat bottom,CGFloat right); 

Swift 3の場合

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets {
    return UIEdgeInsetsMake(10, 4, 10, 4)
}
15
Vinayak Kini

Collectionviewのプロトコルを使用して、グリッドのあらゆる側面をほぼ制御できます。次に例を示します。

- (UICollectionViewFlowLayout *)collectionViewFlowLayout
{
    UICollectionViewFlowLayout *flowLayout = [UICollectionViewFlowLayout new];
    flowLayout.itemSize = CGSizeMake(180, 255);
    flowLayout.sectionInset = UIEdgeInsetsMake(10, 30, 0, 30);
    flowLayout.minimumInteritemSpacing = 0.0f;
    flowLayout.minimumLineSpacing = 0.0f;
    flowLayout.scrollDirection = UICollectionViewScrollDirectionVertical;
    return flowLayout;
}

あなたのケースで変更したいのはsectionInsetsです

10
mmackh

Swift 2.0

self.automaticallyAdjustsScrollViewInsets = false
self.collectionView.contentInset = UIEdgeInsets(top: 10, left: 0, bottom: 0, right: 0)
3
Tal Zion

Xcode 8では、インターフェイスビルダーを使用している場合、サイズインスペクターでセクションインセットを設定できます。

enter image description here

enter image description here

1
Marcone

Swift 4が更新されましたVinayak Kini 回答):

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