// 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 *)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