4

UIPageViewControllerネイティブのページングをUICollectionViewに置き換える方法を探しています。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はUIPageViewControllerUIPageViewControllerOptionInterPageSpacingKeyで行いますように)ページ間の水平方向のスペースを追加したい

これまでのところ私は、ページング効果を損傷することなく、スペースを追加する方法を微ことができませんでした。 UIPageViewControllerと同じ動作を探している:セルが画面幅全体を満たす必要があり、セル間のスペースはページを切り替えるときにのみ表示する必要があります。

答えて

5

策1:

  1. 最も近いページにcontentOffsetを移動するためにtargetContentOffsetForProposedContentOffset:withScrollingVelocity:を実装するページ
  2. 間の距離をminimumLineSpacingを追加偽
  3. collectionView.isPagingEnabled = trueセットそれを使用しないでください。 itemSizeminimumLineSpacingに基づいて簡単な数式でページを計算できますが、それを正しく行うには少し時間がかかることがあります。

対処方法2:

  1. collectionView.isPagingEnabled = true
  2. ページングサイズはcollectionViewの境界に基づいてページ
  3. 間の距離のためminimumLineSpacingを追加します。したがって、collectionViewを大きくしてからscreenSizeします。たとえば、minimumLineSpacingが10の場合、collectionViewのフレームを{0、-5、width + 10、height}に設定します。
  4. は、contentInsetをminimumLineSpacingに設定して最初と最後の項目を正しく表示させます。デフォルトで
+0

しかし、すべてのページング動作を複製するのは難しいでしょう – Eyal

+0

あなたは正しいです、私は簡単な解決策を追加しました –

+0

素晴らしいアイデア – Eyal

1
  • は、UICollectionViewFlowLayoutのminimumLineSpacingはcollectionViewの項目が水平に充填されている10.0(itemSize.width = collectionView.bounds.width)とcollectionViewがゼロ「minimumLineSpacing」より大きい意図しない性能の原因となり、有効にページングされます:2ページ目から始まり、すべてのページにページ番号で累積されるギャップがあります。
  • この問題を解決するために、collectionViewの幅を 'minimumLineSpacing'で拡張できるようです。しかし、ページを牽引する以上の場合、collectionViewは最後のものに 'lineSpacing'を与えないので、 'contentSize'はこのページのコンテンツを完全に表示するには不十分です。つまり、 'minimumLineSpacing'が10.0最後のページの終わりは、collectionViewのcontentSizeを10.0だけ上回ります。
  • 最後に、私はすべてのアイテム(UIScrollViewのpreformanceのような)間にマージンを挿入します:すべてのcollectionViewItemの幅を固定値 'pageSpacing'(例:10.0)で展開し、collectionViewの幅を同じ値、あまりにも。そして、collevtionViewCellのサブビューをレイアウトするときに、実際のコンテンツを表示するためのスペースがないことを忘れないでください。

相続人スウィフト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) 
    } 
} 

ホープ。

関連する問題