SVGAContentLayer.m 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. //
  2. // SVGAContentLayer.m
  3. // SVGAPlayer
  4. //
  5. // Created by 崔明辉 on 2017/2/22.
  6. // Copyright © 2017年 UED Center. All rights reserved.
  7. //
  8. #import "SVGAContentLayer.h"
  9. #import "SVGABitmapLayer.h"
  10. #import "SVGAVectorLayer.h"
  11. #import "SVGAVideoSpriteFrameEntity.h"
  12. @interface SVGAContentLayer ()
  13. @property (nonatomic, strong) NSArray<SVGAVideoSpriteFrameEntity *> *frames;
  14. @property (nonatomic, assign) NSTextAlignment textLayerAlignment;
  15. @end
  16. @implementation SVGAContentLayer
  17. - (instancetype)initWithFrames:(NSArray *)frames {
  18. self = [super init];
  19. if (self) {
  20. self.backgroundColor = [UIColor clearColor].CGColor;
  21. self.masksToBounds = NO;
  22. _frames = frames;
  23. _textLayerAlignment = NSTextAlignmentCenter;
  24. [self stepToFrame:0];
  25. }
  26. return self;
  27. }
  28. - (void)stepToFrame:(NSInteger)frame {
  29. if (self.dynamicHidden) {
  30. return;
  31. }
  32. if (frame < self.frames.count) {
  33. SVGAVideoSpriteFrameEntity *frameItem = self.frames[frame];
  34. if (frameItem.alpha > 0.0) {
  35. self.hidden = NO;
  36. self.opacity = frameItem.alpha;
  37. CGFloat nx = frameItem.nx;
  38. CGFloat ny = frameItem.ny;
  39. self.position = CGPointMake(0, 0);
  40. self.transform = CATransform3DIdentity;
  41. self.frame = frameItem.layout;
  42. self.transform = CATransform3DMakeAffineTransform(frameItem.transform);
  43. CGFloat offsetX = self.frame.origin.x - nx;
  44. CGFloat offsetY = self.frame.origin.y - ny;
  45. self.position = CGPointMake(self.position.x - offsetX, self.position.y - offsetY);
  46. if (frameItem.maskLayer != nil) {
  47. if ([frameItem.maskLayer isKindOfClass:[CAShapeLayer class]]) {
  48. CAShapeLayer *cloneShapeLayer = [CAShapeLayer layer];
  49. cloneShapeLayer.path = [(CAShapeLayer *)frameItem.maskLayer path];
  50. cloneShapeLayer.fillColor = [(CAShapeLayer *)frameItem.maskLayer fillColor];
  51. self.mask = cloneShapeLayer;
  52. }
  53. }
  54. else {
  55. self.mask = nil;
  56. }
  57. [self.bitmapLayer stepToFrame:frame];
  58. [self.vectorLayer stepToFrame:frame];
  59. }
  60. else {
  61. self.hidden = YES;
  62. }
  63. if (self.dynamicDrawingBlock) {
  64. self.dynamicDrawingBlock(self, frame);
  65. }
  66. }
  67. }
  68. - (void)setFrame:(CGRect)frame {
  69. [super setFrame:frame];
  70. self.bitmapLayer.frame = self.bounds;
  71. self.vectorLayer.frame = self.bounds;
  72. for (CALayer *sublayer in self.sublayers) {
  73. if ([sublayer isKindOfClass:[CATextLayer class]]) {
  74. CGRect frame = sublayer.frame;
  75. switch (self.textLayerAlignment) {
  76. case NSTextAlignmentLeft:
  77. frame.origin.x = 0.0;
  78. break;
  79. case NSTextAlignmentCenter:
  80. frame.origin.x = (self.frame.size.width - sublayer.frame.size.width) / 2.0;
  81. break;
  82. case NSTextAlignmentRight:
  83. frame.origin.x = self.frame.size.width - sublayer.frame.size.width;
  84. break;
  85. default:
  86. frame.origin.x = (self.frame.size.width - sublayer.frame.size.width) / 2.0;
  87. break;
  88. }
  89. frame.origin.y = (self.frame.size.height - sublayer.frame.size.height) / 2.0;
  90. sublayer.frame = frame;
  91. }
  92. }
  93. }
  94. - (void)setBitmapLayer:(SVGABitmapLayer *)bitmapLayer {
  95. [_bitmapLayer removeFromSuperlayer];
  96. _bitmapLayer = bitmapLayer;
  97. [self addSublayer:bitmapLayer];
  98. }
  99. - (void)setVectorLayer:(SVGAVectorLayer *)vectorLayer {
  100. [_vectorLayer removeFromSuperlayer];
  101. _vectorLayer = vectorLayer;
  102. [self addSublayer:vectorLayer];
  103. }
  104. - (void)setDynamicHidden:(BOOL)dynamicHidden {
  105. _dynamicHidden = dynamicHidden;
  106. self.hidden = dynamicHidden;
  107. }
  108. - (void)resetTextLayerProperties:(NSAttributedString *)attributedString {
  109. NSDictionary *textAttrs = (id)[attributedString attributesAtIndex:0 effectiveRange:nil];
  110. NSParagraphStyle *paragraphStyle = textAttrs[NSParagraphStyleAttributeName];
  111. if (paragraphStyle == nil) {
  112. return;
  113. }
  114. if (paragraphStyle.lineBreakMode == NSLineBreakByTruncatingTail) {
  115. self.textLayer.truncationMode = kCATruncationEnd;
  116. [self.textLayer setWrapped:NO];
  117. }
  118. else if (paragraphStyle.lineBreakMode == NSLineBreakByTruncatingMiddle) {
  119. self.textLayer.truncationMode = kCATruncationMiddle;
  120. [self.textLayer setWrapped:NO];
  121. }
  122. else if (paragraphStyle.lineBreakMode == NSLineBreakByTruncatingHead) {
  123. self.textLayer.truncationMode = kCATruncationStart;
  124. [self.textLayer setWrapped:NO];
  125. }
  126. else {
  127. self.textLayer.truncationMode = kCATruncationNone;
  128. [self.textLayer setWrapped:YES];
  129. }
  130. if (paragraphStyle.alignment == NSTextAlignmentNatural) {
  131. self.textLayerAlignment = NSTextAlignmentCenter;
  132. }
  133. else {
  134. self.textLayerAlignment = paragraphStyle.alignment;
  135. }
  136. }
  137. @end