BounceButtonExample
This App shows the implementation of buttons with bounce effect as menu items.

How To
Integrate the library
Add these lines in the Podfile:
platform :ios, '7.0'
pod 'ASOAnimatedButton'
Storyboard
Menu Button with Two-State effect
Define each image name as values of OnStateImageName and OffStateImageName keys in User Defined Runtime Attributes of the ASOTwoStateButton object.

Menu Item View
Add a stand-alone UIViewController object in Storyboard with your given ID. In this example we define its Storyboard ID as ExpandMenu:

Create BounceButtonView Class as a subclass of ASOBounceButtonView and define it the Class of Menu Item View:

Set the outlet of all the buttons defined on Menu Item View to the BounceButtonView Class:
#import "ASOBounceButtonView.h"
@interface BounceButtonView : ASOBounceButtonView
@property (weak, nonatomic) IBOutlet UIButton *menuItem1;
@property (weak, nonatomic) IBOutlet UIButton *menuItem2;
@property (weak, nonatomic) IBOutlet UIButton *menuItem3;
@property (weak, nonatomic) IBOutlet UIButton *menuItem4;
@end
Implementation
Set the designated UIViewController as the delegate of ASOBounceButtonView Class
#import <UIKit/UIKit.h>
#import "ASOTwoStateButton.h"
#import "ASOBounceButtonViewDelegate.h"
#import "BounceButtonView.h"
@interface ExpandStyleMenuViewController : UIViewController <ASOBounceButtonViewDelegate>
@property (strong, nonatomic) IBOutlet ASOTwoStateButton *menuButton;
@property (strong, nonatomic) BounceButtonView *menuItemView;
- (IBAction)menuButtonAction:(id)sender;
Set 'Two-State' effect to the Menu Button:
[self.menuButton initAnimationWithFadeEffectEnabled:YES]; // Set to 'NO' to disable Fade effect between its two-state transition
Acquire the Menu Item View from Storyboard:
// Get the 'menu item view' from storyboard
UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"Main_iPhone" bundle:nil];
UIViewController *menuItemsVC = (UIViewController *)[mainStoryboard instantiateViewControllerWithIdentifier:@"ExpandMenu"];
self.menuItemView = (BounceButtonView *)menuItemsVC.view;
Add buttons as bounce buttons to the Menu Item View
NSArray *arrMenuItemButtons = [[NSArray alloc] initWithObjects:self.menuItemView.menuItem1,
self.menuItemView.menuItem2,
self.menuItemView.menuItem3,
self.menuItemView.menuItem4,
nil]; // Add all of the defined 'menu item button' to 'menu item view'
[self.menuItemView addBounceButtons:arrMenuItemButtons];
Set the animation starting point
The animation starting point is the Menu Button position. Send the Menu Button frame property to the Menu Item View on viewDidAppear event and every time there is a change in device orientation:
- (void)viewDidAppear:(BOOL)animated
{
// Tell 'menu button' position to 'menu item view'
[self.menuItemView setAnimationStartFromHere:self.menuButton.frame];
}
- (void)willAnimateRotationToInterfaceOrientation:
(UIInterfaceOrientation)toInterfaceOrientation
duration:(NSTimeInterval)duration
{
// Update 'menu button' position to 'menu item view' everytime there is a change in device orientation
[self.menuItemView setAnimationStartFromHere:self.menuButton.frame];
}
Expand and collapsed the Menu Item View
- (IBAction)menuButtonAction:(id)sender
{
if ([sender isOn]) {
// Show 'menu item view' and expand its 'menu item button'
[self.menuButton addCustomView:self.menuItemView];
[self.menuItemView expandWithAnimationStyle:ASOAnimationStyleExpand];
}
else {
// Collapse all 'menu item button' and remove 'menu item view'
[self.menuItemView collapseWithAnimationStyle:ASOAnimationStyleExpand];
[self.menuButton removeCustomView:self.menuItemView interval:[self.menuItemView.collapsedViewDuration doubleValue]];
}
}
Add custom actions in the `Menu Item View' delegate method
- (void)didSelectBounceButtonAtIndex:(NSUInteger)index
{
// Collapse all 'menu item button' and remove 'menu item view' once a menu item is selected
[self.menuButton sendActionsForControlEvents:UIControlEventTouchUpInside];
// Add your custom action for each selected 'menu item button' here
NSLog(@"Menu Item %x is selected", (short)index];
}
Controls
Control the speed of each animated button:
@property (strong, nonatomic) NSNumber *speed;
Control the speed of fade-out effect when the view is collapsed:
@property (strong, nonatomic) NSNumber *fadeOutDuration;
Control the bouncing distance of each animated button:
@property (strong, nonatomic) NSNumber *bouncingDistance;
Control which animation style to be used
@property (nonatomic) ASOAnimationStyle animationStyle;
Animation Style
There three available Animation Style:
ASOAnimationStyleExpand provides an effect of growing where buttons movement follow the path of other buttons defined in its previous order:

ASOAnimationStyleRiseProgressively provides an effect where all defined buttons move directly from starting positon to its final position. The movement pace of each buttons are slower gradually:

ASOAnimationStyleRiseConcurrently provides an effect where all defined buttons move directly from starting position to its final position at the same time:

Getting Help
If you need help using ASOAnimatedButton, please post a question on StackOverflow with the "ASOAnimatedButton" tag.
If you think you found a problem with ASOAnimatedButton, please post an issue. A sample project or fork of any of the examples demonstrating the problem will be helpful.
Author
Agus Soedibjo. Copyright (c) 2014 Agus Soedibjo, contact@soedibjo.com
License
ASOAnimatedButton is available under the MIT license. See the LICENSE file for more info.