| // 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 "AnimationTimingExampleViewControllerSupplemental.h" |
| |
| #import "MaterialTypography.h" |
| |
| const CGFloat kTopMargin = 16; |
| const CGFloat kLeftGutter = 16; |
| const CGFloat kTextOffset = 16; |
| |
| // Size of the circle we animate. |
| static const CGSize kAnimationCircleSize = {48, 48}; |
| |
| @implementation AnimationTimingExampleViewController (CatalogByConvention) |
| |
| + (NSDictionary *)catalogMetadata { |
| return @{ |
| @"breadcrumbs" : @[ @"Animation Timing", @"Animation Timing" ], |
| @"description" : @"Animation timing easing curves create smooth and consistent motion. " |
| @"Easing curves allow elements to move between positions or states.", |
| @"primaryDemo" : @YES, |
| @"presentable" : @YES |
| }; |
| } |
| |
| @end |
| |
| @implementation AnimationTimingExampleViewController (Supplemental) |
| |
| - (void)setupExampleViews { |
| self.view.backgroundColor = UIColor.whiteColor; |
| |
| self.scrollView = [[UIScrollView alloc] initWithFrame:self.view.bounds]; |
| |
| self.scrollView.contentSize = |
| CGSizeMake(CGRectGetWidth(self.view.frame), CGRectGetHeight(self.view.frame) + kTopMargin); |
| self.scrollView.clipsToBounds = YES; |
| [self.view addSubview:self.scrollView]; |
| |
| if (@available(iOS 11.0, *)) { |
| // No need to do anything - additionalSafeAreaInsets will inset our content. |
| self.scrollView.autoresizingMask = |
| UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; |
| } else { |
| self.scrollView.translatesAutoresizingMaskIntoConstraints = NO; |
| [NSLayoutConstraint activateConstraints:@[ |
| [NSLayoutConstraint constraintWithItem:self.scrollView |
| attribute:NSLayoutAttributeTop |
| relatedBy:NSLayoutRelationEqual |
| toItem:self.topLayoutGuide |
| attribute:NSLayoutAttributeBottom |
| multiplier:1.0 |
| constant:0], |
| [NSLayoutConstraint constraintWithItem:self.scrollView |
| attribute:NSLayoutAttributeBottom |
| relatedBy:NSLayoutRelationEqual |
| toItem:self.view |
| attribute:NSLayoutAttributeBottom |
| multiplier:1.0 |
| constant:0], |
| [NSLayoutConstraint constraintWithItem:self.scrollView |
| attribute:NSLayoutAttributeLeft |
| relatedBy:NSLayoutRelationEqual |
| toItem:self.view |
| attribute:NSLayoutAttributeLeft |
| multiplier:1.0 |
| constant:0], |
| [NSLayoutConstraint constraintWithItem:self.scrollView |
| attribute:NSLayoutAttributeRight |
| relatedBy:NSLayoutRelationEqual |
| toItem:self.view |
| attribute:NSLayoutAttributeRight |
| multiplier:1.0 |
| constant:0] |
| ]]; |
| } |
| |
| CGFloat lineSpace = (CGRectGetHeight(self.view.frame) - 50) / 5; |
| UILabel *linearLabel = [AnimationTimingExampleViewController curveLabelWithTitle:@"Linear"]; |
| linearLabel.frame = CGRectMake(kLeftGutter, kTopMargin, linearLabel.frame.size.width, |
| linearLabel.frame.size.height); |
| [self.scrollView addSubview:linearLabel]; |
| |
| CGRect linearViewFrame = CGRectMake(kLeftGutter, kTextOffset + kTopMargin, |
| kAnimationCircleSize.width, kAnimationCircleSize.height); |
| self.linearView = [[UIView alloc] initWithFrame:linearViewFrame]; |
| self.linearView.backgroundColor = [AnimationTimingExampleViewController defaultColors][0]; |
| self.linearView.layer.cornerRadius = kAnimationCircleSize.width / 2; |
| [self.scrollView addSubview:self.linearView]; |
| |
| UILabel *materialEaseInOutLabel = [AnimationTimingExampleViewController |
| curveLabelWithTitle:@"MDCAnimationTimingFunctionStandard"]; |
| materialEaseInOutLabel.frame = |
| CGRectMake(kLeftGutter, lineSpace, materialEaseInOutLabel.frame.size.width, |
| materialEaseInOutLabel.frame.size.height); |
| [self.scrollView addSubview:materialEaseInOutLabel]; |
| |
| CGRect materialEaseInOutViewFrame = |
| CGRectMake(kLeftGutter, lineSpace + kTextOffset, kAnimationCircleSize.width, |
| kAnimationCircleSize.height); |
| self.materialStandardView = [[UIView alloc] initWithFrame:materialEaseInOutViewFrame]; |
| self.materialStandardView.backgroundColor = |
| [AnimationTimingExampleViewController defaultColors][1]; |
| self.materialStandardView.layer.cornerRadius = kAnimationCircleSize.width / 2; |
| [self.scrollView addSubview:self.materialStandardView]; |
| |
| UILabel *materialEaseOutLabel = [AnimationTimingExampleViewController |
| curveLabelWithTitle:@"MDCAnimationTimingFunctionDeceleration"]; |
| materialEaseOutLabel.frame = |
| CGRectMake(kLeftGutter, lineSpace * 2, materialEaseOutLabel.frame.size.width, |
| materialEaseOutLabel.frame.size.height); |
| [self.scrollView addSubview:materialEaseOutLabel]; |
| |
| CGRect materialDecelerationViewFrame = |
| CGRectMake(kLeftGutter, lineSpace * 2 + kTextOffset, kAnimationCircleSize.width, |
| kAnimationCircleSize.height); |
| self.materialDecelerationView = [[UIView alloc] initWithFrame:materialDecelerationViewFrame]; |
| self.materialDecelerationView.backgroundColor = |
| [AnimationTimingExampleViewController defaultColors][2]; |
| self.materialDecelerationView.layer.cornerRadius = kAnimationCircleSize.width / 2; |
| [self.scrollView addSubview:self.materialDecelerationView]; |
| |
| UILabel *materialEaseInLabel = [AnimationTimingExampleViewController |
| curveLabelWithTitle:@"MDCAnimationTimingFunctionAcceleration"]; |
| materialEaseInLabel.frame = |
| CGRectMake(kLeftGutter, lineSpace * 3, materialEaseInLabel.frame.size.width, |
| materialEaseInLabel.frame.size.height); |
| [self.scrollView addSubview:materialEaseInLabel]; |
| |
| CGRect materialAccelerationViewFrame = |
| CGRectMake(kLeftGutter, lineSpace * 3 + kTextOffset, kAnimationCircleSize.width, |
| kAnimationCircleSize.height); |
| self.materialAccelerationView = [[UIView alloc] initWithFrame:materialAccelerationViewFrame]; |
| self.materialAccelerationView.backgroundColor = |
| [AnimationTimingExampleViewController defaultColors][3]; |
| self.materialAccelerationView.layer.cornerRadius = kAnimationCircleSize.width / 2; |
| [self.scrollView addSubview:self.materialAccelerationView]; |
| |
| UILabel *materialSharpLabel = |
| [AnimationTimingExampleViewController curveLabelWithTitle:@"MDCAnimationTimingFunctionSharp"]; |
| materialSharpLabel.frame = |
| CGRectMake(kLeftGutter, lineSpace * 4, CGRectGetWidth(materialSharpLabel.frame), |
| CGRectGetHeight(materialSharpLabel.frame)); |
| [self.scrollView addSubview:materialSharpLabel]; |
| |
| CGRect materialSharpViewFrame = |
| CGRectMake(kLeftGutter, lineSpace * 4 + kTextOffset, kAnimationCircleSize.width, |
| kAnimationCircleSize.height); |
| self.materialSharpView = [[UIView alloc] initWithFrame:materialSharpViewFrame]; |
| self.materialSharpView.backgroundColor = [AnimationTimingExampleViewController defaultColors][4]; |
| self.materialSharpView.layer.cornerRadius = kAnimationCircleSize.width / 2; |
| [self.scrollView addSubview:self.materialSharpView]; |
| } |
| |
| + (UILabel *)curveLabelWithTitle:(NSString *)text { |
| UILabel *label = [[UILabel alloc] initWithFrame:CGRectZero]; |
| label.font = [MDCTypography captionFont]; |
| label.textColor = [UIColor colorWithWhite:0 alpha:[MDCTypography body2FontOpacity]]; |
| label.text = text; |
| [label sizeToFit]; |
| return label; |
| } |
| |
| + (NSArray<UIColor *> *)defaultColors { |
| static NSArray *defaultColors; |
| static dispatch_once_t onceToken; |
| dispatch_once(&onceToken, ^{ |
| UIColor *primaryColor = [UIColor darkGrayColor]; |
| defaultColors = @[ |
| [primaryColor colorWithAlphaComponent:(CGFloat)0.95], |
| [primaryColor colorWithAlphaComponent:(CGFloat)0.90], |
| [primaryColor colorWithAlphaComponent:(CGFloat)0.85], |
| [primaryColor colorWithAlphaComponent:(CGFloat)0.80], |
| [primaryColor colorWithAlphaComponent:(CGFloat)0.75] |
| ]; |
| }); |
| return defaultColors; |
| } |
| |
| @end |