Home

Awesome

TRMosaicLayout

CI Status codebeat badge Version License Platform

A mosaic collection view layout inspired by Lightbox's Algorithm. This is a swift implementation/extension of @fmitech's FMMosaicLayout. The standard UICollectionViewFlowLayout can be a boring presentation in your app, but TRMosaicLayout is a simple feature that will engage your users with your eyecatching content. If you don't believe me, checkout Snapchat's app and their awesome layout in their Discover feed.

TRMosaicLayout implementation

<img src="Demo/demo.gif"/>

Similar implementation used by @snapchat

<img src="Demo/snapchat.gif"/>

Why use this

Installation

CocoaPods

You can use CocoaPods to install TRMosaicLayout by adding it to your Podfile:

platform :ios, '8.0'
use_frameworks!
pod 'TRMosaicLayout'

Then, import TRMosaicLayout

import TRMosaicLayout

Manually

  1. Download and drop /TRMosaicLayoutfolder in your project.
  2. Congratulations!

Implementation

Create a subclass of UICollectionViewController

import TRMosaicLayout

class TRCollectionViewController: UICollectionViewController {
  override func viewDidLoad() {
    super.viewDidLoad()

      let mosaicLayout = TRMosaicLayout()
      self.collectionView?.collectionViewLayout = mosaicLayout
      mosaicLayout.delegate = self
  }
}

Extend your subclass of UICollectionViewController with TRMosaicLayoutDelegate

extension TRCollectionViewController: TRMosaicLayoutDelegate {

  func collectionView(collectionView:UICollectionView, mosaicCellSizeTypeAtIndexPath indexPath:NSIndexPath) -> TRMosaicCellType {
    // I recommend setting every third cell as .Big to get the best layout
    return indexPath.item % 3 == 0 ? TRMosaicCellType.Big : TRMosaicCellType.Small
  }

  func collectionView(collectionView:UICollectionView, layout collectionViewLayout: TRMosaicLayout, insetAtSection:Int) -> UIEdgeInsets {
    return UIEdgeInsets(top: 3, left: 3, bottom: 3, right: 3)
  }

  func heightForSmallMosaicCell() -> CGFloat {
    return 150
  }
}

Troubleshooting

The cell's aren't aligned properly

  let cell = collectionView.dequeueReusableCellWithReuseIdentifier(reuseIdentifier, forIndexPath: indexPath)
  let imageView = UIImageView(image: image)
  imageView.frame = cell.frame
  cell.backgroundView = imageView
  return cell

Getting a nil while unwrapping error

Something else isn't working properly

Release History

Contributions

I am happy to accept any open contributions. Just fork this project, make the changes and submit a pull request.

Author

Vincent Le, vinnyoodles@gmail.com

License

TRMosaicLayout is available under the MIT license. See the LICENSE file for more info.