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/Buttons
Then, run the installer:
pod install
After 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
accessibilityLabel
value 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
hitAreaInsets
to 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
accessibilityHint
values. - (Bad) The dialog has no header above the list of days. Each list item
(representing a day of the week) has the
accessibilityHint
value, "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 |
setInkColor inkColor |
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 |
setInkColor inkColor |
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 = .expanded
MDCFloatingButton *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 |
setInkColor inkColor |
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+Theming
Then run the installer:
pod install
Next, 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];