blob: d69730cb60a8c99905e8f3bc2381a6ab928a88fd [file] [log] [blame] [edit]
// Copyright 2021-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>
#import "MDCShadow.h"
/**
An immutable shadows collection object that encapsulates a storage of shadows correlating to
elevation values.
To apply a shadow on a view, please see and use the C methods @c MDCConfigureShadowForView and
@c MDCConfigureShadowForViewWithPath.
*/
__attribute__((objc_subclassing_restricted)) @interface MDCShadowsCollection : NSObject
- (nonnull instancetype)init NS_UNAVAILABLE;
/**
Returns an MDCShadow instance representing the shadow properties for the given elevation (in
points) by fetching from the @c shadowsCollection container holding elevation to MDCShadow instance
bindings.
Note: If the provided elevation is not stored, the shadow properties that are set are of the
nearest elevation above the provided elevation. i.e. if elevations 1 and 3 are set, and an
elevation of 2 is provided as input, the shadow properties set will be of elevation 3. If the
provided elevation is above the highest elevation value that is set, then the shadow properties set
will be of the highest elevation.
*/
- (nonnull MDCShadow *)shadowForElevation:(CGFloat)elevation;
@end
/**
A shadows collection object builder that generates an MDCShadowsCollection instance using the @c
build method. The object allows to add shadows for a given elevation.
To ensure no nullability situations, please instantiate the builder using @c
builderWithShadow:forElevation and provide an initial MDCShadow instance.
*/
__attribute__((objc_subclassing_restricted)) @interface MDCShadowsCollectionBuilder : NSObject
- (nonnull instancetype)init NS_UNAVAILABLE;
/**
Adds a shadow for the given elevation.
@param shadow An MDCShadow object consisting of shadow properties such as radius, opacity, and
offset.
@param elevation The elevation provided in points (dp).
*/
- (void)addShadow:(MDCShadow *_Nonnull)shadow forElevation:(CGFloat)elevation;
/**
Adds a dictionary of shadows with their correlating elevations to the shadows collection.
@param shadowsForElevations A dictionary holding NSNumber elevation value keys, and their values
are MDCShadow objects correlating to their elevation key.
*/
- (void)addShadowsForElevations:
(NSDictionary<NSNumber *, MDCShadow *> *_Nonnull)shadowsForElevations;
/**
Creates an initial MDCShadowsCollectionBuilder by providing it an initial MDCShadow object and its
correlating elevation.
@param shadow An MDCShadow object consisting of shadow properties such as radius, opacity, and
offset.
@param elevation The elevation provided in points (dp).
*/
+ (nonnull MDCShadowsCollectionBuilder *)builderWithShadow:(MDCShadow *_Nonnull)shadow
forElevation:(CGFloat)elevation;
/**
Builds and returns an MDCShadowsCollection instance given the provided shadows using the
@c addShadow:forElevation and @c addShadowsForElevations: APIs.
*/
- (nonnull MDCShadowsCollection *)build;
@end
/**
Given a view, MDCShadow instance, and a shadow color (e.g. `MDCShadowColor()`), updates the shadow
properties of `view.layer`:
* shadowColor
* shadowOpacity
* shadowRadius
* shadowOffset
* shadowPath
`shadowPath` will be set to the current bounds of the given view (including rounded
corners if set on view.layer).
TODO(b/182581383): maskedCorners, cornerCurve, and cornerCurveExpansionFactor are not
yet supported.
Call this function from your `UIView` subclass's `-layoutSubviews` to update `shadowPath`
whenever the view's bounds change.
*/
FOUNDATION_EXTERN void MDCConfigureShadowForView(UIView *_Nonnull view, MDCShadow *_Nonnull shadow,
UIColor *_Nonnull shadowColor)
NS_SWIFT_NAME(MDCConfigureShadow(for:shadow:color:));
/**
Given a view, MDCShadow instance, a shadow color (e.g. `MDCShadowColor()`), and a `path` in the
view's coordinate space representing the shape of the view, updates the shadow properties of
`view.layer`:
* shadowColor
* shadowOpacity
* shadowRadius
* shadowOffset
* shadowPath
Call this function from your `UIView` subclass's `-layoutSubviews` to update `shadowPath`
whenever the view's bounds or shape changes.
*/
FOUNDATION_EXTERN void MDCConfigureShadowForViewWithPath(UIView *_Nonnull view,
MDCShadow *_Nonnull shadow,
UIColor *_Nonnull shadowColor,
CGPathRef _Nonnull path)
NS_SWIFT_NAME(MDCConfigureShadow(for:shadow:color:path:));
/**
Default color for a Material shadow. On iOS >= 13, this is a dynamic color.
*/
FOUNDATION_EXTERN UIColor *_Nonnull MDCShadowColor(void);
/**
Returns an MDCShadowsCollection instance with predefined defaults of shadow properties (opacity,
radius, offset) for elevations.
*/
FOUNDATION_EXTERN MDCShadowsCollection *_Nonnull MDCShadowsCollectionDefault(void);