写真を表示するUICollectionView
ものがあります。を使用してコレクションビューを作成しましたUICollectionViewFlowLayout
。うまくいきますが、余白に間隔を空けたいです。を使用してそれを行うことは可能ですか、それともUICollectionViewFlowLayout
自分で実装する必要がありUICollectionViewLayout
ますか?
15 に答える
collectionView:layout:insetForSectionAtIndex:
のメソッドを使用するか、 :にアタッチされたオブジェクトのプロパティをUICollectionView
設定できます。sectionInset
UICollectionViewFlowLayout
UICollectionView
- (UIEdgeInsets)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout insetForSectionAtIndex:(NSInteger)section{
return UIEdgeInsetsMake(top, left, bottom, right);
}
また
UICollectionViewFlowLayout *aFlowLayout = [[UICollectionViewFlowLayout alloc] init];
[aFlowLayout setSectionInset:UIEdgeInsetsMake(top, left, bottom, right)];
Swift5用に更新
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets {
return UIEdgeInsets(top: 25, left: 15, bottom: 0, right: 5)
}
以下のスクリーンショットに示すように、InterfaceBuilderでインセットを設定します
結果は次のようになります。
全体 に間隔を追加するにはUICollectionView
:
UICollectionViewFlowLayout *flow = (UICollectionViewFlowLayout*) collection.collectionViewLayout;
flow.sectionInset = UIEdgeInsetsMake(topMargin, left, bottom, right);
同じ行(水平方向にスクロールしている場合は列)の要素間の間隔とそのサイズを操作するには:
flow.itemSize = ...;
flow.minimumInteritemSpacing = ...;
スウィフト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)
//collectionView.frame.width is the same as UIScreen.main.bounds.size.width here.
let width = UIScreen.main.bounds.size.width - itemSpacing * CGFloat(itemsInOneLine - 1)
flow.itemSize = CGSize(width: floor(width/itemsInOneLine), height: width/itemsInOneLine)
flow.minimumInteritemSpacing = 3
flow.minimumLineSpacing = itemSpacing
編集
scrollDirction
水平方向に変更する場合:
flow.scrollDirection = .horizontal
ノート
1行に項目を設定するのが正しくない場合は、コレクションビューにパディングがあるかどうかを確認してください。あれは:
let width = UIScreen.main.bounds.size.width - itemSpacing * CGFloat(itemsInOneLine - 1)
collectionViewの幅である必要があります。
このページのいくつかの間違った情報を修正するためだけに:
1- minimumInteritemSpacing:同じ行のアイテム間で使用する最小間隔。
デフォルト値:10.0。
(垂直方向にスクロールするグリッドの場合、この値は同じ行のアイテム間の最小間隔を表します。)
2- minimumLineSpacing:グリッド内のアイテムの行間で使用する最小間隔。
モダンスイフト、自動レイアウト計算
このスレッドにはすでに多くの有用な回答が含まれていますが、WilliamHuの回答に基づいて最新のSwiftバージョンを追加したいと思います。また、2つの点が改善されます。
- 異なる行間の間隔は、常に同じ行のアイテム間の間隔と一致するようになりました。
- 最小幅を設定することにより、コードは行のアイテム数を自動的に計算し、そのスタイルをフローレイアウトに適用します。
コードは次のとおりです。
// 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)
-Objectで使用setMinimumLineSpacing:
します。setMinimumInteritemSpacing:
UICollectionViewFlowLayout
collectionViewFlowLayout.sectionInset
またはを使用しcollectionView:layout:insetForSectionAtIndex:
て正しい。
ただし、collectionViewに複数のセクションがあり、collectionView全体にマージンを追加する場合は、scrollViewcontentInsetを使用することをお勧めします。
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);
の間にスペースを入れるには、これをCollectionItem
使用します
この2行をviewdidloadに書き込みます
UICollectionViewFlowLayout *collectionViewLayout = (UICollectionViewFlowLayout*)self.collectionView.collectionViewLayout;
collectionViewLayout.sectionInset = UIEdgeInsetsMake(<CGFloat top>, <CGFloat left>, <CGFloat bottom>, <CGFloat right>)
アタッチされているオブジェクトのinsetForSectionAt
プロパティを設定しますUICollectionViewFlowLayout
UICollectionView
このプロトコルを必ず追加してください
UICollectionViewDelegateFlowLayout
迅速
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets {
return UIEdgeInsets (top: top, left: left, bottom: bottom, right: right)
}
目的-C
- (UIEdgeInsets)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout insetForSectionAtIndex:(NSInteger)section{
return UIEdgeInsetsMake(top, left, bottom, right);
}
Objective-Cで
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;
itemsPerRow値を変更するだけで、それに応じて行ごとのアイテム数が更新されます。さらに、多かれ少なかれ一般的な間隔が必要な場合は、間隔の値を変更できます。
指定したセルに余白を追加するには、このカスタムフローレイアウトを使用できます。 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
}
}
swift 4およびautoLayoutでは、次のようにsectionInsetを使用できます。
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
各セクションの間に10pxの間隔を追加するには、これを書くだけです
flowLayout.sectionInset = UIEdgeInsetsMake(0.0, 0.0,10,0);
- (UIEdgeInsets)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout insetForSectionAtIndex:(NSInteger)section {
return UIEdgeInsetsMake(7, 10, 5, 10);
}