A floating action button (FAB) represents the primary action of a screen.
Contents
Because MDCFloatingButton is a subclass of MDCButton, the steps for installing it are the same.
In order to use MDCFloatingButton, first add the Buttons subspec to your Podfile:
pod MaterialComponents/ButtonsThen, run the installer:
pod installAfter that, import the relevant target or file and initialize an MDCFloatingButton.
import MaterialComponents.MaterialButtons
let fab = MDCFloatingButton()#import "MaterialButtons.h"
MDCFloatingButton *fab = [[MDCFloatingButton alloc] init];To help make your FABs usable to as many users as possible, apply the following:
- Set an appropriate
accessibilityLabelvalue if your button does not have a title or only has an icon:
floatingButton.accessibilityLabel = "Create"floatingButton.accessibilityLabel = @"Create";- Set the minimum visual height to 36 and miniumum visual width to 64
floatingButton.minimumSize = CGSize(width: 64, height: 48)floatingButton.minimumSize = CGSizeMake(64, 36);- Set the touch areas to at least 44 points high and 44
wide.
To minimize FAB's visual size while allowing for larger touchable areas, set the
hitAreaInsetsto a negative value. Maintain sufficient distance between the FAB touch targets. For more see the Touch and click targets in the spec.
let buttonVerticalInset =
min(0, -(kMinimumAccessibleButtonSize.height - button.bounds.height) / 2);
let buttonHorizontalInset =
min(0, -(kMinimumAccessibleButtonSize.width - button.bounds.width) / 2);
floatingButton.hitAreaInsets =
UIEdgeInsetsMake(buttonVerticalInset, buttonHorizontalInset,
buttonVerticalInset, buttonHorizontalInset);CGFloat verticalInset = MIN(0, -(48 - CGRectGetHeight(fab.bounds)) / 2);
CGFloat horizontalInset = MIN(0, -(48 - CGRectGetWidth(fab.bounds)) / 2);
floatingButton.hitAreaInsets = UIEdgeInsetsMake(verticalInset, horizontalInset, verticalInset, horizontalInset);Note There are some clear exceptions for these rules. Please adjust your buttons sizes accordingly.
- Optional Set an appropriate
accessibilityHint
Apple rarely recommends using the accessibilityHint because the label should
already be clear enough to indicate what will happen. Before you consider
setting an -accessibilityHint consider if you need it or if the rest of your
UI could be adjusted to make it more contextually clear.
A well-crafted, thoughtful user interface can remove the need for
accessibilityHint in most situations. Examples for a selection dialog to
choose one or more days of the week for a repeating calendar event:
- (Good) The dialog includes a header above the list of days reading, "Event
repeats weekly on the following day(s)." The list items do not need
accessibilityHintvalues. - (Bad) The dialog has no header above the list of days. Each list item
(representing a day of the week) has the
accessibilityHintvalue, "Toggles this day."
Types
There are three types of FABs: 1. Regular FABs 2. Mini FABs 3. Extended FABs
All three types of FABs are implemented by MDCFloatingButton, a subclass of MDCButton.
Regular FABs are FABs that are not expanded and are a regular size.
To create a regular FAB use the +floatingButtonWithShape: constructor with a value of MDCFloatingButtonShapeDefault and make sure the mode property is set to MDCFloatingButtonModeNormal.
For more information on theming FABs see the Theming section.
let fab = MDCFloatingButton(shape: `default`)MDCFloatingButton *fab =
[MDCFloatingButton floatingButtonWithShape:MDCFloatingButtonShapeDefault];A regular FAB has a container and an icon.
- Container
- Icon
| Attribute | Related method(s) | Default value | |
|---|---|---|---|
| Color | backgroundColor |
setBackgroundColor:forState:backgroundColorForState |
blue 500 from this Theming doc. |
| Stroke color | setBorderColor:forState:borderColorForState: |
nil |
|
| Stroke width | setBorderWidth:forState:borderWidthForState: |
0 |
|
| Ripple color | inkColor |
setInkColorinkColor |
White at 20% opacity |
| Attribute | Related method(s) | Default value | |
|---|---|---|---|
| Icon | imageView |
setImage:forState:imageForState: |
nil |
| Color | imageView.tintColor |
setImageViewTintColor:forState:imageViewTintColorForState: |
nil |
A mini FAB should be used on smaller screens.
Mini FABs can also be used to create visual continuity with other screen elements.
To create a mini FAB use the +floatingButtonWithShape: constructor with a value of MDCFloatingButtonShapeMini and make sure the mode property is set to MDCFloatingButtonModeNormal.
For more information on theming FABs see the Theming section.
let fab = MDCFloatingButton(shape: mini)MDCFloatingButton *fab =
[MDCFloatingButton floatingButtonWithShape:MDCFloatingButtonShapeMini];A mini FAB has a container and an icon.
- Container
- Icon
| Attribute | Related method(s) | Default value | |
|---|---|---|---|
| Color | backgroundColor |
setBackgroundColor:forState:backgroundColorForState |
blue 500 from this Theming doc. |
| Stroke color | setBorderColor:forState:borderColorForState: |
nil |
|
| Stroke width | setBorderWidth:forState:borderWidthForState: |
0 |
|
| Ripple color | inkColor |
setInkColorinkColor |
White at 20% opacity |
| Attribute | Related method(s) | Default value | |
|---|---|---|---|
| Icon | imageView |
setImage:forState:imageForState: |
nil |
| Color | imageView.tintColor |
setImageViewTintColor:forState:imageViewTintColorForState: |
nil |
The extended FAB is wider, and it includes a text label.
To create an extended FAB use the +floatingButtonWithShape: constructor with a value of MDCFloatingButtonShapeDefault and make sure the mode property is set to MDCFloatingButtonModeExpanded.
For more information on theming FABs see the Theming section.
let fab = MDCFloatingButton(shape: .default)
fab.mode = .expandedMDCFloatingButton *fab =
[MDCFloatingButton floatingButtonWithShape:MDCFloatingButtonShapeDefault];
fab.mode = MDCFloatingButtonModeExpanded;An extended FAB has a text label, a transparent container and an optional icon.
- Container
- Icon
- Text label
| Attribute | Related method(s) | Default value | |
|---|---|---|---|
| Color | backgroundColor |
setBackgroundColor:forState:backgroundColorForState |
blue 500 from this Theming doc. |
| Stroke color | setBorderColor:forState:borderColorForState: |
nil |
|
| Stroke width | setBorderWidth:forState:borderWidthForState: |
0 |
|
| Ripple color | inkColor |
setInkColorinkColor |
White at 20% opacity |
| Attribute | Related method(s) | Default value | |
|---|---|---|---|
| Icon | imageView |
setImage:forState:imageForState: |
nil |
| Color | imageView.tintColor |
setImageViewTintColor:forState:imageViewTintColorForState: |
nil |
| Attribute | Related method(s) | Default value | |
|---|---|---|---|
| Text label | titleLabel |
setTitle:forState:titleForState: |
nil |
| Color | titleLabel.textColor |
setTitleColor:forState:titleColorForState: |
UIColor.blackColor |
| Typography | titleLabel.font |
setFont: and font on titleLabel |
Button |
You can theme an MDCFloatingButton to have a secondary theme using the MDCFloatingButton theming
extension. Learn more about theming extensions and container schemes. Below is a screenshot of Material FABs with the Material Design Shrine theme:
To make use of the theming methods shown in the examples above install the Buttons theming extensions with Cocoapods. First, add the following line to your Podfile:
pod MaterialComponents/Buttons+ThemingThen run the installer:
pod installNext, import the Buttons theming target.
import MaterialComponents.MaterialButtons
import MaterialComponents.MaterialButtons_Theming#import "MaterialButtons.h"
#import <MaterialComponents/MaterialButtons+Theming.h>From there, pass a container scheme into the theming method on an MDCFloatingButton instance.
let fab = MDCFloatingButton(shape: `default`)
fab.applySecondaryThemeWith(withScheme:containerScheme)MDCFloatingButton *fab =
[MDCFloatingButton floatingButtonWithShape:MDCFloatingButtonShapeMini];
[fab applySecondaryThemeWithScheme:self.containerScheme];







