[解決済み] UICollectionViewのセルを左揃えにする
2022-09-12 06:23:43
質問
プロジェクトでUICollectionViewを使っていますが、1行に複数の異なる幅のセルがあります。によると https://developer.apple.com/library/content/documentation/WindowsViews/Conceptual/CollectionViewPGforIOS/UsingtheFlowLayout/UsingtheFlowLayout.html
のようにすると、セルが行をまたいで同じパディングで広がります。これは、私がそれらを左揃えにして、パディング幅をハードコードしたいことを除いて、期待どおりに起こります。
私はUICollectionViewFlowLayoutをサブクラス化する必要があると思いますが、オンラインのチュートリアルなどをいくつか読んだ後、これがどのように動作するのかを理解できないようです。
どのように解決するのですか?
このスレッドにある他の解決策は、行が1つの項目で構成されている場合や、複雑すぎる場合には、正しく動作しません。
Ryan によって与えられた例に基づいて、新しい要素の Y 位置を検査することによって新しい行を検出するようにコードを変更しました。非常にシンプルで、パフォーマンスも速いです。
Swift。
class LeftAlignedCollectionViewFlowLayout: UICollectionViewFlowLayout {
override func layoutAttributesForElements(in rect: CGRect) -> [UICollectionViewLayoutAttributes]? {
let attributes = super.layoutAttributesForElements(in: rect)
var leftMargin = sectionInset.left
var maxY: CGFloat = -1.0
attributes?.forEach { layoutAttribute in
if layoutAttribute.frame.origin.y >= maxY {
leftMargin = sectionInset.left
}
layoutAttribute.frame.origin.x = leftMargin
leftMargin += layoutAttribute.frame.width + minimumInteritemSpacing
maxY = max(layoutAttribute.frame.maxY , maxY)
}
return attributes
}
}
補助ビューのサイズを維持させたい場合は、クロージャの上部にある
forEach
を呼び出します。
guard layoutAttribute.representedElementCategory == .cell else {
return
}
Objective-Cです。
- (NSArray *)layoutAttributesForElementsInRect:(CGRect)rect {
NSArray *attributes = [super layoutAttributesForElementsInRect:rect];
CGFloat leftMargin = self.sectionInset.left; //initalized to silence compiler, and actaully safer, but not planning to use.
CGFloat maxY = -1.0f;
//this loop assumes attributes are in IndexPath order
for (UICollectionViewLayoutAttributes *attribute in attributes) {
if (attribute.frame.origin.y >= maxY) {
leftMargin = self.sectionInset.left;
}
attribute.frame = CGRectMake(leftMargin, attribute.frame.origin.y, attribute.frame.size.width, attribute.frame.size.height);
leftMargin += attribute.frame.size.width + self.minimumInteritemSpacing;
maxY = MAX(CGRectGetMaxY(attribute.frame), maxY);
}
return attributes;
}
関連
-
[解決済み] UILabel 内のテキストを縦に上部に揃える
-
iOSコンパイルポッドでエラー CocoaPods could not find compatible versions for pod "XXXXX" が報告される。
-
[解決済み] iphoneアプリのベータテストはどのように行うのですか?
-
[解決済み] iOSとWatchKitで画像のtintColorを変更する方法
-
[解決済み] iOS 7でステータスバーとナビゲーションバーがビューの境界を越えて表示される
-
[解決済み】UICollectionView 自動レイアウトでセルサイズを変更する方法
-
[解決済み】UICollectionViewのセル間隔について
-
[解決済み] プログラムによるUICollectionViewの作成
-
[解決済み] UICollectionView、全幅のセル、オートレイアウトの動的な高さを許可しますか?
-
[解決済み] UICollectionViewを画面ではなくセルでページングする
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
IOS8 Development Guide Error Thread 1: signal SIGABRT
-
[解決済み] App Storeのアプリと連動させる方法
-
[解決済み] UIViewController のビューが表示されているかどうかを確認する方法
-
[解決済み] UIViewに角丸をつける
-
[解決済み] NSOperationとGrand Central Dispatchの比較
-
[解決済み] Swift 3, 4, 5 で dispatch_after GCD を書くにはどうしたらいいですか?
-
[解決済み] インポート vs #インポート - iOS 7
-
[解決済み] iPadマルチタスクのサポートには、これらの方向が必要です。
-
[解決済み] UIViewの角丸とドロップシャドウ?
-
[解決済み] コア・データ エンティティの全インスタンスを削除する最短の方法