| // Copyright 2018-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 "MaterialInk.h" |
| #import "MaterialShadowLayer.h" |
| |
| @protocol MDCShapeGenerating; |
| |
| /** |
| Through the lifecycle of the cell, the cell can go through one of the 3 states, |
| normal, highlighted, and selected. The cell starts in its default state, normal. |
| When `selectable` is set to NO, each touch on the cell turns it to the highlighted state, and when |
| the touch is released, it is returned to the normal state. When `selectable` is set to YES. Each |
| touch on the cell that isn't cancelled turns the cell to its selected state. Another touch on the |
| cell changes it back to normal. |
| */ |
| typedef NS_ENUM(NSInteger, MDCCardCellState) { |
| /** The visual state when the cell is in its normal state. */ |
| MDCCardCellStateNormal = 0, |
| |
| /** The visual state when the cell is in its highlighted state. */ |
| MDCCardCellStateHighlighted, |
| |
| /** The visual state when the cell has been selected. */ |
| MDCCardCellStateSelected |
| }; |
| |
| /** |
| The horizontal alignment of the image when in selectable mode (`selectable` is set to YES). |
| */ |
| typedef NS_ENUM(NSInteger, MDCCardCellHorizontalImageAlignment) { |
| /** The alignment of the image is to the right of the card. */ |
| MDCCardCellHorizontalImageAlignmentRight = 0, |
| |
| /** The alignment of the image is to the center of the card. */ |
| MDCCardCellHorizontalImageAlignmentCenter, |
| |
| /** The alignment of the image is to the left of the card. */ |
| MDCCardCellHorizontalImageAlignmentLeft, |
| |
| // TODO: Add AlignmentLeading and AlignmentTrailing. See Github issue #3045 |
| }; |
| |
| /** |
| The vertical alignment of the image when in selectable mode (`selectable` is set to YES). |
| */ |
| typedef NS_ENUM(NSInteger, MDCCardCellVerticalImageAlignment) { |
| /** The alignment of the image is to the top of the card. */ |
| MDCCardCellVerticalImageAlignmentTop = 0, |
| |
| /** The alignment of the image is to the center of the card. */ |
| MDCCardCellVerticalImageAlignmentCenter, |
| |
| /** The alignment of the image is to the bottom of the card. */ |
| MDCCardCellVerticalImageAlignmentBottom, |
| }; |
| |
| @interface MDCCardCollectionCell : UICollectionViewCell |
| |
| /** |
| When selectable is set to YES, a tap on a cell will trigger a visual change between selected |
| and unselected. When it is set to NO, a tap will trigger a normal tap (rather than trigger |
| different visual selection states on the card). |
| Default is set to NO. |
| */ |
| @property(nonatomic, assign, getter=isSelectable) BOOL selectable; |
| |
| /** |
| The corner radius for the card |
| Default is set to 4. |
| */ |
| @property(nonatomic, assign) CGFloat cornerRadius UI_APPEARANCE_SELECTOR; |
| |
| /** |
| The inkView for the card that is initiated on tap |
| */ |
| @property(nonatomic, readonly, strong, nonnull) MDCInkView *inkView; |
| |
| /** |
| This property defines if a card as a whole should be interactable or not. |
| What this means is that when isInteractable is set to NO, there will be no ink ripple and |
| no change in shadow elevation when tapped or selected. Also the card container itself will not be |
| tappable, but any of its subviews will still be tappable. |
| |
| Default is set to YES. |
| |
| Important: Our specification for cards explicitly define a card as being an interactable component. |
| Therefore, this property should be set to NO *only if* there are other interactable items within |
| the card's content, such as buttons or other tappable controls. |
| */ |
| @property (nonatomic, getter=isInteractable) IBInspectable BOOL interactable; |
| |
| /* |
| The shape generator used to define the card cell's shape. |
| When set, layer properties such as cornerRadius and other layer properties are nullified/zeroed. |
| If a layer property is explicitly set after the shapeGenerator has been set, it will lead to |
| unexpected behavior. |
| |
| When the shapeGenerator is nil, MDCCardCollectionCell will use the default underlying layer with |
| its default settings. |
| |
| Default value for shapeGenerator is nil. |
| */ |
| @property(nullable, nonatomic, strong) id<MDCShapeGenerating> shapeGenerator; |
| |
| /** |
| Sets the shadow elevation for an MDCCardViewState state |
| |
| @param shadowElevation The shadow elevation |
| @param state MDCCardCellState the card state |
| */ |
| - (void)setShadowElevation:(MDCShadowElevation)shadowElevation forState:(MDCCardCellState)state |
| UI_APPEARANCE_SELECTOR; |
| |
| /** |
| Returns the shadow elevation for an MDCCardViewState state |
| |
| If no elevation has been set for a state, the value for MDCCardCellStateNormal will be returned. |
| Default value for MDCCardCellStateNormal is 1 |
| Default value for MDCCardCellStateHighlighted is 8 |
| Default value for MDCCardCellStateSelected is 8 |
| |
| @param state MDCCardCellStateNormal the card state |
| @return The shadow elevation for the requested state. |
| */ |
| - (MDCShadowElevation)shadowElevationForState:(MDCCardCellState)state UI_APPEARANCE_SELECTOR; |
| |
| /** |
| Sets the border width for an MDCCardViewState state |
| |
| @param borderWidth The border width |
| @param state MDCCardCellState the card state |
| */ |
| - (void)setBorderWidth:(CGFloat)borderWidth forState:(MDCCardCellState)state |
| UI_APPEARANCE_SELECTOR; |
| |
| /** |
| Returns the border width for an MDCCardCellState state |
| |
| If no border width has been set for a state, the value for MDCCardCellStateNormal will be returned. |
| Default value for MDCCardCellStateNormal is 0 |
| |
| @param state MDCCardCellState the card state |
| @return The border width for the requested state. |
| */ |
| - (CGFloat)borderWidthForState:(MDCCardCellState)state UI_APPEARANCE_SELECTOR; |
| |
| /** |
| Sets the border color for an MDCCardCellStateNormal state |
| |
| @param borderColor The border color |
| @param state MDCCardCellState the card state |
| */ |
| - (void)setBorderColor:(nullable UIColor *)borderColor forState:(MDCCardCellState)state |
| UI_APPEARANCE_SELECTOR; |
| |
| /** |
| Returns the border color for an MDCCardCellStateNormal state |
| |
| If no border color has been set for a state, it will check the value of UIControlStateNormal. |
| If that value also isn't set, then nil will be returned. |
| |
| @param state MDCCardCellState the card state |
| @return The border color for the requested state. |
| */ |
| - (nullable UIColor *)borderColorForState:(MDCCardCellState)state UI_APPEARANCE_SELECTOR; |
| |
| /** |
| Sets the shadow color for an MDCCardCellStateNormal state |
| |
| @param shadowColor The shadow color |
| @param state MDCCardCellState the card state |
| */ |
| - (void)setShadowColor:(nullable UIColor *)shadowColor forState:(MDCCardCellState)state |
| UI_APPEARANCE_SELECTOR; |
| |
| /** |
| Returns the shadow color for an MDCCardCellStateNormal state |
| |
| If no color has been set for a state, the value for MDCCardViewStateNormal will be returned. |
| Default value for MDCCardCellStateNormal is blackColor |
| |
| @param state MDCCardCellState the card state |
| @return The shadow color for the requested state. |
| */ |
| - (nullable UIColor *)shadowColorForState:(MDCCardCellState)state UI_APPEARANCE_SELECTOR; |
| |
| /** |
| Returns the image for an MDCCardCellStateNormal state. |
| |
| @note The image is only displayed when `selectable` is YES. |
| If no image has been set for a state, it will check the value of UIControlStateNormal. |
| If that value also isn't set, then nil will be returned. |
| Default value for MDCCardCellStateSelected is ic_check_circle |
| |
| @param state MDCCardCellState the card state |
| @return The image for the requested state. |
| */ |
| - (nullable UIImage *)imageForState:(MDCCardCellState)state UI_APPEARANCE_SELECTOR; |
| |
| /** |
| Sets the image for an MDCCardCellStateNormal state |
| |
| @note The image is only displayed when `selectable` is YES. |
| @param image The image |
| @param state MDCCardCellState the card state |
| */ |
| - (void)setImage:(nullable UIImage *)image forState:(MDCCardCellState)state |
| UI_APPEARANCE_SELECTOR; |
| |
| /** |
| Returns the horizontal image alignment for an MDCCardCellStateNormal state |
| |
| @note The image is only displayed when `selectable` is YES. |
| If no alignment has been set for a state, it will check the value of UIControlStateNormal. |
| If that value also isn't set, then MDCCardCellImageHorizontalAlignmentRight will be returned. |
| |
| @param state MDCCardCellState the card state |
| @return The horizontal alignment for the requested state. |
| */ |
| - (MDCCardCellHorizontalImageAlignment)horizontalImageAlignmentForState:(MDCCardCellState)state |
| UI_APPEARANCE_SELECTOR; |
| |
| /** |
| Sets the image alignment for an MDCCardCellStateNormal state |
| |
| @note The image is only displayed when `selectable` is YES. |
| @param horizontalImageAlignment The image alignment |
| @param state MDCCardCellState the card state |
| */ |
| - (void)setHorizontalImageAlignment:(MDCCardCellHorizontalImageAlignment)horizontalImageAlignment |
| forState:(MDCCardCellState)state UI_APPEARANCE_SELECTOR; |
| |
| /** |
| Returns the vertical image alignment for an MDCCardCellStateNormal state |
| |
| @note The image is only displayed when `selectable` is YES. |
| If no alignment has been set for a state, it will check the value of UIControlStateNormal. |
| If that value also isn't set, then MDCCardCellImageVerticalAlignmentTop will be returned. |
| |
| @param state MDCCardCellState the card state |
| @return The vertical alignment for the requested state. |
| */ |
| - (MDCCardCellVerticalImageAlignment)verticalImageAlignmentForState:(MDCCardCellState)state |
| UI_APPEARANCE_SELECTOR; |
| |
| /** |
| Sets the image alignment for an MDCCardCellStateNormal state |
| |
| @note The image is only displayed when `selectable` is YES. |
| @param verticalImageAlignment The image alignment |
| @param state MDCCardCellState the card state |
| */ |
| - (void)setVerticalImageAlignment:(MDCCardCellVerticalImageAlignment)verticalImageAlignment |
| forState:(MDCCardCellState)state UI_APPEARANCE_SELECTOR; |
| |
| /** |
| Returns the image tint color for an MDCCardCellStateNormal state |
| |
| @note The image is only displayed when `selectable` is YES. |
| If no tint color has been set for a state, it will check the value of UIControlStateNormal. |
| If that value also isn't set, then nil will be returned. |
| |
| @param state MDCCardCellState the card state |
| @return The image tint color for the requested state. |
| */ |
| - (nullable UIColor *)imageTintColorForState:(MDCCardCellState)state UI_APPEARANCE_SELECTOR; |
| |
| /** |
| Sets the image tint color for an MDCCardCellStateNormal state |
| |
| @note The image is only displayed when `selectable` is YES. |
| @param imageTintColor The image tint color |
| @param state MDCCardCellState the card state |
| */ |
| - (void)setImageTintColor:(nullable UIColor *)imageTintColor forState:(MDCCardCellState)state |
| UI_APPEARANCE_SELECTOR; |
| |
| /** |
| The state of the card cell. |
| Default is MDCCardCellStateNormal. |
| */ |
| @property(nonatomic, readonly) MDCCardCellState state; |
| |
| @end |