From cf183c788fba2fef2e144674d412da67d5adc438 Mon Sep 17 00:00:00 2001 From: Jeff Verkoeyen Date: Thu, 14 Dec 2017 10:32:34 -0500 Subject: [PATCH] Add banner and drop most of the preamble docs in preparation for the new readme. --- README.md | 86 +-------------------------------- img/motion-animator-banner.gif | Bin 0 -> 16804 bytes 2 files changed, 2 insertions(+), 84 deletions(-) create mode 100644 img/motion-animator-banner.gif diff --git a/README.md b/README.md index 2c1c480..096bc59 100644 --- a/README.md +++ b/README.md @@ -1,95 +1,13 @@ -# Motion Animator +![Motion Interchange Banner](img/motion-interchange-banner.gif) -> A Motion Animator creates performant, interruptible animations from motion specs. +> An iOS animator that combines the best aspects of the UIView and CALayer animation APIs. [![Build Status](https://travis-ci.org/material-motion/motion-animator-objc.svg?branch=develop)](https://travis-ci.org/material-motion/motion-animator-objc) [![codecov](https://codecov.io/gh/material-motion/motion-animator-objc/branch/develop/graph/badge.svg)](https://codecov.io/gh/material-motion/motion-animator-objc) [![CocoaPods Compatible](https://img.shields.io/cocoapods/v/MotionAnimator.svg)](https://cocoapods.org/pods/MotionAnimator) [![Platform](https://img.shields.io/cocoapods/p/MotionAnimator.svg)](http://cocoadocs.org/docsets/MotionAnimator) ---- -This library provides APIs that turn [Motion Interchange](https://github.com/material-motion/motion-interchange-objc) -**motion specifications** into animations. - ---- - -#### What is a motion specification? - -A **motion specification** defines the delay, duration, and acceleration of animations in a simple -data format that can live separate from your animation logic. - -For example, let's say we wanted to describe the motion for this animation: - - - -We might create a specification like so: - -```objc -struct CalendarChipTiming { - MDMMotionTiming chipWidth; - MDMMotionTiming chipHeight; - MDMMotionTiming chipY; - - MDMMotionTiming chipContentOpacity; - MDMMotionTiming headerContentOpacity; - - MDMMotionTiming navigationBarY; -}; -typedef struct CalendarChipTiming CalendarChipTiming; - -struct CalendarChipMotionSpec { - CalendarChipTiming expansion; - CalendarChipTiming collapse; -}; -typedef struct CalendarChipMotionSpec CalendarChipMotionSpec; - -FOUNDATION_EXTERN struct CalendarChipMotionSpec CalendarChipSpec; -``` - -With our implementation of the spec looking like so: - -```objc -struct CalendarChipMotionSpec CalendarChipSpec = { - .expansion = { - .chipWidth = { - .delay = 0.000, .duration = 0.285, .curve = MDMEightyForty, - }, - .chipHeight = { - .delay = 0.015, .duration = 0.360, .curve = MDMEightyForty, - }, - ... - }, - .collapse = { - .chipWidth = { - .delay = 0.045, .duration = 0.330, .curve = MDMEightyForty, - }, - .chipHeight = { - .delay = 0.000, .duration = 0.330, .curve = MDMEightyForty, - }, - ... - }, -}; -``` - -Our spec defines two different transition states: expansion and collapse. At runtime, we determine -which of these two specs we need and then use the timings to animate our views with an instance of -`MDMMotionAnimator`: - -```objc -CalendarChipTiming timing = _expanded ? CalendarChipSpec.expansion : CalendarChipSpec.collapse; - -MDMMotionAnimator *animator = [[MDMMotionAnimator alloc] init]; -animator.shouldReverseValues = !_expanded; - -[animator animateWithTiming:timing.chipHeight - toLayer:chipView.layer - withValues:@[ @(chipFrame.size.height), @(headerFrame.size.height) ] - keyPath:MDMKeyPathHeight]; -... -``` - -A working implementation of this example can be seen in the included example app. ## Example apps/unit tests diff --git a/img/motion-animator-banner.gif b/img/motion-animator-banner.gif new file mode 100644 index 0000000000000000000000000000000000000000..5728afa2bcb12932218fc6782e64388fd7d1f9ce GIT binary patch literal 16804 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 Cbk~sp literal 0 HcmV?d00001