blob: dadf023607f2948dca880a6a66ef59bfc29c4a62 [file] [log] [blame] [view]
# Shapes Core
This library consists of several classes that are often used together to implement Shape behavior on a component.
Concretely, to create a shape object, you'll need to create an object that implements the `MDCShapeGenerating` protocol.
`MDCShapeGenerating` only has one method, `(CGPath *)pathForSize:(CGSize)size` that returns the shape’s `CGPath` for the expected size.
Our components support shapes by providing a property called `id<MDCShapeGenerating> shapeGenerator` and applies the provided shape to the component.
## Related Documentation
* [Shape Library](../../ShapeLibrary)
<!-- toc -->
- - -
## Overview
Listed below are classes that can be used to create an object that implements the `MDCShapeGenerating` protocol.
#### MDCPathGenerator
At the core there is `MDCPathGenerator`, which provides helper methods for building a `CGPath`.
By providing a start point and end point, and using its different APIs to draw lines/curves between points, a CGPath is created.
#### MDCShapedShadowLayer
An `MDCShapedShadowLayer` class is used as the main layer class of the component's view instead of `MDCShadowLayer`
to allow shapes to work well with shadows, borders, and background color.
The same way we override the layer in our components with `MDCShadowLayer` to achieve a shadow, we instead use `MDCShapedShadowLayer` like so:
```objc
@interface Component ()
@property(nonatomic, readonly, strong) MDCShapedShadowLayer *layer;
@end
@implementation Component
@dynamic layer;
+ (Class)layerClass {
return [MDCShapedShadowLayer class];
}
@end
```
#### MDCShapedView
`MDCShapedView` is a base `UIView` that incorporates `MDCShapedShadowLayer`, a shapeGenerator object,
and elevation, to provide a minimal view that has full shape support.
This can be used as a building block for components that need shape support.
#### MDCCornerTreatment and MDCEdgeTreatment
`MDCCornerTreatment` and `MDCEdgeTreatment` are both classes that provide a modular approach for defining specifically the `CGPath` for a specific edge or corner.
#### MDCRectangleShapeGenerator
The last class in the Shapes Core library is `MDCRectangleShapeGenerator`.
It is a shapeGenerator on its own (meaning it implements `MDCShapeGenerating`),
and generates a `CGPath` but allows good customization as part of its implementation.
It allows to set each of its corners and edges by using its `MDCCornerTreatments` and `MDCEdgeTreatment`.
With this class we can basically build any Shape we want.
## Usage
You'll typically create an `MDCRectangleShapeGenerator` instance that you set your component with.
Components that support the shape system will have a `id<MDCShapeGenerating> shapeGenerator` property as part of their API.
By setting the `shapeGenerator` property with your `MDCRectangleShapeGenerator`, you will provide the defined shape to your component.
<!--<div class="material-code-render" markdown="1">-->
#### Swift
```swift
let card = MDCCard()
let shapeGenerator = MDCRectangleShapeGenerator()
card.shapeGenerator = MDCRectangleShapeGenerator()
```
#### Objective-C
```objc
MDCCard *card = [[MDCCard alloc] init];
MDCRectangleShapeGenerator *shapeGenerator = [[MDCRectangleShapeGenerator alloc] init];
card.shapeGenerator = shapeGenerator;
```
<!--</div>-->