Add Button at the End of Collection View in Storyboard

Add button at the end of collection view in storyboard

In storyboard you can enable it by selecting the radio button title "Section Footer", for your UICollectionView and then by dragging UIButton there. You can also override this function:

- (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath

You may also need to set Footer's reference size if you are UICollectionViewFlowLayout

How add button to end of CollectionView (Not in last Cell)?

This could be achieved using a UICollectionView footerView. Below is an example of how that might work:

First, register your footer view class in ViewDidLoad:

override func viewDidLoad() {
super.viewDidLoad()

registerClass(myFooterViewClass, forSupplementaryViewOfKind: UICollectionElementKindSectionFooter, withReuseIdentifier: "Footer")

}

Secondly, either set the headerReferenceSize in collectionViewFlowLayout or implement collectionView:layout:referenceSizeForHeaderInSection: in the UICollectionViewDelegate.

Thirdly, return the footerView from the dataSource:

func collectionView(collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, atIndexPath indexPath: NSIndexPath) -> UICollectionReusableView {
let view = collectionView.dequeueReusableSupplementaryViewOfKind(UICollectionElementKindSectionFooter, withReuseIdentifier: "myFooterView", forIndexPath: indexPath)

// Add your button here

return view
}

How can I add a add button at the end of the visible collection view in iOS

It seems like you forgot to call show on your alert

also, Instead of implementing a button and a method for the target use :

optional func collectionView(_ collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath)

if the index path is from your last cell show the alert.

How to add uibutton action in a collection view cell?

May be needful for you-

Write this code in cellForItemAtIndexPath

Swift 2.X

let editButton = UIButton(frame: CGRectMake(0, 20, 40,40))
editButton.setImage(UIImage(named: "editButton.png"), forState: UIControlState.Normal)
editButton.addTarget(self, action: #selector(editButtonTapped), forControlEvents: UIControlEvents.TouchUpInside)

cell.addSubview(editButton)

Swift 3.X

let editButton = UIButton(frame: CGRect(x:0, y:20, width:40,height:40))
editButton.setImage(UIImage(named: "editButton.png"), for: UIControlState.normal)
editButton.addTarget(self, action: #selector(editButtonTapped), for: UIControlEvents.touchUpInside)

cell.addSubview(editButton)

And perform your action-

override func viewDidLoad() {
super.viewDidLoad()
}

@IBAction func editButtonTapped() -> Void {
print("Hello Edit Button")
}

How to add a button to a collectionview cell

I am assuming that you are using custom class for collectionview cell and have already added camera image to first index of your array as you want to add option to open camera before your images. This is the easist way to do this.

func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {

let cell = collectionView.dequeueReusableCellWithReuseIdentifier("Identifier", forIndexPath: indexPath) as! YourCustomcell

cell.imageView.image = UIImage(named: arryImage[indexPath.item] as String)

return cell
}
func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath){
if indexPath.item == 0 {
//Code to open camera
}else{

}
}

This is the simplest way to achieve what you want. If you dont want to add camera image to your array of images, then just increase the array count by 1 in numberOfItemsInSection method and make following changes in cellForItemAtIndexPath method

if indexPath.item == 0 {
cell.imageView.image = UIImage(named: "CameraImage")
}else{
cell.imageView.image = UIImage(named: arryImage[(indexPath.item)-1] as String)
}

didSelectItemAtIndexPath method will remain same. If you want the opencamera function at the end then make changes accordingly.

Hope this will help you :)

How to add button in UICollectionView for inserting new data?

You basically make sure the + button is the last item in your collectionView each time and increment your number of items by 1 in the numberOfItemsInSection method.

How can I add a horizontal stack of buttons above a collection view in Swift?

Try taking things step-by-step...

Start with this code (assigned to a plain UIViewController as the root controller of a UINavigationController):

class TestVideoViewVC: UIViewController {

var myCollectionView: UICollectionView!
var videoArray = [UIImage]()

override func viewDidLoad() {
super.viewDidLoad()

// set main view background color to a nice medium blue
view.backgroundColor = UIColor(red: 0.25, green: 0.5, blue: 1.0, alpha: 1.0)

// vertical stack view for the full screen (safe area)
let mainStack = UIStackView()
mainStack.axis = .vertical
mainStack.spacing = 8
mainStack.translatesAutoresizingMaskIntoConstraints = false

// add it to the view
view.addSubview(mainStack)

let g = view.safeAreaLayoutGuide
NSLayoutConstraint.activate([
mainStack.topAnchor.constraint(equalTo: g.topAnchor),
mainStack.leadingAnchor.constraint(equalTo: g.leadingAnchor),
mainStack.trailingAnchor.constraint(equalTo: g.trailingAnchor),
mainStack.bottomAnchor.constraint(equalTo: g.bottomAnchor),
])

}

}

If you run the app as-is, you'll see this:

Sample Image

The stack view is there, but we haven't added any subviews to it.

So, let's add two views (labels)... the top one at 50-pts in height:

class TestVideoViewVC: UIViewController {

var myCollectionView: UICollectionView!
var videoArray = [UIImage]()

override func viewDidLoad() {
super.viewDidLoad()

// set main view background color to a nice medium blue
view.backgroundColor = UIColor(red: 0.25, green: 0.5, blue: 1.0, alpha: 1.0)

// vertical stack view for the full screen (safe area)
let mainStack = UIStackView()
mainStack.axis = .vertical
mainStack.spacing = 8
mainStack.translatesAutoresizingMaskIntoConstraints = false

// add it to the view
view.addSubview(mainStack)

let g = view.safeAreaLayoutGuide
NSLayoutConstraint.activate([
mainStack.topAnchor.constraint(equalTo: g.topAnchor),
mainStack.leadingAnchor.constraint(equalTo: g.leadingAnchor),
mainStack.trailingAnchor.constraint(equalTo: g.trailingAnchor),
mainStack.bottomAnchor.constraint(equalTo: g.bottomAnchor),
])

// add two arranged subviews, so we can see the layout
let v1 = UILabel()
v1.textAlignment = .center
v1.text = "Buttons will go here..."
v1.backgroundColor = .green

let v2 = UILabel()
v2.textAlignment = .center
v2.text = "Collection view will go here..."
v2.backgroundColor = .yellow

// let's give the top view a height of 50-pts
v1.heightAnchor.constraint(equalToConstant: 50.0).isActive = true

mainStack.addArrangedSubview(v1)
mainStack.addArrangedSubview(v2)
}

}

Run that code, and we get:

Sample Image

Now, let's replace v1 (the "top" label) with a horizontal stack view with 3 red, 50-pt tall buttons:

class TestVideoViewVC: UIViewController {

var myCollectionView: UICollectionView!
var videoArray = [UIImage]()

override func viewDidLoad() {
super.viewDidLoad()

// set main view background color to a nice medium blue
view.backgroundColor = UIColor(red: 0.25, green: 0.5, blue: 1.0, alpha: 1.0)

// vertical stack view for the full screen (safe area)
let mainStack = UIStackView()
mainStack.axis = .vertical
mainStack.spacing = 8
mainStack.translatesAutoresizingMaskIntoConstraints = false

// add it to the view
view.addSubview(mainStack)

let g = view.safeAreaLayoutGuide
NSLayoutConstraint.activate([
mainStack.topAnchor.constraint(equalTo: g.topAnchor),
mainStack.leadingAnchor.constraint(equalTo: g.leadingAnchor),
mainStack.trailingAnchor.constraint(equalTo: g.trailingAnchor),
mainStack.bottomAnchor.constraint(equalTo: g.bottomAnchor),
])

// create a horizontal stack view
let buttonsStack = UIStackView()
buttonsStack.axis = .horizontal
buttonsStack.spacing = 8
buttonsStack.distribution = .fillEqually

// create and add 3 50-pt height buttons to the stack view
["Videos", "Photos", "All"].forEach { str in
let b = UIButton()
b.setTitle(str, for: [])
b.setTitleColor(.white, for: .normal)
b.setTitleColor(.gray, for: .highlighted)
b.backgroundColor = .red
buttonsStack.addArrangedSubview(b)
b.heightAnchor.constraint(equalToConstant: 50.0).isActive = true
}

// add the buttons stack view to the main stack view
mainStack.addArrangedSubview(buttonsStack)

// create a label (this will be our collection view)
let v2 = UILabel()
v2.textAlignment = .center
v2.text = "Collection view will go here..."
v2.backgroundColor = .yellow

// add the label to the main stack view
mainStack.addArrangedSubview(v2)
}

}

Run that code, and we get:

Sample Image

Now we can replace v2 with our collection view:

class TestVideoViewVC: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout, UINavigationControllerDelegate {

var myCollectionView: UICollectionView!
var videoArray = [UIImage]()

override func viewDidLoad() {
super.viewDidLoad()

// set main view background color to a nice medium blue
view.backgroundColor = UIColor(red: 0.25, green: 0.5, blue: 1.0, alpha: 1.0)

// vertical stack view for the full screen (safe area)
let mainStack = UIStackView()
mainStack.axis = .vertical
mainStack.spacing = 8
mainStack.translatesAutoresizingMaskIntoConstraints = false

// add it to the view
view.addSubview(mainStack)

let g = view.safeAreaLayoutGuide
NSLayoutConstraint.activate([
mainStack.topAnchor.constraint(equalTo: g.topAnchor),
mainStack.leadingAnchor.constraint(equalTo: g.leadingAnchor),
mainStack.trailingAnchor.constraint(equalTo: g.trailingAnchor),
mainStack.bottomAnchor.constraint(equalTo: g.bottomAnchor),
])

// create a horizontal stack view
let buttonsStack = UIStackView()
buttonsStack.axis = .horizontal
buttonsStack.spacing = 8
buttonsStack.distribution = .fillEqually

// create and add 3 50-pt height buttons to the stack view
["Videos", "Photos", "All"].forEach { str in
let b = UIButton()
b.setTitle(str, for: [])
b.setTitleColor(.white, for: .normal)
b.setTitleColor(.gray, for: .highlighted)
b.backgroundColor = .red
buttonsStack.addArrangedSubview(b)
b.heightAnchor.constraint(equalToConstant: 50.0).isActive = true
}

// add the buttons stack view to the main stack view
mainStack.addArrangedSubview(buttonsStack)

// setup the collection view
setupCollection()

// add it to the main stack view
mainStack.addArrangedSubview(myCollectionView)

// start the async call to get the assets
grabVideos()
}

func setupCollection() {
let layout = UICollectionViewFlowLayout()
myCollectionView = UICollectionView(frame: self.view.frame, collectionViewLayout: layout)
myCollectionView.delegate = self
myCollectionView.dataSource = self
myCollectionView.register(VideoItemCell.self, forCellWithReuseIdentifier: "videoCell")
myCollectionView.backgroundColor = UIColor.white
}

//MARK: CollectionView
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return videoArray.count
}
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "videoCell", for: indexPath) as! VideoItemCell
cell.vid.image = videoArray[indexPath.item]
return cell
}
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
let width = collectionView.frame.width
return CGSize(width: width/4 - 1, height: width/4 - 1)
}
override func viewWillLayoutSubviews() {
super.viewWillLayoutSubviews()
myCollectionView.collectionViewLayout.invalidateLayout()
}
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat {
return 1.0
}
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAt section: Int) -> CGFloat {
return 1.0
}

//MARK: grab videos
func grabVideos(){
videoArray = []

DispatchQueue.global(qos: .background).async {
let imgManager = PHImageManager.default()

let requestOptions = PHImageRequestOptions()
requestOptions.isSynchronous = true
requestOptions.deliveryMode = .highQualityFormat

let fetchOptions = PHFetchOptions()
fetchOptions.sortDescriptors = [NSSortDescriptor(key:"creationDate", ascending: false)]

//let fetchResult: PHFetchResult = PHAsset.fetchAssets(with: .video, options: fetchOptions)
let fetchResult: PHFetchResult = PHAsset.fetchAssets(with: .image, options: fetchOptions)
print(fetchResult)
print(fetchResult.count)
if fetchResult.count > 0 {
for i in 0..<fetchResult.count{
imgManager.requestImage(for: fetchResult.object(at: i) as PHAsset, targetSize: CGSize(width:500, height: 500),contentMode: .aspectFill, options: requestOptions, resultHandler: { (image, error) in
self.videoArray.append(image!)
})
}
} else {
print("No videos found.")
}
DispatchQueue.main.async {

self.myCollectionView.reloadData()
}
}
}

}

class VideoItemCell: UICollectionViewCell {

var stackView = UIStackView()
var vid = UIImageView()

override init(frame: CGRect) {
super.init(frame: frame)
vid.contentMode = .scaleAspectFill
vid.clipsToBounds = true
self.addSubview(vid)
}
override func layoutSubviews() {
super.layoutSubviews()
vid.frame = self.bounds
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}

And we should have this (I just have the default photos, no videos, so I changed grabVideos() to get photos):

Sample Image

How to add a delete button to Collection View Cell in Swift?

Got it working! Here's how:

  1. I added a button to the cell in the Storyboard.
  2. Connected an outlet to the UICollectionViewCell class.
  3. Edited view controller code to:

    func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {

    let cell: UsernameCollectionViewCell = collectionView.dequeueReusableCellWithReuseIdentifier("Cell", forIndexPath: indexPath) as! UsernameCollectionViewCell

    cell.usernameLabel.text = userNames [indexPath.row]

    cell.deleteButton?.layer.setValue(indexPath.row, forKey: "index")
    cell.deleteButton?.addTarget(self, action: "deleteUser:", forControlEvents: UIControlEvents.TouchUpInside)

    // Remove the button from the first cell
    if (indexPath.row == 0){
    var close : UIButton = cell.viewWithTag(11) as! UIButton
    close.hidden = true
    }

    return cell
    }

    func deleteUser(sender:UIButton) {

    let i : Int = (sender.layer.valueForKey("index")) as! Int
    userNames.removeAtIndex(i)
    UserSelectCollection.reloadData()
    }

Many thanks to JigarM for his examples on GitHub:
https://github.com/JigarM/UICollectionView-Swift



Related Topics



Leave a reply



Submit