Files
featherVoice/Pods/SVGAPlayer/Source/SVGAContentLayer.m
2025-08-08 10:49:36 +08:00

151 lines
5.0 KiB
Objective-C

//
// SVGAContentLayer.m
// SVGAPlayer
//
// Created by 崔明辉 on 2017/2/22.
// Copyright © 2017年 UED Center. All rights reserved.
//
#import "SVGAContentLayer.h"
#import "SVGABitmapLayer.h"
#import "SVGAVectorLayer.h"
#import "SVGAVideoSpriteFrameEntity.h"
@interface SVGAContentLayer ()
@property (nonatomic, strong) NSArray<SVGAVideoSpriteFrameEntity *> *frames;
@property (nonatomic, assign) NSTextAlignment textLayerAlignment;
@end
@implementation SVGAContentLayer
- (instancetype)initWithFrames:(NSArray *)frames {
self = [super init];
if (self) {
self.backgroundColor = [UIColor clearColor].CGColor;
self.masksToBounds = NO;
_frames = frames;
_textLayerAlignment = NSTextAlignmentCenter;
[self stepToFrame:0];
}
return self;
}
- (void)stepToFrame:(NSInteger)frame {
if (self.dynamicHidden) {
return;
}
if (frame < self.frames.count) {
SVGAVideoSpriteFrameEntity *frameItem = self.frames[frame];
if (frameItem.alpha > 0.0) {
self.hidden = NO;
self.opacity = frameItem.alpha;
CGFloat nx = frameItem.nx;
CGFloat ny = frameItem.ny;
self.position = CGPointMake(0, 0);
self.transform = CATransform3DIdentity;
self.frame = frameItem.layout;
self.transform = CATransform3DMakeAffineTransform(frameItem.transform);
CGFloat offsetX = self.frame.origin.x - nx;
CGFloat offsetY = self.frame.origin.y - ny;
self.position = CGPointMake(self.position.x - offsetX, self.position.y - offsetY);
if (frameItem.maskLayer != nil) {
if ([frameItem.maskLayer isKindOfClass:[CAShapeLayer class]]) {
CAShapeLayer *cloneShapeLayer = [CAShapeLayer layer];
cloneShapeLayer.path = [(CAShapeLayer *)frameItem.maskLayer path];
cloneShapeLayer.fillColor = [(CAShapeLayer *)frameItem.maskLayer fillColor];
self.mask = cloneShapeLayer;
}
}
else {
self.mask = nil;
}
[self.bitmapLayer stepToFrame:frame];
[self.vectorLayer stepToFrame:frame];
}
else {
self.hidden = YES;
}
if (self.dynamicDrawingBlock) {
self.dynamicDrawingBlock(self, frame);
}
}
}
- (void)setFrame:(CGRect)frame {
[super setFrame:frame];
self.bitmapLayer.frame = self.bounds;
self.vectorLayer.frame = self.bounds;
for (CALayer *sublayer in self.sublayers) {
if ([sublayer isKindOfClass:[CATextLayer class]]) {
CGRect frame = sublayer.frame;
switch (self.textLayerAlignment) {
case NSTextAlignmentLeft:
frame.origin.x = 0.0;
break;
case NSTextAlignmentCenter:
frame.origin.x = (self.frame.size.width - sublayer.frame.size.width) / 2.0;
break;
case NSTextAlignmentRight:
frame.origin.x = self.frame.size.width - sublayer.frame.size.width;
break;
default:
frame.origin.x = (self.frame.size.width - sublayer.frame.size.width) / 2.0;
break;
}
frame.origin.y = (self.frame.size.height - sublayer.frame.size.height) / 2.0;
sublayer.frame = frame;
}
}
}
- (void)setBitmapLayer:(SVGABitmapLayer *)bitmapLayer {
[_bitmapLayer removeFromSuperlayer];
_bitmapLayer = bitmapLayer;
[self addSublayer:bitmapLayer];
}
- (void)setVectorLayer:(SVGAVectorLayer *)vectorLayer {
[_vectorLayer removeFromSuperlayer];
_vectorLayer = vectorLayer;
[self addSublayer:vectorLayer];
}
- (void)setDynamicHidden:(BOOL)dynamicHidden {
_dynamicHidden = dynamicHidden;
self.hidden = dynamicHidden;
}
- (void)resetTextLayerProperties:(NSAttributedString *)attributedString {
NSDictionary *textAttrs = (id)[attributedString attributesAtIndex:0 effectiveRange:nil];
NSParagraphStyle *paragraphStyle = textAttrs[NSParagraphStyleAttributeName];
if (paragraphStyle == nil) {
return;
}
if (paragraphStyle.lineBreakMode == NSLineBreakByTruncatingTail) {
self.textLayer.truncationMode = kCATruncationEnd;
[self.textLayer setWrapped:NO];
}
else if (paragraphStyle.lineBreakMode == NSLineBreakByTruncatingMiddle) {
self.textLayer.truncationMode = kCATruncationMiddle;
[self.textLayer setWrapped:NO];
}
else if (paragraphStyle.lineBreakMode == NSLineBreakByTruncatingHead) {
self.textLayer.truncationMode = kCATruncationStart;
[self.textLayer setWrapped:NO];
}
else {
self.textLayer.truncationMode = kCATruncationNone;
[self.textLayer setWrapped:YES];
}
if (paragraphStyle.alignment == NSTextAlignmentNatural) {
self.textLayerAlignment = NSTextAlignmentCenter;
}
else {
self.textLayerAlignment = paragraphStyle.alignment;
}
}
@end