How to add a custom view after every 2 rows in a collectionView swift












-1















I am implementing general collectionView in a viewController to populate data and the collection view has 2 columns and the number of rows depend on the data, and now my collectionView looks like this.



Normal collectionView:



enter image description here



This is what I have implemented in my app as you can see it is a normal collection view with n rows and 2 columns. But, our requirement is



Business requirement Image:





There is the custom view which is added after every 2 rows and it is static with a two labels and a button...



I don't know if it is possible and how to achieve this... And after searching for some time I learned that we can do this by using DecoratorViews and I don't know what are those and how to use them.. If anyone have any idea on how to achieve this kind of layout, please guide me..



variables:



let columnsPerRow = 2
let addAfterRows = 5
var cellToShowWithAdds = 0


Function:



func getCategoryProducts() {

var id = Int()
var categoryProductsAPI = ""
if self.brandId != nil {
id = self.brandId!
if self.selectedSubCategoryId != nil {
categoryProductsAPI = "(API.CATEGORY_BRAND_FILTER)(self.selectedSubCategoryId!)(API.BRAND_ID )(id)"
} else {
categoryProductsAPI = "(API.CATEGORY_BRAND_FILTER)(self.categoryId!)(API.BRAND_ID )(id)"
}
} else {
if self.selectedSubCategoryId != nil {
id = self.selectedSubCategoryId!
} else {
id = self.categoryId!
}
categoryProductsAPI = "(API.CATEGORY_PRODUCTS)(id)"
}
print(categoryProductsAPI)
self.cellToShowWithAdds = 0
self.categoryProductsData =
self.loadingView.isHidden = false
self.loadingActivityIndicator.animate()
ServiceManager.callGetAPI(url: categoryProductsAPI, view: self, closure: { response in
self.loadingView.isHidden = true
self.loadingActivityIndicator.stopAnimating()
guard let categoryData = response?.result.value else {return}
if let categories = categoryData as? [[String : Any]] {
for product in categories {
let productName = product["product_name"] as! String
let productId = product["product_id"] as! String
let productBrand = product["product_brand"] as! String
guard let productOffPercent = product["product_sale_of"] else { return }
let productImage = product["product_image"] as! String
let productPrice = product["product_price"] as! String
let productSepcialPrice = product["product_special_price"] as! String
var newProductPrice = String()
if productSepcialPrice == "Rs.0.00" {
newProductPrice = productPrice
} else {
newProductPrice = productSepcialPrice
}

self.categoryProductsData.append(ProductDetails(productID: productId, productName: productName, productPrice: productPrice, productSpecialPrice: newProductPrice, productOff: productOffPercent, productBrand: productBrand, productImageURL: productImage))
}
let quot = (self.categoryProductsData.count/(self.columnsPerRow * self.addAfterRows))
self.cellToShowWithAdds = self.categoryProductsData.count + quot + 1
DispatchQueue.main.async {
self.categoryProductsCollection.reloadData()
}
}
}, errorAction: {
self.loadingView.isHidden = true
self.loadingActivityIndicator.stopAnimating()
}, okAction: {
self.view.setNeedsLayout()
self.viewWillAppear(true)
})
}


DataSource methods:



func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {

return cellToShowWithAdds
}

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

if indexPath.row % 5 != 0 {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "productCell", for: indexPath) as! ProductDisplayCell
let productId = Int(categoryProductsData[indexPath.item].productID)
cell.tag = productId!
if categoryProductsData[indexPath.item].productImageURL != "" {
if let productImage = URL(string: categoryProductsData[indexPath.item].productImageURL) {
cell.productImage.getImageWith(imageUrl: productImage)
}
} else {
cell.productImage.image = nil
}
cell.productNameLabel.text = categoryProductsData[indexPath.item].productName
cell.sellerNameLabel.text = categoryProductsData[indexPath.item].productBrand
cell.offerPercentLabel.text = "(categoryProductsData[indexPath.item].productOff)% Off"

if "(categoryProductsData[indexPath.item].productOff)" == "" || "(categoryProductsData[indexPath.item].productOff)" == "100" || "(categoryProductsData[indexPath.item].productOff)" == "0" {
cell.offerPercentLabel.isHidden = true
} else {
cell.offerPercentLabel.isHidden = false
}

if categoryProductsData[indexPath.item].productSpecialPrice != "Rs.0.00" {
if categoryProductsData[indexPath.item].productPrice == categoryProductsData[indexPath.item].productSpecialPrice {
cell.originalPriceLable.isHidden = true
cell.offerPriceLabel.isHidden = false
} else {
cell.originalPriceLable.isHidden = false
cell.offerPriceLabel.isHidden = false
}
} else if categoryProductsData[indexPath.item].productSpecialPrice == "Rs.0.00" {
cell.originalPriceLable.isHidden = true
cell.offerPriceLabel.isHidden = true
} else {
cell.originalPriceLable.isHidden = false
cell.offerPriceLabel.isHidden = false
}
cell.originalPriceLable.attributedText = categoryProductsData[indexPath.item].productPrice.strikeThrough()
cell.offerPriceLabel.text = categoryProductsData[indexPath.item].productSpecialPrice
return cell
} else {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "formCollectionCell", for: indexPath) as! PostRequirementCellCollectionViewCell
return cell
}
}









share|improve this question




















  • 2





    Great explanation and step-by-step tutorial provided by matt, and a visual example by Larry

    – LinusGeffarth
    Jan 2 at 8:20






  • 2





    Possible duplicate of UICollectionView Decoration View. Literally the first hit in Google when searching for DecoratorViews UICollectionView. Do your research!

    – LinusGeffarth
    Jan 2 at 8:20













  • You could add a header to your collectionview, or you could create a custom cell (the one that has a blue background) and in cellForItemAt check if it is the 2nd row and return this custom cell. Also, return its size in sizeForItemAt

    – Marwen Doukh
    Jan 2 at 8:25













  • This can be an another cell itself.

    – TheTiger
    Jan 4 at 5:17
















-1















I am implementing general collectionView in a viewController to populate data and the collection view has 2 columns and the number of rows depend on the data, and now my collectionView looks like this.



Normal collectionView:



enter image description here



This is what I have implemented in my app as you can see it is a normal collection view with n rows and 2 columns. But, our requirement is



Business requirement Image:





There is the custom view which is added after every 2 rows and it is static with a two labels and a button...



I don't know if it is possible and how to achieve this... And after searching for some time I learned that we can do this by using DecoratorViews and I don't know what are those and how to use them.. If anyone have any idea on how to achieve this kind of layout, please guide me..



variables:



let columnsPerRow = 2
let addAfterRows = 5
var cellToShowWithAdds = 0


Function:



func getCategoryProducts() {

var id = Int()
var categoryProductsAPI = ""
if self.brandId != nil {
id = self.brandId!
if self.selectedSubCategoryId != nil {
categoryProductsAPI = "(API.CATEGORY_BRAND_FILTER)(self.selectedSubCategoryId!)(API.BRAND_ID )(id)"
} else {
categoryProductsAPI = "(API.CATEGORY_BRAND_FILTER)(self.categoryId!)(API.BRAND_ID )(id)"
}
} else {
if self.selectedSubCategoryId != nil {
id = self.selectedSubCategoryId!
} else {
id = self.categoryId!
}
categoryProductsAPI = "(API.CATEGORY_PRODUCTS)(id)"
}
print(categoryProductsAPI)
self.cellToShowWithAdds = 0
self.categoryProductsData =
self.loadingView.isHidden = false
self.loadingActivityIndicator.animate()
ServiceManager.callGetAPI(url: categoryProductsAPI, view: self, closure: { response in
self.loadingView.isHidden = true
self.loadingActivityIndicator.stopAnimating()
guard let categoryData = response?.result.value else {return}
if let categories = categoryData as? [[String : Any]] {
for product in categories {
let productName = product["product_name"] as! String
let productId = product["product_id"] as! String
let productBrand = product["product_brand"] as! String
guard let productOffPercent = product["product_sale_of"] else { return }
let productImage = product["product_image"] as! String
let productPrice = product["product_price"] as! String
let productSepcialPrice = product["product_special_price"] as! String
var newProductPrice = String()
if productSepcialPrice == "Rs.0.00" {
newProductPrice = productPrice
} else {
newProductPrice = productSepcialPrice
}

self.categoryProductsData.append(ProductDetails(productID: productId, productName: productName, productPrice: productPrice, productSpecialPrice: newProductPrice, productOff: productOffPercent, productBrand: productBrand, productImageURL: productImage))
}
let quot = (self.categoryProductsData.count/(self.columnsPerRow * self.addAfterRows))
self.cellToShowWithAdds = self.categoryProductsData.count + quot + 1
DispatchQueue.main.async {
self.categoryProductsCollection.reloadData()
}
}
}, errorAction: {
self.loadingView.isHidden = true
self.loadingActivityIndicator.stopAnimating()
}, okAction: {
self.view.setNeedsLayout()
self.viewWillAppear(true)
})
}


DataSource methods:



func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {

return cellToShowWithAdds
}

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

if indexPath.row % 5 != 0 {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "productCell", for: indexPath) as! ProductDisplayCell
let productId = Int(categoryProductsData[indexPath.item].productID)
cell.tag = productId!
if categoryProductsData[indexPath.item].productImageURL != "" {
if let productImage = URL(string: categoryProductsData[indexPath.item].productImageURL) {
cell.productImage.getImageWith(imageUrl: productImage)
}
} else {
cell.productImage.image = nil
}
cell.productNameLabel.text = categoryProductsData[indexPath.item].productName
cell.sellerNameLabel.text = categoryProductsData[indexPath.item].productBrand
cell.offerPercentLabel.text = "(categoryProductsData[indexPath.item].productOff)% Off"

if "(categoryProductsData[indexPath.item].productOff)" == "" || "(categoryProductsData[indexPath.item].productOff)" == "100" || "(categoryProductsData[indexPath.item].productOff)" == "0" {
cell.offerPercentLabel.isHidden = true
} else {
cell.offerPercentLabel.isHidden = false
}

if categoryProductsData[indexPath.item].productSpecialPrice != "Rs.0.00" {
if categoryProductsData[indexPath.item].productPrice == categoryProductsData[indexPath.item].productSpecialPrice {
cell.originalPriceLable.isHidden = true
cell.offerPriceLabel.isHidden = false
} else {
cell.originalPriceLable.isHidden = false
cell.offerPriceLabel.isHidden = false
}
} else if categoryProductsData[indexPath.item].productSpecialPrice == "Rs.0.00" {
cell.originalPriceLable.isHidden = true
cell.offerPriceLabel.isHidden = true
} else {
cell.originalPriceLable.isHidden = false
cell.offerPriceLabel.isHidden = false
}
cell.originalPriceLable.attributedText = categoryProductsData[indexPath.item].productPrice.strikeThrough()
cell.offerPriceLabel.text = categoryProductsData[indexPath.item].productSpecialPrice
return cell
} else {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "formCollectionCell", for: indexPath) as! PostRequirementCellCollectionViewCell
return cell
}
}









share|improve this question




















  • 2





    Great explanation and step-by-step tutorial provided by matt, and a visual example by Larry

    – LinusGeffarth
    Jan 2 at 8:20






  • 2





    Possible duplicate of UICollectionView Decoration View. Literally the first hit in Google when searching for DecoratorViews UICollectionView. Do your research!

    – LinusGeffarth
    Jan 2 at 8:20













  • You could add a header to your collectionview, or you could create a custom cell (the one that has a blue background) and in cellForItemAt check if it is the 2nd row and return this custom cell. Also, return its size in sizeForItemAt

    – Marwen Doukh
    Jan 2 at 8:25













  • This can be an another cell itself.

    – TheTiger
    Jan 4 at 5:17














-1












-1








-1


0






I am implementing general collectionView in a viewController to populate data and the collection view has 2 columns and the number of rows depend on the data, and now my collectionView looks like this.



Normal collectionView:



enter image description here



This is what I have implemented in my app as you can see it is a normal collection view with n rows and 2 columns. But, our requirement is



Business requirement Image:





There is the custom view which is added after every 2 rows and it is static with a two labels and a button...



I don't know if it is possible and how to achieve this... And after searching for some time I learned that we can do this by using DecoratorViews and I don't know what are those and how to use them.. If anyone have any idea on how to achieve this kind of layout, please guide me..



variables:



let columnsPerRow = 2
let addAfterRows = 5
var cellToShowWithAdds = 0


Function:



func getCategoryProducts() {

var id = Int()
var categoryProductsAPI = ""
if self.brandId != nil {
id = self.brandId!
if self.selectedSubCategoryId != nil {
categoryProductsAPI = "(API.CATEGORY_BRAND_FILTER)(self.selectedSubCategoryId!)(API.BRAND_ID )(id)"
} else {
categoryProductsAPI = "(API.CATEGORY_BRAND_FILTER)(self.categoryId!)(API.BRAND_ID )(id)"
}
} else {
if self.selectedSubCategoryId != nil {
id = self.selectedSubCategoryId!
} else {
id = self.categoryId!
}
categoryProductsAPI = "(API.CATEGORY_PRODUCTS)(id)"
}
print(categoryProductsAPI)
self.cellToShowWithAdds = 0
self.categoryProductsData =
self.loadingView.isHidden = false
self.loadingActivityIndicator.animate()
ServiceManager.callGetAPI(url: categoryProductsAPI, view: self, closure: { response in
self.loadingView.isHidden = true
self.loadingActivityIndicator.stopAnimating()
guard let categoryData = response?.result.value else {return}
if let categories = categoryData as? [[String : Any]] {
for product in categories {
let productName = product["product_name"] as! String
let productId = product["product_id"] as! String
let productBrand = product["product_brand"] as! String
guard let productOffPercent = product["product_sale_of"] else { return }
let productImage = product["product_image"] as! String
let productPrice = product["product_price"] as! String
let productSepcialPrice = product["product_special_price"] as! String
var newProductPrice = String()
if productSepcialPrice == "Rs.0.00" {
newProductPrice = productPrice
} else {
newProductPrice = productSepcialPrice
}

self.categoryProductsData.append(ProductDetails(productID: productId, productName: productName, productPrice: productPrice, productSpecialPrice: newProductPrice, productOff: productOffPercent, productBrand: productBrand, productImageURL: productImage))
}
let quot = (self.categoryProductsData.count/(self.columnsPerRow * self.addAfterRows))
self.cellToShowWithAdds = self.categoryProductsData.count + quot + 1
DispatchQueue.main.async {
self.categoryProductsCollection.reloadData()
}
}
}, errorAction: {
self.loadingView.isHidden = true
self.loadingActivityIndicator.stopAnimating()
}, okAction: {
self.view.setNeedsLayout()
self.viewWillAppear(true)
})
}


DataSource methods:



func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {

return cellToShowWithAdds
}

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

if indexPath.row % 5 != 0 {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "productCell", for: indexPath) as! ProductDisplayCell
let productId = Int(categoryProductsData[indexPath.item].productID)
cell.tag = productId!
if categoryProductsData[indexPath.item].productImageURL != "" {
if let productImage = URL(string: categoryProductsData[indexPath.item].productImageURL) {
cell.productImage.getImageWith(imageUrl: productImage)
}
} else {
cell.productImage.image = nil
}
cell.productNameLabel.text = categoryProductsData[indexPath.item].productName
cell.sellerNameLabel.text = categoryProductsData[indexPath.item].productBrand
cell.offerPercentLabel.text = "(categoryProductsData[indexPath.item].productOff)% Off"

if "(categoryProductsData[indexPath.item].productOff)" == "" || "(categoryProductsData[indexPath.item].productOff)" == "100" || "(categoryProductsData[indexPath.item].productOff)" == "0" {
cell.offerPercentLabel.isHidden = true
} else {
cell.offerPercentLabel.isHidden = false
}

if categoryProductsData[indexPath.item].productSpecialPrice != "Rs.0.00" {
if categoryProductsData[indexPath.item].productPrice == categoryProductsData[indexPath.item].productSpecialPrice {
cell.originalPriceLable.isHidden = true
cell.offerPriceLabel.isHidden = false
} else {
cell.originalPriceLable.isHidden = false
cell.offerPriceLabel.isHidden = false
}
} else if categoryProductsData[indexPath.item].productSpecialPrice == "Rs.0.00" {
cell.originalPriceLable.isHidden = true
cell.offerPriceLabel.isHidden = true
} else {
cell.originalPriceLable.isHidden = false
cell.offerPriceLabel.isHidden = false
}
cell.originalPriceLable.attributedText = categoryProductsData[indexPath.item].productPrice.strikeThrough()
cell.offerPriceLabel.text = categoryProductsData[indexPath.item].productSpecialPrice
return cell
} else {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "formCollectionCell", for: indexPath) as! PostRequirementCellCollectionViewCell
return cell
}
}









share|improve this question
















I am implementing general collectionView in a viewController to populate data and the collection view has 2 columns and the number of rows depend on the data, and now my collectionView looks like this.



Normal collectionView:



enter image description here



This is what I have implemented in my app as you can see it is a normal collection view with n rows and 2 columns. But, our requirement is



Business requirement Image:





There is the custom view which is added after every 2 rows and it is static with a two labels and a button...



I don't know if it is possible and how to achieve this... And after searching for some time I learned that we can do this by using DecoratorViews and I don't know what are those and how to use them.. If anyone have any idea on how to achieve this kind of layout, please guide me..



variables:



let columnsPerRow = 2
let addAfterRows = 5
var cellToShowWithAdds = 0


Function:



func getCategoryProducts() {

var id = Int()
var categoryProductsAPI = ""
if self.brandId != nil {
id = self.brandId!
if self.selectedSubCategoryId != nil {
categoryProductsAPI = "(API.CATEGORY_BRAND_FILTER)(self.selectedSubCategoryId!)(API.BRAND_ID )(id)"
} else {
categoryProductsAPI = "(API.CATEGORY_BRAND_FILTER)(self.categoryId!)(API.BRAND_ID )(id)"
}
} else {
if self.selectedSubCategoryId != nil {
id = self.selectedSubCategoryId!
} else {
id = self.categoryId!
}
categoryProductsAPI = "(API.CATEGORY_PRODUCTS)(id)"
}
print(categoryProductsAPI)
self.cellToShowWithAdds = 0
self.categoryProductsData =
self.loadingView.isHidden = false
self.loadingActivityIndicator.animate()
ServiceManager.callGetAPI(url: categoryProductsAPI, view: self, closure: { response in
self.loadingView.isHidden = true
self.loadingActivityIndicator.stopAnimating()
guard let categoryData = response?.result.value else {return}
if let categories = categoryData as? [[String : Any]] {
for product in categories {
let productName = product["product_name"] as! String
let productId = product["product_id"] as! String
let productBrand = product["product_brand"] as! String
guard let productOffPercent = product["product_sale_of"] else { return }
let productImage = product["product_image"] as! String
let productPrice = product["product_price"] as! String
let productSepcialPrice = product["product_special_price"] as! String
var newProductPrice = String()
if productSepcialPrice == "Rs.0.00" {
newProductPrice = productPrice
} else {
newProductPrice = productSepcialPrice
}

self.categoryProductsData.append(ProductDetails(productID: productId, productName: productName, productPrice: productPrice, productSpecialPrice: newProductPrice, productOff: productOffPercent, productBrand: productBrand, productImageURL: productImage))
}
let quot = (self.categoryProductsData.count/(self.columnsPerRow * self.addAfterRows))
self.cellToShowWithAdds = self.categoryProductsData.count + quot + 1
DispatchQueue.main.async {
self.categoryProductsCollection.reloadData()
}
}
}, errorAction: {
self.loadingView.isHidden = true
self.loadingActivityIndicator.stopAnimating()
}, okAction: {
self.view.setNeedsLayout()
self.viewWillAppear(true)
})
}


DataSource methods:



func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {

return cellToShowWithAdds
}

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

if indexPath.row % 5 != 0 {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "productCell", for: indexPath) as! ProductDisplayCell
let productId = Int(categoryProductsData[indexPath.item].productID)
cell.tag = productId!
if categoryProductsData[indexPath.item].productImageURL != "" {
if let productImage = URL(string: categoryProductsData[indexPath.item].productImageURL) {
cell.productImage.getImageWith(imageUrl: productImage)
}
} else {
cell.productImage.image = nil
}
cell.productNameLabel.text = categoryProductsData[indexPath.item].productName
cell.sellerNameLabel.text = categoryProductsData[indexPath.item].productBrand
cell.offerPercentLabel.text = "(categoryProductsData[indexPath.item].productOff)% Off"

if "(categoryProductsData[indexPath.item].productOff)" == "" || "(categoryProductsData[indexPath.item].productOff)" == "100" || "(categoryProductsData[indexPath.item].productOff)" == "0" {
cell.offerPercentLabel.isHidden = true
} else {
cell.offerPercentLabel.isHidden = false
}

if categoryProductsData[indexPath.item].productSpecialPrice != "Rs.0.00" {
if categoryProductsData[indexPath.item].productPrice == categoryProductsData[indexPath.item].productSpecialPrice {
cell.originalPriceLable.isHidden = true
cell.offerPriceLabel.isHidden = false
} else {
cell.originalPriceLable.isHidden = false
cell.offerPriceLabel.isHidden = false
}
} else if categoryProductsData[indexPath.item].productSpecialPrice == "Rs.0.00" {
cell.originalPriceLable.isHidden = true
cell.offerPriceLabel.isHidden = true
} else {
cell.originalPriceLable.isHidden = false
cell.offerPriceLabel.isHidden = false
}
cell.originalPriceLable.attributedText = categoryProductsData[indexPath.item].productPrice.strikeThrough()
cell.offerPriceLabel.text = categoryProductsData[indexPath.item].productSpecialPrice
return cell
} else {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "formCollectionCell", for: indexPath) as! PostRequirementCellCollectionViewCell
return cell
}
}






ios swift uicollectionview






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited Jan 4 at 5:20







Venkatesh Chejarla

















asked Jan 2 at 8:10









Venkatesh ChejarlaVenkatesh Chejarla

10311




10311








  • 2





    Great explanation and step-by-step tutorial provided by matt, and a visual example by Larry

    – LinusGeffarth
    Jan 2 at 8:20






  • 2





    Possible duplicate of UICollectionView Decoration View. Literally the first hit in Google when searching for DecoratorViews UICollectionView. Do your research!

    – LinusGeffarth
    Jan 2 at 8:20













  • You could add a header to your collectionview, or you could create a custom cell (the one that has a blue background) and in cellForItemAt check if it is the 2nd row and return this custom cell. Also, return its size in sizeForItemAt

    – Marwen Doukh
    Jan 2 at 8:25













  • This can be an another cell itself.

    – TheTiger
    Jan 4 at 5:17














  • 2





    Great explanation and step-by-step tutorial provided by matt, and a visual example by Larry

    – LinusGeffarth
    Jan 2 at 8:20






  • 2





    Possible duplicate of UICollectionView Decoration View. Literally the first hit in Google when searching for DecoratorViews UICollectionView. Do your research!

    – LinusGeffarth
    Jan 2 at 8:20













  • You could add a header to your collectionview, or you could create a custom cell (the one that has a blue background) and in cellForItemAt check if it is the 2nd row and return this custom cell. Also, return its size in sizeForItemAt

    – Marwen Doukh
    Jan 2 at 8:25













  • This can be an another cell itself.

    – TheTiger
    Jan 4 at 5:17








2




2





Great explanation and step-by-step tutorial provided by matt, and a visual example by Larry

– LinusGeffarth
Jan 2 at 8:20





Great explanation and step-by-step tutorial provided by matt, and a visual example by Larry

– LinusGeffarth
Jan 2 at 8:20




2




2





Possible duplicate of UICollectionView Decoration View. Literally the first hit in Google when searching for DecoratorViews UICollectionView. Do your research!

– LinusGeffarth
Jan 2 at 8:20







Possible duplicate of UICollectionView Decoration View. Literally the first hit in Google when searching for DecoratorViews UICollectionView. Do your research!

– LinusGeffarth
Jan 2 at 8:20















You could add a header to your collectionview, or you could create a custom cell (the one that has a blue background) and in cellForItemAt check if it is the 2nd row and return this custom cell. Also, return its size in sizeForItemAt

– Marwen Doukh
Jan 2 at 8:25







You could add a header to your collectionview, or you could create a custom cell (the one that has a blue background) and in cellForItemAt check if it is the 2nd row and return this custom cell. Also, return its size in sizeForItemAt

– Marwen Doukh
Jan 2 at 8:25















This can be an another cell itself.

– TheTiger
Jan 4 at 5:17





This can be an another cell itself.

– TheTiger
Jan 4 at 5:17












1 Answer
1






active

oldest

votes


















1














My Code should be explanatory. I have set some values in viewdidload to get the kind of view you require.



Please see screenshot



import UIKit

class CollectionViewController: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout {

@IBOutlet weak var collectionView : UICollectionView!

let totalProducts = 21
let columnsPerRow = 2
let addAfterRows = 2

var celltoShowWithAds = 0

override func viewDidLoad() {
super.viewDidLoad()

// Do any additional setup after loading the view.
let quot = (totalProducts/(columnsPerRow * addAfterRows))
print(quot)
celltoShowWithAds = totalProducts + quot + 1

collectionView.register(UINib(nibName: "CollectionItemCell", bundle: nil), forCellWithReuseIdentifier: "CollectionItemCell")

collectionView.register(UINib(nibName: "CollectionAdvertisementCell", bundle: nil), forCellWithReuseIdentifier: "CollectionAdvertisementCell")

collectionView.delegate = self
collectionView.dataSource = self
collectionView.reloadData()
//collectionView.backgroundColor = UIColor.blue
}

func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return celltoShowWithAds

}

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
if indexPath.row == 0{
let myCell:CollectionAdvertisementCell = collectionView.dequeueReusableCell(withReuseIdentifier: "CollectionAdvertisementCell", for: indexPath) as! CollectionAdvertisementCell
return myCell as CollectionAdvertisementCell;

}else if indexPath.row % 5 == 0{
let myCell:CollectionAdvertisementCell = collectionView.dequeueReusableCell(withReuseIdentifier: "CollectionAdvertisementCell", for: indexPath) as! CollectionAdvertisementCell

return myCell as CollectionAdvertisementCell;
}else{
let myCell:CollectionItemCell = collectionView.dequeueReusableCell(withReuseIdentifier: "CollectionItemCell", for: indexPath) as! CollectionItemCell

return myCell as CollectionItemCell;
}



}

func numberOfSections(in collectionView: UICollectionView) -> Int {
return 1
}


func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
if indexPath.row == 0{
return CGSize(width: view.frame.width, height: 0.0)
}else if indexPath.row % 5 == 0 {
return CGSize(width: view.frame.width, height: 80.0)
}else{
return CGSize(width: view.frame.width/CGFloat(columnsPerRow), height: 200.0)
}

}




//Use for interspacing
func collectionView(_ collectionView: UICollectionView,
layout collectionViewLayout: UICollectionViewLayout,
minimumInteritemSpacingForSectionAt section: Int) -> CGFloat {
return 0
}

func collectionView(_ collectionView: UICollectionView, layout
collectionViewLayout: UICollectionViewLayout,
minimumLineSpacingForSectionAt section: Int) -> CGFloat {
return 0
}


/*
// MARK: - Navigation

// In a storyboard-based application, you will often want to do a little preparation before navigation
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
// Get the new view controller using segue.destination.
// Pass the selected object to the new view controller.
}
*/

}





share|improve this answer
























  • This looks like a good solution, I'll try this. Thanks...

    – Venkatesh Chejarla
    Jan 2 at 12:56











  • Hi Venkatesh- Did the code work for you

    – Yogesh Tandel
    Jan 3 at 7:50











  • Hi, yeah the adds are showing up but, I am getting some errors when navigation happens and I'm trying to fix them. I'll ask you if I can't. btw thanks for the solution mate it helped me.. I'm curious that, have you used this before or did you just do it for me??

    – Venkatesh Chejarla
    Jan 3 at 9:19













  • didi it just for you bro? Please mark correct on the answer and let me know if you need any assisstance

    – Yogesh Tandel
    Jan 3 at 9:21











  • Sure thing bro I'll do it.

    – Venkatesh Chejarla
    Jan 3 at 10:04











Your Answer






StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");

StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);

StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});

function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});


}
});














draft saved

draft discarded


















StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f54003106%2fhow-to-add-a-custom-view-after-every-2-rows-in-a-collectionview-swift%23new-answer', 'question_page');
}
);

Post as a guest















Required, but never shown

























1 Answer
1






active

oldest

votes








1 Answer
1






active

oldest

votes









active

oldest

votes






active

oldest

votes









1














My Code should be explanatory. I have set some values in viewdidload to get the kind of view you require.



Please see screenshot



import UIKit

class CollectionViewController: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout {

@IBOutlet weak var collectionView : UICollectionView!

let totalProducts = 21
let columnsPerRow = 2
let addAfterRows = 2

var celltoShowWithAds = 0

override func viewDidLoad() {
super.viewDidLoad()

// Do any additional setup after loading the view.
let quot = (totalProducts/(columnsPerRow * addAfterRows))
print(quot)
celltoShowWithAds = totalProducts + quot + 1

collectionView.register(UINib(nibName: "CollectionItemCell", bundle: nil), forCellWithReuseIdentifier: "CollectionItemCell")

collectionView.register(UINib(nibName: "CollectionAdvertisementCell", bundle: nil), forCellWithReuseIdentifier: "CollectionAdvertisementCell")

collectionView.delegate = self
collectionView.dataSource = self
collectionView.reloadData()
//collectionView.backgroundColor = UIColor.blue
}

func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return celltoShowWithAds

}

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
if indexPath.row == 0{
let myCell:CollectionAdvertisementCell = collectionView.dequeueReusableCell(withReuseIdentifier: "CollectionAdvertisementCell", for: indexPath) as! CollectionAdvertisementCell
return myCell as CollectionAdvertisementCell;

}else if indexPath.row % 5 == 0{
let myCell:CollectionAdvertisementCell = collectionView.dequeueReusableCell(withReuseIdentifier: "CollectionAdvertisementCell", for: indexPath) as! CollectionAdvertisementCell

return myCell as CollectionAdvertisementCell;
}else{
let myCell:CollectionItemCell = collectionView.dequeueReusableCell(withReuseIdentifier: "CollectionItemCell", for: indexPath) as! CollectionItemCell

return myCell as CollectionItemCell;
}



}

func numberOfSections(in collectionView: UICollectionView) -> Int {
return 1
}


func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
if indexPath.row == 0{
return CGSize(width: view.frame.width, height: 0.0)
}else if indexPath.row % 5 == 0 {
return CGSize(width: view.frame.width, height: 80.0)
}else{
return CGSize(width: view.frame.width/CGFloat(columnsPerRow), height: 200.0)
}

}




//Use for interspacing
func collectionView(_ collectionView: UICollectionView,
layout collectionViewLayout: UICollectionViewLayout,
minimumInteritemSpacingForSectionAt section: Int) -> CGFloat {
return 0
}

func collectionView(_ collectionView: UICollectionView, layout
collectionViewLayout: UICollectionViewLayout,
minimumLineSpacingForSectionAt section: Int) -> CGFloat {
return 0
}


/*
// MARK: - Navigation

// In a storyboard-based application, you will often want to do a little preparation before navigation
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
// Get the new view controller using segue.destination.
// Pass the selected object to the new view controller.
}
*/

}





share|improve this answer
























  • This looks like a good solution, I'll try this. Thanks...

    – Venkatesh Chejarla
    Jan 2 at 12:56











  • Hi Venkatesh- Did the code work for you

    – Yogesh Tandel
    Jan 3 at 7:50











  • Hi, yeah the adds are showing up but, I am getting some errors when navigation happens and I'm trying to fix them. I'll ask you if I can't. btw thanks for the solution mate it helped me.. I'm curious that, have you used this before or did you just do it for me??

    – Venkatesh Chejarla
    Jan 3 at 9:19













  • didi it just for you bro? Please mark correct on the answer and let me know if you need any assisstance

    – Yogesh Tandel
    Jan 3 at 9:21











  • Sure thing bro I'll do it.

    – Venkatesh Chejarla
    Jan 3 at 10:04
















1














My Code should be explanatory. I have set some values in viewdidload to get the kind of view you require.



Please see screenshot



import UIKit

class CollectionViewController: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout {

@IBOutlet weak var collectionView : UICollectionView!

let totalProducts = 21
let columnsPerRow = 2
let addAfterRows = 2

var celltoShowWithAds = 0

override func viewDidLoad() {
super.viewDidLoad()

// Do any additional setup after loading the view.
let quot = (totalProducts/(columnsPerRow * addAfterRows))
print(quot)
celltoShowWithAds = totalProducts + quot + 1

collectionView.register(UINib(nibName: "CollectionItemCell", bundle: nil), forCellWithReuseIdentifier: "CollectionItemCell")

collectionView.register(UINib(nibName: "CollectionAdvertisementCell", bundle: nil), forCellWithReuseIdentifier: "CollectionAdvertisementCell")

collectionView.delegate = self
collectionView.dataSource = self
collectionView.reloadData()
//collectionView.backgroundColor = UIColor.blue
}

func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return celltoShowWithAds

}

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
if indexPath.row == 0{
let myCell:CollectionAdvertisementCell = collectionView.dequeueReusableCell(withReuseIdentifier: "CollectionAdvertisementCell", for: indexPath) as! CollectionAdvertisementCell
return myCell as CollectionAdvertisementCell;

}else if indexPath.row % 5 == 0{
let myCell:CollectionAdvertisementCell = collectionView.dequeueReusableCell(withReuseIdentifier: "CollectionAdvertisementCell", for: indexPath) as! CollectionAdvertisementCell

return myCell as CollectionAdvertisementCell;
}else{
let myCell:CollectionItemCell = collectionView.dequeueReusableCell(withReuseIdentifier: "CollectionItemCell", for: indexPath) as! CollectionItemCell

return myCell as CollectionItemCell;
}



}

func numberOfSections(in collectionView: UICollectionView) -> Int {
return 1
}


func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
if indexPath.row == 0{
return CGSize(width: view.frame.width, height: 0.0)
}else if indexPath.row % 5 == 0 {
return CGSize(width: view.frame.width, height: 80.0)
}else{
return CGSize(width: view.frame.width/CGFloat(columnsPerRow), height: 200.0)
}

}




//Use for interspacing
func collectionView(_ collectionView: UICollectionView,
layout collectionViewLayout: UICollectionViewLayout,
minimumInteritemSpacingForSectionAt section: Int) -> CGFloat {
return 0
}

func collectionView(_ collectionView: UICollectionView, layout
collectionViewLayout: UICollectionViewLayout,
minimumLineSpacingForSectionAt section: Int) -> CGFloat {
return 0
}


/*
// MARK: - Navigation

// In a storyboard-based application, you will often want to do a little preparation before navigation
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
// Get the new view controller using segue.destination.
// Pass the selected object to the new view controller.
}
*/

}





share|improve this answer
























  • This looks like a good solution, I'll try this. Thanks...

    – Venkatesh Chejarla
    Jan 2 at 12:56











  • Hi Venkatesh- Did the code work for you

    – Yogesh Tandel
    Jan 3 at 7:50











  • Hi, yeah the adds are showing up but, I am getting some errors when navigation happens and I'm trying to fix them. I'll ask you if I can't. btw thanks for the solution mate it helped me.. I'm curious that, have you used this before or did you just do it for me??

    – Venkatesh Chejarla
    Jan 3 at 9:19













  • didi it just for you bro? Please mark correct on the answer and let me know if you need any assisstance

    – Yogesh Tandel
    Jan 3 at 9:21











  • Sure thing bro I'll do it.

    – Venkatesh Chejarla
    Jan 3 at 10:04














1












1








1







My Code should be explanatory. I have set some values in viewdidload to get the kind of view you require.



Please see screenshot



import UIKit

class CollectionViewController: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout {

@IBOutlet weak var collectionView : UICollectionView!

let totalProducts = 21
let columnsPerRow = 2
let addAfterRows = 2

var celltoShowWithAds = 0

override func viewDidLoad() {
super.viewDidLoad()

// Do any additional setup after loading the view.
let quot = (totalProducts/(columnsPerRow * addAfterRows))
print(quot)
celltoShowWithAds = totalProducts + quot + 1

collectionView.register(UINib(nibName: "CollectionItemCell", bundle: nil), forCellWithReuseIdentifier: "CollectionItemCell")

collectionView.register(UINib(nibName: "CollectionAdvertisementCell", bundle: nil), forCellWithReuseIdentifier: "CollectionAdvertisementCell")

collectionView.delegate = self
collectionView.dataSource = self
collectionView.reloadData()
//collectionView.backgroundColor = UIColor.blue
}

func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return celltoShowWithAds

}

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
if indexPath.row == 0{
let myCell:CollectionAdvertisementCell = collectionView.dequeueReusableCell(withReuseIdentifier: "CollectionAdvertisementCell", for: indexPath) as! CollectionAdvertisementCell
return myCell as CollectionAdvertisementCell;

}else if indexPath.row % 5 == 0{
let myCell:CollectionAdvertisementCell = collectionView.dequeueReusableCell(withReuseIdentifier: "CollectionAdvertisementCell", for: indexPath) as! CollectionAdvertisementCell

return myCell as CollectionAdvertisementCell;
}else{
let myCell:CollectionItemCell = collectionView.dequeueReusableCell(withReuseIdentifier: "CollectionItemCell", for: indexPath) as! CollectionItemCell

return myCell as CollectionItemCell;
}



}

func numberOfSections(in collectionView: UICollectionView) -> Int {
return 1
}


func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
if indexPath.row == 0{
return CGSize(width: view.frame.width, height: 0.0)
}else if indexPath.row % 5 == 0 {
return CGSize(width: view.frame.width, height: 80.0)
}else{
return CGSize(width: view.frame.width/CGFloat(columnsPerRow), height: 200.0)
}

}




//Use for interspacing
func collectionView(_ collectionView: UICollectionView,
layout collectionViewLayout: UICollectionViewLayout,
minimumInteritemSpacingForSectionAt section: Int) -> CGFloat {
return 0
}

func collectionView(_ collectionView: UICollectionView, layout
collectionViewLayout: UICollectionViewLayout,
minimumLineSpacingForSectionAt section: Int) -> CGFloat {
return 0
}


/*
// MARK: - Navigation

// In a storyboard-based application, you will often want to do a little preparation before navigation
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
// Get the new view controller using segue.destination.
// Pass the selected object to the new view controller.
}
*/

}





share|improve this answer













My Code should be explanatory. I have set some values in viewdidload to get the kind of view you require.



Please see screenshot



import UIKit

class CollectionViewController: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout {

@IBOutlet weak var collectionView : UICollectionView!

let totalProducts = 21
let columnsPerRow = 2
let addAfterRows = 2

var celltoShowWithAds = 0

override func viewDidLoad() {
super.viewDidLoad()

// Do any additional setup after loading the view.
let quot = (totalProducts/(columnsPerRow * addAfterRows))
print(quot)
celltoShowWithAds = totalProducts + quot + 1

collectionView.register(UINib(nibName: "CollectionItemCell", bundle: nil), forCellWithReuseIdentifier: "CollectionItemCell")

collectionView.register(UINib(nibName: "CollectionAdvertisementCell", bundle: nil), forCellWithReuseIdentifier: "CollectionAdvertisementCell")

collectionView.delegate = self
collectionView.dataSource = self
collectionView.reloadData()
//collectionView.backgroundColor = UIColor.blue
}

func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return celltoShowWithAds

}

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
if indexPath.row == 0{
let myCell:CollectionAdvertisementCell = collectionView.dequeueReusableCell(withReuseIdentifier: "CollectionAdvertisementCell", for: indexPath) as! CollectionAdvertisementCell
return myCell as CollectionAdvertisementCell;

}else if indexPath.row % 5 == 0{
let myCell:CollectionAdvertisementCell = collectionView.dequeueReusableCell(withReuseIdentifier: "CollectionAdvertisementCell", for: indexPath) as! CollectionAdvertisementCell

return myCell as CollectionAdvertisementCell;
}else{
let myCell:CollectionItemCell = collectionView.dequeueReusableCell(withReuseIdentifier: "CollectionItemCell", for: indexPath) as! CollectionItemCell

return myCell as CollectionItemCell;
}



}

func numberOfSections(in collectionView: UICollectionView) -> Int {
return 1
}


func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
if indexPath.row == 0{
return CGSize(width: view.frame.width, height: 0.0)
}else if indexPath.row % 5 == 0 {
return CGSize(width: view.frame.width, height: 80.0)
}else{
return CGSize(width: view.frame.width/CGFloat(columnsPerRow), height: 200.0)
}

}




//Use for interspacing
func collectionView(_ collectionView: UICollectionView,
layout collectionViewLayout: UICollectionViewLayout,
minimumInteritemSpacingForSectionAt section: Int) -> CGFloat {
return 0
}

func collectionView(_ collectionView: UICollectionView, layout
collectionViewLayout: UICollectionViewLayout,
minimumLineSpacingForSectionAt section: Int) -> CGFloat {
return 0
}


/*
// MARK: - Navigation

// In a storyboard-based application, you will often want to do a little preparation before navigation
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
// Get the new view controller using segue.destination.
// Pass the selected object to the new view controller.
}
*/

}






share|improve this answer












share|improve this answer



share|improve this answer










answered Jan 2 at 11:33









Yogesh TandelYogesh Tandel

7781912




7781912













  • This looks like a good solution, I'll try this. Thanks...

    – Venkatesh Chejarla
    Jan 2 at 12:56











  • Hi Venkatesh- Did the code work for you

    – Yogesh Tandel
    Jan 3 at 7:50











  • Hi, yeah the adds are showing up but, I am getting some errors when navigation happens and I'm trying to fix them. I'll ask you if I can't. btw thanks for the solution mate it helped me.. I'm curious that, have you used this before or did you just do it for me??

    – Venkatesh Chejarla
    Jan 3 at 9:19













  • didi it just for you bro? Please mark correct on the answer and let me know if you need any assisstance

    – Yogesh Tandel
    Jan 3 at 9:21











  • Sure thing bro I'll do it.

    – Venkatesh Chejarla
    Jan 3 at 10:04



















  • This looks like a good solution, I'll try this. Thanks...

    – Venkatesh Chejarla
    Jan 2 at 12:56











  • Hi Venkatesh- Did the code work for you

    – Yogesh Tandel
    Jan 3 at 7:50











  • Hi, yeah the adds are showing up but, I am getting some errors when navigation happens and I'm trying to fix them. I'll ask you if I can't. btw thanks for the solution mate it helped me.. I'm curious that, have you used this before or did you just do it for me??

    – Venkatesh Chejarla
    Jan 3 at 9:19













  • didi it just for you bro? Please mark correct on the answer and let me know if you need any assisstance

    – Yogesh Tandel
    Jan 3 at 9:21











  • Sure thing bro I'll do it.

    – Venkatesh Chejarla
    Jan 3 at 10:04

















This looks like a good solution, I'll try this. Thanks...

– Venkatesh Chejarla
Jan 2 at 12:56





This looks like a good solution, I'll try this. Thanks...

– Venkatesh Chejarla
Jan 2 at 12:56













Hi Venkatesh- Did the code work for you

– Yogesh Tandel
Jan 3 at 7:50





Hi Venkatesh- Did the code work for you

– Yogesh Tandel
Jan 3 at 7:50













Hi, yeah the adds are showing up but, I am getting some errors when navigation happens and I'm trying to fix them. I'll ask you if I can't. btw thanks for the solution mate it helped me.. I'm curious that, have you used this before or did you just do it for me??

– Venkatesh Chejarla
Jan 3 at 9:19







Hi, yeah the adds are showing up but, I am getting some errors when navigation happens and I'm trying to fix them. I'll ask you if I can't. btw thanks for the solution mate it helped me.. I'm curious that, have you used this before or did you just do it for me??

– Venkatesh Chejarla
Jan 3 at 9:19















didi it just for you bro? Please mark correct on the answer and let me know if you need any assisstance

– Yogesh Tandel
Jan 3 at 9:21





didi it just for you bro? Please mark correct on the answer and let me know if you need any assisstance

– Yogesh Tandel
Jan 3 at 9:21













Sure thing bro I'll do it.

– Venkatesh Chejarla
Jan 3 at 10:04





Sure thing bro I'll do it.

– Venkatesh Chejarla
Jan 3 at 10:04




















draft saved

draft discarded




















































Thanks for contributing an answer to Stack Overflow!


  • Please be sure to answer the question. Provide details and share your research!

But avoid



  • Asking for help, clarification, or responding to other answers.

  • Making statements based on opinion; back them up with references or personal experience.


To learn more, see our tips on writing great answers.




draft saved


draft discarded














StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f54003106%2fhow-to-add-a-custom-view-after-every-2-rows-in-a-collectionview-swift%23new-answer', 'question_page');
}
);

Post as a guest















Required, but never shown





















































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown

































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown







Popular posts from this blog

MongoDB - Not Authorized To Execute Command

How to fix TextFormField cause rebuild widget in Flutter

Npm cannot find a required file even through it is in the searched directory