ネイティブのUIPageViewController
水平ページングをUICollectionView
に置き換える方法を探しています。
これまでのところ、私は次のことをしました:
let layout = UICollectionViewFlowLayout()
layout.scrollDirection = .horizontal
layout.itemSize = collectionView.frame.size
layout.minimumLineSpacing = 0
layout.minimumInteritemSpacing = 10
collectionView.setCollectionViewLayout(layout, animated: false)
collectionView.isPagingEnabled = true
collectionView.alwaysBounceVertical = false
これはうまく機能し、水平方向のページング効果が得られます。
ここで、ページ間に水平スペースを追加します(uがUIPageViewControllerOptionInterPageSpacingKey
のUIPageViewController
で行うように)
これまでのところ、ページング効果を損なうことなくスペースを追加する方法はうまくいきませんでした。 UIPageViewController
の場合と同じ動作を探しています:セルは画面幅全体を埋め、セル間のスペースはページを切り替えたときにのみ表示されます。
解決策1:
collectionView.isPagingEnabled = false
minimumLineSpacing
を追加しますtargetContentOffsetForProposedContentOffset:withScrollingVelocity:
は、contentOffsetを最も近いページに移動します。 itemSize
とminimumLineSpacing
に基づいた簡単な数学でページを計算できますが、それを正しくするには少し手間がかかります。解決策2:
collectionView.isPagingEnabled = true
minimumLineSpacing
を追加しますminimumLineSpacing
が10の場合、collectionViewのフレームを{0、-5、width + 10、height}に設定しますminimumLineSpacing
と等しいcontentInsetを設定します。Swift 3.1、で書かれたコードは、あなたにとって簡単に理解できると確信しています:
let pageSpacing: CGFloat = 10
class ViewController: UITableViewController {
override func viewDidLoad() {
super.viewDidLoad()
let layout = UICollectionViewFlowLayout()
layout.itemSize = CGSize(width: view.frame.width + pageSpacing, height: view.frame.height)
layout.scrollDirection = .horizontal
layout.minimumInteritemSpacing = 0
layout.minimumLineSpacing = 0
let frame = CGRect(x: 0, y: 0, width: view.frame.width + pageSpacing, height: view.frame.height)
let collectionView = UICollectionView(frame: frame, collectionViewLayout: layout)
view.addSubview(collectionView)
}
}
class MyCell: UICollectionViewCell {
var fullScreenImageView = UIImageView()
override func layoutSubviews() {
super.layoutSubviews()
fullScreenImageView.frame = CGRect(x: 0, y: 0, width: frame.width - pageSpacing, height: frame.height)
}
}
それがあなたを助けることを願っています。