blob: b88de0c9846137a5f110e21a19caaf88e761b72e [file] [log] [blame]
// Copyright 2016-present the Material Components for iOS authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#import <UIKit/UIKit.h>
@class MDCActivityIndicatorTransition;
@protocol MDCActivityIndicatorDelegate;
/**
Different operating modes for the activity indicator.
This component can be used as a determinate progress indicator or an indeterminate activity
indicator.
Default value is MDCActivityIndicatorModeIndeterminate.
*/
typedef NS_ENUM(NSInteger, MDCActivityIndicatorMode) {
/** Indeterminate indicators visualize an unspecified wait time. */
MDCActivityIndicatorModeIndeterminate,
/** Determinate indicators display how long an operation will take. */
MDCActivityIndicatorModeDeterminate,
};
/**
A Material Design activity indicator.
The activity indicator is a circular spinner that shows progress of an operation. By default the
activity indicator assumes indeterminate progress of an unspecified length of time. In contrast to
a standard UIActivityIndicator, MDCActivityIndicator supports showing determinate progress and uses
custom Material Design animation for indeterminate progress.
See https://material.io/go/design-progress-indicators
*/
IB_DESIGNABLE
@interface MDCActivityIndicator : UIView
/**
The callback delegate. See @c MDCActivityIndicatorDelegate.
*/
@property(nonatomic, weak, nullable) id<MDCActivityIndicatorDelegate> delegate;
/**
Whether or not the activity indicator is currently animating.
*/
@property(nonatomic, assign, getter=isAnimating) BOOL animating;
/**
Spinner radius width. Defaults to 12dp (24x24dp circle), constrained to range [5dp, 72dp]. The
spinner is centered in the view's bounds. If the bounds are smaller than the diameter of the
spinner, the spinner may be clipped when clipToBounds is true.
*/
@property(nonatomic, assign) CGFloat radius UI_APPEARANCE_SELECTOR;
/**
Spinner stroke width. Defaults to 2dp.
*/
@property(nonatomic, assign) CGFloat strokeWidth UI_APPEARANCE_SELECTOR;
/**
Show a faint ink track along the path of the indicator. Should be enabled when the activity
indicator wraps around another circular element, such as an avatar or a FAB. Defaults to NO.
*/
@property(nonatomic, assign) IBInspectable BOOL trackEnabled;
/**
The mode of the activity indicator. Default is MDCActivityIndicatorModeIndeterminate. If
currently animating, it will animate the transition between the current mode to the new mode.
*/
@property(nonatomic, assign) IBInspectable MDCActivityIndicatorMode indicatorMode;
/**
Set the mode of the activity indicator. If currently animating, it will animate the transition
between the current mode to the new mode. Default is MDCActivityIndicatorModeIndeterminate with no
animation.
*/
- (void)setIndicatorMode:(MDCActivityIndicatorMode)mode animated:(BOOL)animated;
/**
Progress is the extent to which the activity indicator circle is drawn to completion when
indicatorMode is MDCActivityIndicatorModeDeterminate. Progress is drawn clockwise to complete a
circle. Valid range is between [0-1]. Default is zero. 0.5 progress is half the circle. The
transitions between progress levels are animated.
*/
@property(nonatomic, assign) IBInspectable float progress;
/**
Set the determinate progress of the activity indicator when indicatorMode is
MDCActivityIndicatorModeDeterminate.
*/
- (void)setProgress:(float)progress animated:(BOOL)animated;
/**
The array of colors that are cycled through when animating the spinner. Populated with a set of
default colors.
@note If an empty array is provided to this property's setter, then the provided array will be
discarded and an array consisting of the default color values will be assigned instead.
*/
@property(nonatomic, copy, nonnull) NSArray<UIColor *> *cycleColors UI_APPEARANCE_SELECTOR;
/**
Starts the animated activity indicator. Does nothing if the spinner is already animating.
*/
- (void)startAnimating;
/**
Starts the animated activity indicator after performing the provided transition. The animation
cycle will begin on the cycleStartIndex provided. The startTransition will be applied with the
starting and ending positions of the indicator stroke at the moment when the animation will begin
taking into account the provided cycleStartIndex in the range [0,1]. The indicatorMode must be
MDCActivityIndicatorModeIndeterminate before calling.
*/
- (void)startAnimatingWithTransition:(nonnull MDCActivityIndicatorTransition *)startTransition
cycleStartIndex:(NSInteger)cycleStartIndex;
/**
Stops the animated activity indicator with a short opacity and stroke width animation. Does nothing
if the spinner is not animating.
*/
- (void)stopAnimating;
/**
Stops the animated activity indicator and then performs the provided transition. The provided
stopTransition will be called with the starting and ending positions of the indicator stroke at the
moment when the animation will begin in the range [0,1]. The indicatorMode must be
MDCActivityIndicatorModeIndeterminate before calling.
*/
- (void)stopAnimatingWithTransition:(nonnull MDCActivityIndicatorTransition *)stopTransition;
@end
/**
Delegate protocol for the MDCActivityIndicator.
*/
@protocol MDCActivityIndicatorDelegate <NSObject>
@optional
/**
When stop is called, the spinner gracefully animates out using opacity and stroke width.
This method is called after that fade-out animation completes.
@param activityIndicator Caller
*/
- (void)activityIndicatorAnimationDidFinish:(nonnull MDCActivityIndicator *)activityIndicator;
/**
When setIndicatorMode:animated: is called the spinner animates the transition from the current
mode to the new mode. This method is called after the animation completes or immediately if no
animation is requested.
@param activityIndicator Caller
*/
- (void)activityIndicatorModeTransitionDidFinish:(nonnull MDCActivityIndicator *)activityIndicator;
@end
typedef void (^MDCActivityIndicatorAnimation)(CGFloat strokeStart, CGFloat strokeEnd);
/**
Describes an animation that can be provided to an MDCActivityIndicator instance to perform before
or after its standard cycle animation.
*/
@interface MDCActivityIndicatorTransition : NSObject
/**
The animations to be performed by MDCActivityIndicator. In this block add CAAnimations to be
animated before or after MDCActivityIndicator's cycle animation. MDCActivityIndicator will trigger
these animations and call completion after they complete.
*/
@property(nonatomic, copy, nonnull) MDCActivityIndicatorAnimation animation;
/**
The completion block to call after animation's completion. This should be used to clean up any
layers placed and animating on the MDCActivityIndicator.
*/
@property(nonatomic, copy, nullable) void (^completion)(void);
/**
The duration of the animation.
*/
@property(nonatomic, assign) NSTimeInterval duration;
- (nonnull instancetype)init NS_UNAVAILABLE;
- (nonnull instancetype)initWithCoder:(nonnull NSCoder *)aDecoder NS_UNAVAILABLE;
- (nonnull instancetype)initWithAnimation:
(_Nonnull MDCActivityIndicatorAnimation)animation NS_DESIGNATED_INITIALIZER;
@end