UICollectionView を水平方向にスクロールする際に、セルの中央にスナップする機能
2023-08-19 03:41:15
質問
以前にも何人かがこの質問をしたことがあると思いますが、それらはすべて
UITableViews
または
UIScrollViews
で、私は受け入れられた解決策をうまく使うことができませんでした。私が欲しいのは、私の
UICollectionView
iOS 9+ が私のターゲット ビルドなので、これに答える前に UIKit の変更に目を通してください。
ありがとうございます。
どのように解決するのですか?
もともとObjective-Cを使っていたのですが、Swiftに変更したため、当初の回答では不十分でした。
結局
UICollectionViewLayout
サブクラスを作成しました。これは、ユーザーがスクロールを停止したときにコンテンツのオフセットまたは同様の何かを変更する他の機能とは対照的に、最高の (imo) エクスペリエンスを提供します。
class SnappingCollectionViewLayout: UICollectionViewFlowLayout {
override func targetContentOffset(forProposedContentOffset proposedContentOffset: CGPoint, withScrollingVelocity velocity: CGPoint) -> CGPoint {
guard let collectionView = collectionView else { return super.targetContentOffset(forProposedContentOffset: proposedContentOffset, withScrollingVelocity: velocity) }
var offsetAdjustment = CGFloat.greatestFiniteMagnitude
let horizontalOffset = proposedContentOffset.x + collectionView.contentInset.left
let targetRect = CGRect(x: proposedContentOffset.x, y: 0, width: collectionView.bounds.size.width, height: collectionView.bounds.size.height)
let layoutAttributesArray = super.layoutAttributesForElements(in: targetRect)
layoutAttributesArray?.forEach({ (layoutAttributes) in
let itemOffset = layoutAttributes.frame.origin.x
if fabsf(Float(itemOffset - horizontalOffset)) < fabsf(Float(offsetAdjustment)) {
offsetAdjustment = itemOffset - horizontalOffset
}
})
return CGPoint(x: proposedContentOffset.x + offsetAdjustment, y: proposedContentOffset.y)
}
}
現在のレイアウトサブクラスで最もネイティブな感じの減速をするために、以下を必ず設定してください。
collectionView?.decelerationRate = UIScrollViewDecelerationRateFast
関連
-
[解決済み] カスタムオブジェクトを含むNSMutableArrayをソートするにはどうすればよいですか?
-
[解決済み] SwiftでStringを配列に分割する?
-
[解決済み] Xcode 6のバグ:Interface Builderファイル内の不明なクラス
-
[解決済み] UITextViewのマージン/パディングをなくす方法
-
[解決済み] iOS 7でステータスバーとナビゲーションバーがビューの境界を越えて表示される
-
[解決済み] UITextBorderStyleNoneを使用してUITextFieldのパディングを設定する
-
[解決済み】UICollectionViewのセル間隔について
-
[解決済み] StoryboardのプロトタイプセルでUICollectionViewCell contentViewのフレームが自動サイズ調整される問題(Xcode 6, iOS 8 SDK)がiOS 7のみで発生する
-
[解決済み] 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 実装 サイバーパンク風ボタン
おすすめ
-
iOS classic error Undefined symbols for architecture XXX:
-
[解決済み] 制約条件の変更をアニメーションで表現するには?
-
[解決済み] 文字列の長さを取得する
-
[解決済み] UITextFieldの最大文字数を設定します。
-
[解決済み] iphoneアプリのベータテストはどのように行うのですか?
-
[解決済み] UITextFieldのテキストインセット?
-
[解決済み] Swift で HTTP リクエストを行うにはどうしたらいいですか?
-
[解決済み] UIImageのサイズを変更する最も簡単な方法?
-
[解決済み] iOS 11、Apple TV 4Kなどを搭載したXcode 9でワイヤレスデバッグを行う方法とは?
-
[解決済み] UICollectionViewがIndexPathのセルまで自動スクロールする件