MTImagePickerFlowLayout.swift 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. //
  2. // MTImagePickerFlowLayout.swift
  3. // MTImagePicker
  4. //
  5. // Created by Luo on 5/24/16.
  6. // Copyright © 2016 Luo. All rights reserved.
  7. //
  8. import UIKit
  9. class MTImagePickerFlowLayout: UICollectionViewFlowLayout {
  10. var space: CGFloat!
  11. var itemOfRow: Int = 4
  12. override func prepare() {
  13. self.minimumLineSpacing = 0
  14. self.minimumInteritemSpacing = 0
  15. let bounds = UIScreen.main.compatibleBounds
  16. self.space = bounds.width / CGFloat(itemOfRow) / 20.0
  17. // - 1 避免精度丢失导致一行放不下4个
  18. let width = ( bounds.width - self.space - 1 ) / CGFloat(itemOfRow)
  19. self.itemSize = CGSize(width: width, height: width)
  20. if let collectionView = (self.collectionView as? MTImagePickerCollectionView) {
  21. collectionView.leading.constant = self.space / 2.0
  22. collectionView.trailing.constant = self.space / 2.0
  23. collectionView.contentOffset = self.targetContentOffset(forProposedContentOffset: collectionView.contentOffset)
  24. }
  25. }
  26. // 旋转之后重新布局,维持contentOffset和之前显示的cell一致
  27. override func targetContentOffset(forProposedContentOffset proposedContentOffset: CGPoint) -> CGPoint {
  28. if let collectionView = self.collectionView as? MTImagePickerCollectionView, let prevItemSize = collectionView.prevItemSize {
  29. let rows = collectionView.prevOffset / prevItemSize.width
  30. collectionView.prevItemSize = nil
  31. return CGPoint(x: 0, y: self.itemSize.width * rows)
  32. }
  33. return super.targetContentOffset(forProposedContentOffset: proposedContentOffset)
  34. }
  35. }
  36. class MTImagePickerPreviewFlowLayout: UICollectionViewFlowLayout {
  37. override func prepare() {
  38. self.minimumLineSpacing = 0
  39. self.minimumInteritemSpacing = 0
  40. if let collectionView = self.collectionView {
  41. self.itemSize = collectionView.bounds.size
  42. collectionView.contentOffset = self.targetContentOffset(forProposedContentOffset: collectionView.contentOffset)
  43. }
  44. }
  45. //旋转后保证还是之前的图片
  46. override func targetContentOffset(forProposedContentOffset proposedContentOffset: CGPoint) -> CGPoint {
  47. if let collectionView = self.collectionView as? MTImagePickerCollectionView, let prevItemSize = collectionView.prevItemSize {
  48. let rows = collectionView.prevOffset / prevItemSize.width
  49. collectionView.prevItemSize = nil
  50. return CGPoint(x: self.itemSize.width * rows, y: 0)
  51. }
  52. return super.targetContentOffset(forProposedContentOffset: proposedContentOffset)
  53. }
  54. }