I am trying to make a photo gallery using UICollectionViewwith Swift. I want to display photos in full screen and scroll right to go to the next image. I have a working code for the portrait frame, but as soon as I go into the landscape, it seems that my cell is not reconfiguring to the correct position and size.
This means that it always keeps the same width, height, x positionand y positionon the portrait screen. I also get this error in both portrait and landscape frames:
-> The behavior of the UICollectionViewFlowLayout is not defined because:
-> the height of the element must be less than the height of the UICollectionView minus the upper and lower values of the sections.
I looked around the internet for the answer and tried all possible solutions, but it doesn't seem to work for me. Let me know if anyone can help with this. Very much appreciated.
Here is my code:
import UIKit
class ImageDetailViewController: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout,UINavigationControllerDelegate {
@IBOutlet weak var imgDetailCollectionView: UICollectionView!
var index: Int!
var imageItems: Array<Items> = []
var currentIndex: CGFloat!
var size = UIScreen.mainScreen().bounds.size
init(index: Int , imageItems: Array<Items>) {
self.index = index
self.imageItems = imageItems
super.init(nibName: "ImageDetailViewController", bundle: NSBundle.mainBundle())
}
required init(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override func viewDidLoad() {
super.viewDidLoad()
imgDetailCollectionView.registerNib(UINib(nibName: "ImageDetailCollectionViewCell", bundle: nil), forCellWithReuseIdentifier: "ImageDetailCollectionViewCell")
imgDetailCollectionView.setZoomScale(0.5, animated: true)
}
override func viewDidLayoutSubviews() {
imgDetailCollectionView.scrollRectToVisible(CGRectMake(320 * CGFloat(index), 0, 320 , 240), animated: false)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int{
return self.imageItems.count
}
func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell{
var cell = imgDetailCollectionView.dequeueReusableCellWithReuseIdentifier("ImageDetailCollectionViewCell", forIndexPath: indexPath) as ImageDetailCollectionViewCell
cell.setup(imageItems[indexPath.row].url!)
if(UIDeviceOrientationIsPortrait(UIDevice.currentDevice().orientation)){
self.imgDetailCollectionView.collectionViewLayout.invalidateLayout()
var frame = cell.frame
frame.size = CGSizeMake(size.width, size.height)
cell.frame = frame
}else{
self.imgDetailCollectionView.collectionViewLayout.invalidateLayout()
var frame = cell.frame
frame.size = CGSizeMake(size.height, size.width)
cell.frame = frame
}
return cell
}
func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize {
var size = UIScreen.mainScreen().bounds.size
if(UIDeviceOrientationIsPortrait(UIDevice.currentDevice().orientation)){
return CGSizeMake(size.width, size.height)
}else{
return CGSizeMake(size.height, size.width)
}
}
func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAtIndex section: Int) -> CGFloat {
return 0
}
func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAtIndex section: Int) -> CGFloat {
return 0
}
override func willRotateToInterfaceOrientation(toInterfaceOrientation: UIInterfaceOrientation, duration: NSTimeInterval) {
self.imgDetailCollectionView.collectionViewLayout.invalidateLayout()
var currentOffset = self.imgDetailCollectionView.contentOffset
self.currentIndex = currentOffset.x / imgDetailCollectionView.frame.size.width
}
override func didRotateFromInterfaceOrientation(fromInterfaceOrientation: UIInterfaceOrientation) {
var currentSize = imgDetailCollectionView.bounds.size
var offset = self.currentIndex * currentSize.width
imgDetailCollectionView.setContentOffset(CGPointMake(offset, 0), animated: false)
imgDetailCollectionView.reloadData()
}
override func willAnimateRotationToInterfaceOrientation(toInterfaceOrientation: UIInterfaceOrientation, duration: NSTimeInterval) {
self.imgDetailCollectionView.collectionViewLayout.invalidateLayout()
}
}