From aa17a9dede51403676dcafcf4ef739d85f482c44 Mon Sep 17 00:00:00 2001 From: Brandon Withrow Date: Fri, 22 Jul 2016 16:06:51 -0700 Subject: [PATCH] Added time progress, started building masks --- LotteAnimator.xcodeproj/project.pbxproj | 6 ++ .../UserInterfaceState.xcuserstate | Bin 57022 -> 58046 bytes .../xcdebugger/Breakpoints_v2.xcbkptlist | 84 +++++++++--------- .../CAAnimationGroup+LAAnimatableGroup.m | 10 +-- LotteAnimator/LAAnimatableLayer.h | 3 + LotteAnimator/LAAnimatableLayer.m | 23 ++--- LotteAnimator/LACompView.m | 20 +++-- LotteAnimator/LAGroupLayerView.h | 5 +- LotteAnimator/LAGroupLayerView.m | 14 +-- LotteAnimator/LALayer.h | 2 + LotteAnimator/LALayer.m | 10 +-- LotteAnimator/LALayerView.m | 34 ++++--- LotteAnimator/LAMaskLayer.h | 18 ++++ LotteAnimator/LAMaskLayer.m | 29 ++++++ LotteAnimator/LARectShapeLayer.h | 6 +- LotteAnimator/LARectShapeLayer.m | 34 ++++++- LotteAnimator/LAShapeLayerView.h | 3 +- LotteAnimator/LAShapeLayerView.m | 5 +- LotteAnimator/ViewController.m | 4 +- 19 files changed, 203 insertions(+), 107 deletions(-) create mode 100644 LotteAnimator/LAMaskLayer.h create mode 100644 LotteAnimator/LAMaskLayer.m diff --git a/LotteAnimator.xcodeproj/project.pbxproj b/LotteAnimator.xcodeproj/project.pbxproj index 226c611970..8d38e15d72 100644 --- a/LotteAnimator.xcodeproj/project.pbxproj +++ b/LotteAnimator.xcodeproj/project.pbxproj @@ -85,6 +85,7 @@ 62FE40EC1D402C0200CA389D /* parentTest.json in Resources */ = {isa = PBXBuildFile; fileRef = 62FE40EB1D402C0200CA389D /* parentTest.json */; }; 62FE41161D41526D00CA389D /* InOutAnimation.json in Resources */ = {isa = PBXBuildFile; fileRef = 62FE41151D41526D00CA389D /* InOutAnimation.json */; }; 62FE41431D41862200CA389D /* LAAnimatableLayer.m in Sources */ = {isa = PBXBuildFile; fileRef = 62FE41421D41862200CA389D /* LAAnimatableLayer.m */; }; + 62FE41BC1D42DD8500CA389D /* LAMaskLayer.m in Sources */ = {isa = PBXBuildFile; fileRef = 62FE41BB1D42DD8500CA389D /* LAMaskLayer.m */; }; F5B4E946F7B28B4594824641 /* libPods-LotteAnimator.a in Frameworks */ = {isa = PBXBuildFile; fileRef = BC68632413866F85CEACB7EA /* libPods-LotteAnimator.a */; }; /* End PBXBuildFile section */ @@ -203,6 +204,8 @@ 62FE41151D41526D00CA389D /* InOutAnimation.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = InOutAnimation.json; sourceTree = ""; }; 62FE41411D41862200CA389D /* LAAnimatableLayer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LAAnimatableLayer.h; sourceTree = ""; }; 62FE41421D41862200CA389D /* LAAnimatableLayer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LAAnimatableLayer.m; sourceTree = ""; }; + 62FE41BA1D42DD8500CA389D /* LAMaskLayer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = LAMaskLayer.h; sourceTree = ""; }; + 62FE41BB1D42DD8500CA389D /* LAMaskLayer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = LAMaskLayer.m; sourceTree = ""; }; AEE1A33E4CE2F6024DE7793E /* Pods-LotteAnimator.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-LotteAnimator.debug.xcconfig"; path = "Pods/Target Support Files/Pods-LotteAnimator/Pods-LotteAnimator.debug.xcconfig"; sourceTree = ""; }; BC68632413866F85CEACB7EA /* libPods-LotteAnimator.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-LotteAnimator.a"; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXFileReference section */ @@ -258,6 +261,8 @@ 62FE41421D41862200CA389D /* LAAnimatableLayer.m */, 4804B32A1C1F835F00DA8AF7 /* LALayerView.h */, 4804B32B1C1F835F00DA8AF7 /* LALayerView.m */, + 62FE41BA1D42DD8500CA389D /* LAMaskLayer.h */, + 62FE41BB1D42DD8500CA389D /* LAMaskLayer.m */, 620CD7E31D38180800055AD1 /* LAGroupLayerView.h */, 620CD7E41D38180800055AD1 /* LAGroupLayerView.m */, 486BE04C1D36F1BE00CD14A0 /* LAShapeLayerView.h */, @@ -608,6 +613,7 @@ 620CD7CD1D3415F000055AD1 /* LAAnimatableRectValue.m in Sources */, 620A565C1D1C81610030EBFB /* LAAnimatableColorValue.m in Sources */, 48372A5E1C209A8900AD0293 /* LAShapeTransform.m in Sources */, + 62FE41BC1D42DD8500CA389D /* LAMaskLayer.m in Sources */, 620CD7D01D343A2500055AD1 /* LAAnimatableScaleValue.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; diff --git a/LotteAnimator.xcworkspace/xcuserdata/brandon_withrow.xcuserdatad/UserInterfaceState.xcuserstate b/LotteAnimator.xcworkspace/xcuserdata/brandon_withrow.xcuserdatad/UserInterfaceState.xcuserstate index 98132bb68dec5528df5bd4f89140a0ec535aab04..a5086395d7b087afed0688fec7cabdb081352373 100644 GIT binary patch literal 58046 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 literal 57022 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 MO#j#azwX-fKk|@!MgRZ+ diff --git a/LotteAnimator.xcworkspace/xcuserdata/brandon_withrow.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist b/LotteAnimator.xcworkspace/xcuserdata/brandon_withrow.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist index 095166b5a1..453d7341b4 100644 --- a/LotteAnimator.xcworkspace/xcuserdata/brandon_withrow.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist +++ b/LotteAnimator.xcworkspace/xcuserdata/brandon_withrow.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist @@ -45,22 +45,6 @@ landmarkType = "5"> - - - - - - - - @@ -147,13 +115,45 @@ shouldBeEnabled = "Yes" ignoreCount = "0" continueAfterRunningActions = "No" - filePath = "LotteAnimator/LAAnimatableLayer.m" - timestampString = "490837507.04002" + filePath = "LotteAnimator/LALayerView.m" + timestampString = "490921111.145475" startingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807" - startingLineNumber = "48" - endingLineNumber = "48" - landmarkName = "-setAnimationProgress:" + startingLineNumber = "128" + endingLineNumber = "128" + landmarkName = "-_setupViewFromModel" + landmarkType = "5"> + + + + + + + + diff --git a/LotteAnimator/CAAnimationGroup+LAAnimatableGroup.m b/LotteAnimator/CAAnimationGroup+LAAnimatableGroup.m index 52277afd2c..62f4a1f17e 100644 --- a/LotteAnimator/CAAnimationGroup+LAAnimatableGroup.m +++ b/LotteAnimator/CAAnimationGroup+LAAnimatableGroup.m @@ -10,17 +10,17 @@ @implementation CAAnimationGroup (LAAnimatableGroup) -+ (nullable CAAnimationGroup *)animationGroupForAnimatablePropertiesWithKeyPaths:(nonnull NSDictionary> *)properties; { ++ (nullable CAAnimationGroup *)animationGroupForAnimatablePropertiesWithKeyPaths:(nonnull NSDictionary> *)properties { NSMutableArray *animations = [NSMutableArray array]; - NSTimeInterval duration = 0; + NSTimeInterval animduration = 0; for (NSString *keyPath in properties.allKeys) { id property = properties[keyPath]; if ([property hasAnimation]) { CAKeyframeAnimation *animation = [property animationForKeyPath:keyPath]; [animations addObject:animation]; - if (animation.duration + animation.beginTime > duration) { - duration = animation.duration + animation.beginTime; + if (animation.duration + animation.beginTime > animduration) { + animduration = animation.duration + animation.beginTime; } } } @@ -28,7 +28,7 @@ if (animations.count) { CAAnimationGroup *animation = [CAAnimationGroup new]; animation.animations = animations; - animation.duration = duration; + animation.duration = animduration; animation.fillMode = kCAFillModeForwards; animation.removedOnCompletion = NO; return animation; diff --git a/LotteAnimator/LAAnimatableLayer.h b/LotteAnimator/LAAnimatableLayer.h index 0a9db53ed1..437d5f29a2 100644 --- a/LotteAnimator/LAAnimatableLayer.h +++ b/LotteAnimator/LAAnimatableLayer.h @@ -10,8 +10,11 @@ @interface LAAnimatableLayer : CALayer +- (instancetype)initWithDuration:(NSTimeInterval)duration NS_DESIGNATED_INITIALIZER; + @property (nonatomic, strong) NSArray *animationSublayers; @property (nonatomic, strong) NSArray *childLayers; +@property (nonatomic, readonly) NSTimeInterval laAnimationDuration; @property (nonatomic, assign) BOOL loopAnimation; @property (nonatomic, assign) BOOL autoReverseAnimation; diff --git a/LotteAnimator/LAAnimatableLayer.m b/LotteAnimator/LAAnimatableLayer.m index 1f5cc86e41..08c12c777f 100644 --- a/LotteAnimator/LAAnimatableLayer.m +++ b/LotteAnimator/LAAnimatableLayer.m @@ -10,6 +10,14 @@ @implementation LAAnimatableLayer +- (instancetype)initWithDuration:(NSTimeInterval)duration { + self = [super init]; + if (self) { + _laAnimationDuration = duration; + } + return self; +} + - (void)play { [self _resumeLayer:self]; for (CALayer *layer in self.animationSublayers) { @@ -44,18 +52,18 @@ } - (void)setAnimationProgress:(CGFloat)animationProgress { - self.speed = 0.0; + self.speed = 0; self.timeOffset = 0.0; self.beginTime = 0.0; self.beginTime = [self convertTime:CACurrentMediaTime() fromLayer:nil]; - self.timeOffset = [self convertTime:CACurrentMediaTime() fromLayer:nil] + animationProgress; + self.timeOffset = animationProgress * self.laAnimationDuration; for (CALayer *layer in self.animationSublayers) { - layer.speed = 0.0; + layer.speed = 0; layer.timeOffset = 0.0; layer.beginTime = 0.0; layer.beginTime = [layer convertTime:CACurrentMediaTime() fromLayer:nil]; - layer.timeOffset = [layer convertTime:CACurrentMediaTime() fromLayer:nil] + animationProgress; + layer.timeOffset = animationProgress * self.laAnimationDuration; } for (LAAnimatableLayer *layer in self.childLayers) { @@ -76,18 +84,13 @@ } -(void)_pauseLayer:(CALayer*)layer { - CFTimeInterval pausedTime = [layer convertTime:CACurrentMediaTime() fromLayer:nil]; layer.speed = 0.0; - layer.timeOffset = pausedTime; } -(void)_resumeLayer:(CALayer*)layer { - CFTimeInterval pausedTime = [layer timeOffset]; layer.speed = 1.0; layer.timeOffset = 0.0; - layer.beginTime = 0.0; - CFTimeInterval timeSincePause = [layer convertTime:CACurrentMediaTime() fromLayer:nil] - pausedTime; - layer.beginTime = timeSincePause; + layer.beginTime = [layer convertTime:CACurrentMediaTime() fromLayer:nil]; } diff --git a/LotteAnimator/LACompView.m b/LotteAnimator/LACompView.m index 08f7e2e978..451393b53d 100644 --- a/LotteAnimator/LACompView.m +++ b/LotteAnimator/LACompView.m @@ -43,12 +43,6 @@ - (void)setDebugModeOn:(BOOL)debugModeOn { _debugModeOn = debugModeOn; - for (LALayerView *child in _layerMap.allValues) { - if ([child isKindOfClass:[LALayerView class]]) { - [child setDebugModeOn:debugModeOn]; - child.opacity = debugModeOn ? 0.5 : 1; - } - } } - (void)play { @@ -66,10 +60,24 @@ } - (void)setAnimationProgress:(CGFloat)animationProgress { + _animationProgress = animationProgress; for (LALayerView *layerView in _layerMap.allValues) { [layerView setAnimationProgress:animationProgress]; } } +- (void)setLoopAnimation:(BOOL)loopAnimation { + _loopAnimation = loopAnimation; + for (LALayerView *layerView in _layerMap.allValues) { + [layerView setLoopAnimation:loopAnimation]; + } +} + +- (void)setAutoReverseAnimation:(BOOL)autoReverseAnimation { + _autoReverseAnimation = autoReverseAnimation; + for (LALayerView *layerView in _layerMap.allValues) { + [layerView setAutoReverseAnimation:autoReverseAnimation]; + } +} @end diff --git a/LotteAnimator/LAGroupLayerView.h b/LotteAnimator/LAGroupLayerView.h index bbb5398d38..a47d95cd79 100644 --- a/LotteAnimator/LAGroupLayerView.h +++ b/LotteAnimator/LAGroupLayerView.h @@ -15,12 +15,11 @@ @interface LAGroupLayerView : LAAnimatableLayer - (instancetype)initWithShapeGroup:(LAShapeGroup *)shapeGroup - transform:(LAShapeTransform *)transform; + transform:(LAShapeTransform *)transform + withDuration:(NSTimeInterval)duration; @property (nonatomic, readonly) LAShapeGroup *shapeGroup; @property (nonatomic, readonly) LAShapeTransform *shapeTransform; @property (nonatomic, assign) BOOL debugModeOn; -- (void)startAnimation; - @end diff --git a/LotteAnimator/LAGroupLayerView.m b/LotteAnimator/LAGroupLayerView.m index 7a5c7d36aa..5485d45f19 100644 --- a/LotteAnimator/LAGroupLayerView.m +++ b/LotteAnimator/LAGroupLayerView.m @@ -18,8 +18,9 @@ } - (instancetype)initWithShapeGroup:(LAShapeGroup *)shapeGroup - transform:(LAShapeTransform *)transform { - self = [super init]; + transform:(LAShapeTransform *)transform + withDuration:(NSTimeInterval)duration { + self = [super initWithDuration:duration]; if (self) { _shapeGroup = shapeGroup; _shapeTransform = transform; @@ -60,7 +61,8 @@ LAShapeLayerView *shapeLayer = [[LAShapeLayerView alloc] initWithShape:shapePath fill:currentFill stroke:currentStroke - transform:currentTransform]; + transform:currentTransform + withDuration:self.laAnimationDuration]; [shapeLayers addObject:shapeLayer]; [self addSublayer:shapeLayer]; } else if ([item isKindOfClass:[LAShapeRectangle class]]) { @@ -68,13 +70,15 @@ LARectShapeLayer *shapeLayer = [[LARectShapeLayer alloc] initWithRectShape:shapeRect fill:currentFill stroke:currentStroke - transform:currentTransform]; + transform:currentTransform + withDuration:self.laAnimationDuration]; [shapeLayers addObject:shapeLayer]; [self addSublayer:shapeLayer]; } else if ([item isKindOfClass:[LAShapeGroup class]]) { LAShapeGroup *shapeGroup = (LAShapeGroup *)item; LAGroupLayerView *groupLayer = [[LAGroupLayerView alloc] initWithShapeGroup:shapeGroup - transform:currentTransform]; + transform:currentTransform + withDuration:self.laAnimationDuration]; [groupLayers addObject:groupLayer]; [self addSublayer:groupLayer]; } diff --git a/LotteAnimator/LALayer.h b/LotteAnimator/LALayer.h index b77efd9112..ce5e1cfebe 100644 --- a/LotteAnimator/LALayer.h +++ b/LotteAnimator/LALayer.h @@ -52,6 +52,8 @@ typedef enum : NSInteger { @property (nonatomic, readonly) LAAnimatablePointValue *anchor; @property (nonatomic, readonly) LAAnimatableScaleValue *scale; +@property (nonatomic, readonly) BOOL hasOutAnimation; +@property (nonatomic, readonly) BOOL hasInAnimation; @property (nonatomic, readonly) BOOL hasInOutAnimation; @property (nonatomic, readonly) NSArray *inOutKeyframes; @property (nonatomic, readonly) NSArray *inOutKeyTimes; diff --git a/LotteAnimator/LALayer.m b/LotteAnimator/LALayer.m index 078e534bc6..3ec1c1d0fe 100644 --- a/LotteAnimator/LALayer.m +++ b/LotteAnimator/LALayer.m @@ -92,15 +92,15 @@ } _shapes = shapes; - BOOL hasInAnmation = (_inFrame.integerValue > composition.startFrame.integerValue); - BOOL hasOutAnimation = (_outFrame.integerValue < composition.endFrame.integerValue); - _hasInOutAnimation = hasInAnmation || hasOutAnimation; + _hasInAnimation = (_inFrame.integerValue > composition.startFrame.integerValue); + _hasOutAnimation = (_outFrame.integerValue < composition.endFrame.integerValue); + _hasInOutAnimation = _hasInAnimation || _hasOutAnimation; if (_hasInOutAnimation) { NSMutableArray *keys = [NSMutableArray array]; NSMutableArray *keyTimes = [NSMutableArray array]; CGFloat compLength = composition.endFrame.floatValue - composition.startFrame.floatValue; - if (hasInAnmation) { + if (_hasInAnimation) { [keys addObject:@1]; [keyTimes addObject:@0]; [keys addObject:@0]; @@ -111,7 +111,7 @@ [keyTimes addObject:@0]; } - if (hasOutAnimation) { + if (_hasOutAnimation) { [keys addObject:@1]; CGFloat outTime = _outFrame.floatValue / compLength; [keyTimes addObject:@(outTime)]; diff --git a/LotteAnimator/LALayerView.m b/LotteAnimator/LALayerView.m index 810fa3996d..48401872b4 100644 --- a/LotteAnimator/LALayerView.m +++ b/LotteAnimator/LALayerView.m @@ -13,8 +13,7 @@ @interface LAParentLayer : LAAnimatableLayer -- (instancetype)initWithParentModel:(LALayer *)parent compBounds:(CGRect)bounds; -- (void)startAnimation; +- (instancetype)initWithParentModel:(LALayer *)parent inComposition:(LAComposition *)comp; @end @@ -23,10 +22,10 @@ CAAnimationGroup *_animation; } -- (instancetype)initWithParentModel:(LALayer *)parent compBounds:(CGRect)bounds { - self = [super init]; +- (instancetype)initWithParentModel:(LALayer *)parent inComposition:(LAComposition *)comp { + self = [super initWithDuration:comp.timeDuration]; if (self) { - self.bounds = bounds; + self.bounds = comp.compBounds; _parentModel = parent; [self _setupLayerFromModel]; } @@ -59,19 +58,22 @@ CAAnimationGroup *_animation; CAKeyframeAnimation *_inOutAnimation; NSArray *_parentLayers; + LAComposition *_composition; + } - (instancetype)initWithModel:(LALayer *)model inComposition:(LAComposition *)comp { - self = [super init]; + self = [super initWithDuration:comp.timeDuration]; if (self) { _layerModel = model; - [self _setupViewFromModelInComposition:comp]; + _composition = comp; + [self _setupViewFromModel]; } return self; } -- (void)_setupViewFromModelInComposition:(LAComposition *)comp { - self.bounds = comp.compBounds; +- (void)_setupViewFromModel { + self.bounds = _composition.compBounds; self.anchorPoint = CGPointZero; _childContainerLayer = [CALayer new]; self.animationSublayers = @[_childContainerLayer]; @@ -81,8 +83,8 @@ NSMutableArray *parentLayers = [NSMutableArray array]; if (parentID) { while (parentID != nil) { - LALayer *parentModel = [comp layerModelForID:parentID]; - LAParentLayer *parentLayer = [[LAParentLayer alloc] initWithParentModel:parentModel compBounds:comp.compBounds]; + LALayer *parentModel = [_composition layerModelForID:parentID]; + LAParentLayer *parentLayer = [[LAParentLayer alloc] initWithParentModel:parentModel inComposition:_composition]; [parentLayer addSublayer:currentChild]; [parentLayers addObject:parentLayer]; currentChild = parentLayer; @@ -99,7 +101,7 @@ _childContainerLayer.anchorPoint = _layerModel.anchor.initialPoint; _childContainerLayer.transform = _layerModel.scale.initialScale; _childContainerLayer.sublayerTransform = CATransform3DMakeRotation(_layerModel.rotation.initialValue.floatValue, 0, 0, 1); - self.hidden = _layerModel.inFrame.integerValue > comp.startFrame.integerValue; + self.hidden = _layerModel.hasInAnimation; NSArray *groupItems = _layerModel.shapes; NSArray *reversedItems = [[groupItems reverseObjectEnumerator] allObjects]; @@ -109,7 +111,7 @@ for (id item in reversedItems) { if ([item isKindOfClass:[LAShapeGroup class]]) { - LAGroupLayerView *groupLayer = [[LAGroupLayerView alloc] initWithShapeGroup:(LAShapeGroup *)item transform:currentTransform]; + LAGroupLayerView *groupLayer = [[LAGroupLayerView alloc] initWithShapeGroup:(LAShapeGroup *)item transform:currentTransform withDuration:self.laAnimationDuration]; [_childContainerLayer addSublayer:groupLayer]; [shapeLayers addObject:groupLayer]; } else if ([item isKindOfClass:[LAShapeTransform class]]) { @@ -135,7 +137,6 @@ @"transform" : _layerModel.scale, @"sublayerTransform.rotation" : _layerModel.rotation}]; - if (_animation) { [_childContainerLayer addAnimation:_animation forKey:@"lotteAnimation"]; } @@ -150,14 +151,11 @@ inOutAnimation.removedOnCompletion = NO; _inOutAnimation = inOutAnimation; + _inOutAnimation.duration = self.laAnimationDuration; [self addAnimation:_inOutAnimation forKey:@""]; } } -- (void)_viewtapped { - NSLog(@"%@", self.layerModel); -} - - (void)setDebugModeOn:(BOOL)debugModeOn { _debugModeOn = debugModeOn; self.borderColor = debugModeOn ? [UIColor redColor].CGColor : nil; diff --git a/LotteAnimator/LAMaskLayer.h b/LotteAnimator/LAMaskLayer.h new file mode 100644 index 0000000000..31a8574499 --- /dev/null +++ b/LotteAnimator/LAMaskLayer.h @@ -0,0 +1,18 @@ +// +// LAMaskLayer.h +// LotteAnimator +// +// Created by brandon_withrow on 7/22/16. +// Copyright © 2016 Brandon Withrow. All rights reserved. +// + +#import "LAAnimatableLayer.h" + +@interface LAMaskLayer : LAAnimatableLayer + +- (instancetype)initWithMasks:(NSArray *)masks inComposition:(LAComposition *)comp; + +@property (nonatomic, readonly) NSArray *masks; + + +@end diff --git a/LotteAnimator/LAMaskLayer.m b/LotteAnimator/LAMaskLayer.m new file mode 100644 index 0000000000..7597656564 --- /dev/null +++ b/LotteAnimator/LAMaskLayer.m @@ -0,0 +1,29 @@ +// +// LAMaskLayer.m +// LotteAnimator +// +// Created by brandon_withrow on 7/22/16. +// Copyright © 2016 Brandon Withrow. All rights reserved. +// + +#import "LAMaskLayer.h" + +@implementation LAMaskLayer { + LAComposition *_composition; +} + +- (instancetype)initWithMasks:(NSArray *)masks inComposition:(LAComposition *)comp { + self = [super initWithDuration:comp.timeDuration]; + if (self) { + _masks = masks; + _composition = comp; + [self _setupViewFromModel]; + } + return self; +} + +- (void)_setupViewFromModel { + +} + +@end diff --git a/LotteAnimator/LARectShapeLayer.h b/LotteAnimator/LARectShapeLayer.h index a88c95524b..7dd331635e 100644 --- a/LotteAnimator/LARectShapeLayer.h +++ b/LotteAnimator/LARectShapeLayer.h @@ -14,9 +14,7 @@ - (instancetype)initWithRectShape:(LAShapeRectangle *)rectShape fill:(LAShapeFill *)fill stroke:(LAShapeStroke *)stroke - transform:(LAShapeTransform *)transform; - -- (void)startAnimation; - + transform:(LAShapeTransform *)transform + withDuration:(NSTimeInterval)duration; @end diff --git a/LotteAnimator/LARectShapeLayer.m b/LotteAnimator/LARectShapeLayer.m index 6015f21af7..c1a7a5c7d2 100644 --- a/LotteAnimator/LARectShapeLayer.m +++ b/LotteAnimator/LARectShapeLayer.m @@ -7,6 +7,7 @@ // #import "LARectShapeLayer.h" +#import "CAAnimationGroup+LAAnimatableGroup.h" @implementation LARectShapeLayer { LAShapeTransform *_transform; @@ -25,14 +26,16 @@ - (instancetype)initWithRectShape:(LAShapeRectangle *)rectShape fill:(LAShapeFill *)fill stroke:(LAShapeStroke *)stroke - transform:(LAShapeTransform *)transform { - self = [super init]; + transform:(LAShapeTransform *)transform + withDuration:(NSTimeInterval)duration { + self = [super initWithDuration:duration]; if (self) { _rectangle = rectShape; _stroke = stroke; _fill = fill; _transform = transform; + self.allowsEdgeAntialiasing = YES; self.frame = _transform.compBounds; self.anchorPoint = _transform.anchor.initialPoint; self.opacity = _transform.opacity.initialValue.floatValue; @@ -67,11 +70,34 @@ } - (void)_buildAnimation { + if (_transform) { + _animation = [CAAnimationGroup animationGroupForAnimatablePropertiesWithKeyPaths:@{@"opacity" : _transform.opacity, + @"position" : _transform.position, + @"anchorPoint" : _transform.anchor, + @"transform" : _transform.scale, + @"sublayerTransform.rotation" : _transform.rotation}]; + [self addAnimation:_animation forKey:@"LotteAnimation"]; + } -} + if (_stroke) { + _strokeAnimation = [CAAnimationGroup animationGroupForAnimatablePropertiesWithKeyPaths:@{@"strokeColor" : _stroke.color, + @"opacity" : _stroke.opacity, + @"lineWidth" : _stroke.width, + @"bounds" : _rectangle.bounds, + @"position" : _rectangle.position, + @"cornerRadius" : _rectangle.cornerRadius}]; + [_strokeLayer addAnimation:_strokeAnimation forKey:@""]; -- (void)startAnimation { + } + if (_fill) { + _fillAnimation = [CAAnimationGroup animationGroupForAnimatablePropertiesWithKeyPaths:@{@"backgroundColor" : _fill.color, + @"opacity" : _fill.opacity, + @"bounds" : _rectangle.bounds, + @"position" : _rectangle.position, + @"cornerRadius" : _rectangle.cornerRadius}]; + [_fillLayer addAnimation:_fillAnimation forKey:@""]; + } } @end diff --git a/LotteAnimator/LAShapeLayerView.h b/LotteAnimator/LAShapeLayerView.h index b15eb26e81..0cb38abe38 100644 --- a/LotteAnimator/LAShapeLayerView.h +++ b/LotteAnimator/LAShapeLayerView.h @@ -14,7 +14,8 @@ - (instancetype)initWithShape:(LAShapePath *)shape fill:(LAShapeFill *)fill stroke:(LAShapeStroke *)stroke - transform:(LAShapeTransform *)transform; + transform:(LAShapeTransform *)transform + withDuration:(NSTimeInterval)duration; - (void)startAnimation; diff --git a/LotteAnimator/LAShapeLayerView.m b/LotteAnimator/LAShapeLayerView.m index 48fe753583..2d7ec48720 100644 --- a/LotteAnimator/LAShapeLayerView.m +++ b/LotteAnimator/LAShapeLayerView.m @@ -26,8 +26,9 @@ - (instancetype)initWithShape:(LAShapePath *)shape fill:(LAShapeFill *)fill stroke:(LAShapeStroke *)stroke - transform:(LAShapeTransform *)transform { - self = [super init]; + transform:(LAShapeTransform *)transform + withDuration:(NSTimeInterval)duration { + self = [super initWithDuration:duration]; if (self) { _path = shape; _stroke = stroke; diff --git a/LotteAnimator/ViewController.m b/LotteAnimator/ViewController.m index 56c8c7b74e..0d4d51c065 100644 --- a/LotteAnimator/ViewController.m +++ b/LotteAnimator/ViewController.m @@ -293,7 +293,7 @@ self.currentScene = laScene; self.currentSceneView = compView; [self.view sendSubviewToBack:self.currentSceneView]; - [compView performSelector:@selector(play) withObject:nil afterDelay:1]; - [compView performSelector:@selector(pause) withObject:nil afterDelay:2]; + compView.loopAnimation = YES; + [compView play]; } @end