Today I will show you how to make animated bar buttons and make it with coding. First of all we need icons for our navigation bar. Let's get them from google material design icons.
Google Material Design Icons
Adding icons to project
The only thing that we make with Storyboard is embed our view controller in navigation controller. We need it for navigation bar as container for bar buttons.
Declare two bar button items
var settingsBarButton: UIBarButtonItem?
var favoriteBarButton: UIBarButtonItem?
And Bool variable for switch icon of favourite button.
var favorite: Bool = false
Creating images from Assets. One image for settings icon and two images for favourite icon (favourite and unfavourite).
let settingsImage = UIImage(named: "ic_settings_48pt")?.withRenderingMode(.alwaysTemplate)
let favoriteBorderImage = UIImage(named: "ic_favorite_border_48pt")?.withRenderingMode(.alwaysTemplate)
let favoriteFullImage = UIImage(named: "ic_favorite_48pt")?.withRenderingMode(.alwaysTemplate)
Inside
viewDidLoad method let's create UIButton, configure it and initialize settings bar button item with this UIButton. We put it to the left part of navigation item of view controller.
let settingsButton = UIButton(type: .system)
settingsButton.tintColor = .black
settingsButton.setImage(self.settingsImage, for: .normal)
settingsButton.frame = CGRect(x: 0, y: 0, width: 30, height: 30)
settingsButton.addTarget(self, action: #selector(settingsButtonTapped), for: .touchUpInside)
self.settingsBarButton = UIBarButtonItem(customView: settingsButton)
self.navigationItem.setLeftBarButton(settingsBarButton, animated: false)
It is touch handler for button. Here we make animation. There are two steps:
- Rotate view to some angle
- With animation we restore initial view rotation as it was before first rotation
@objc func settingsButtonTapped(_ sender: UIButton) {
self.settingsBarButton?.customView?.transform =
CGAffineTransform(rotationAngle: CGFloat(CGFloat.pi * -3/4))
UIView.animate(withDuration: 0.8) {
self.settingsBarButton?.customView?.transform = .identity
}
}
The same for favourite bar button. Initially we create it with favourite empty icon (unfavourite). We put it to the right part of navigation item of view controller.
let favoriteButton = UIButton(type: .system)
favoriteButton.tintColor = .black
favoriteButton.setImage(self.favoriteBorderImage, for: .normal)
favoriteButton.frame = CGRect(x: 0, y: 0, width: 30, height: 30)
favoriteButton.addTarget(self, action: #selector(favoriteButtonTapped), for: .touchUpInside)
self.favoriteBarButton = UIBarButtonItem(customView: favoriteButton)
self.navigationItem.setRightBarButton(favoriteBarButton, animated: false)
Touch handler for favourite button. The same logic as before, but here we use other type of transformation(previously we use rotation), now we use scaling transformation:
- Change button scale.
- Restore button scale with animation. Also inside animation we change icon of button.
Here we use spring animation. It means that here will be appear special effects during animations. Such as velocity and damping changing and etc.
@objc func favoriteButtonTapped(_ sender: UIButton) {
self.favoriteBarButton?.customView?.transform = CGAffineTransform(scaleX: 0, y: 0)
UIView.animate(withDuration: 0.5,
delay: 0.0,
usingSpringWithDamping: 0.6,
initialSpringVelocity: 10,
options: .curveEaseInOut,
animations: {
self.favorite = !self.favorite
let image = self.favorite ? self.favoriteFullImage : self.favoriteBorderImage
if let button = self.favoriteBarButton?.customView as? UIButton {
button.setImage(image, for: .normal)
}
self.favoriteBarButton?.customView?.transform = .identity
}, completion: nil)
}
How it all work
GitHub Link
How I wish I can get this in objectiveC, any help will be appreciated.
ReplyDeleteThanks this worked perfectly.
ReplyDeleteI've read your post thank you for sharing this post. It is very informative post. keep sharing waiting for another.
ReplyDelete-Custom Web Design
After a long time i found a unique and on purpose information about Custom Designed Websites. Can't wait to have more from you.
ReplyDeleteThis article impresses me with its well-researched material and good writing. I couldn't put this book down since I was so engrossed in it. Your work and skill have impressed me. Thank you a lot. It can be beneficial to those who want to learn more about Best Custom Websites
ReplyDeleteThank you very much for sharing this informational blog.I could not find such kind of information in any other site.I'll come back for more fantastic material.
ReplyDeleteBest wishes, and good luck.
Custom Website
This is a great article! Thank you very much. I really need these suggestions. An in-depth explanation is of great benefit. Incredibly inspiring to see how you write. Custom Website
ReplyDeleteAmazing write-up! The blog was very informative. Keep it up!
ReplyDeleteSoftware Testing Services
Amazing write-up! The blog was very informative. Keep it up!
ReplyDeleteCustom Website/a>