mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-08-18 11:30:04 +00:00
129 lines
3.0 KiB
Objective-C
129 lines
3.0 KiB
Objective-C
//
|
|
// LOTAnimatedControl.m
|
|
// Lottie
|
|
//
|
|
// Created by brandon_withrow on 8/25/17.
|
|
// Copyright © 2017 Airbnb. All rights reserved.
|
|
//
|
|
|
|
#import "LOTAnimatedControl.h"
|
|
#import "LOTAnimationView_Internal.h"
|
|
|
|
@implementation LOTAnimatedControl {
|
|
UIControlState _priorState;
|
|
NSMutableDictionary *_layerMap;
|
|
}
|
|
|
|
- (instancetype)initWithFrame:(CGRect)frame {
|
|
self = [super initWithFrame:frame];
|
|
if (self) {
|
|
_animationView = [[LOTAnimationView alloc] init];
|
|
_animationView.contentMode = UIViewContentModeScaleAspectFit;
|
|
_animationView.userInteractionEnabled = NO;
|
|
[self addSubview:_animationView];
|
|
_layerMap = [NSMutableDictionary dictionary];
|
|
}
|
|
return self;
|
|
}
|
|
|
|
- (LOTComposition *)animationComp {
|
|
return _animationView.sceneModel;
|
|
}
|
|
|
|
- (void)setAnimationComp:(LOTComposition *)animationComp {
|
|
[_animationView setSceneModel:animationComp];
|
|
[self checkStateChangedAndUpdate:YES];
|
|
}
|
|
|
|
- (void)setLayerName:(NSString * _Nonnull)layerName forState:(UIControlState)state {
|
|
_layerMap[@(state)] = layerName;
|
|
[self checkStateChangedAndUpdate:YES];
|
|
}
|
|
|
|
#pragma mark - Setter Overrides
|
|
|
|
- (void)setEnabled:(BOOL)enabled {
|
|
_priorState = self.state;
|
|
[super setEnabled:enabled];
|
|
[self checkStateChangedAndUpdate:NO];
|
|
}
|
|
|
|
- (void)setSelected:(BOOL)selected {
|
|
_priorState = self.state;
|
|
[super setSelected:selected];
|
|
[self checkStateChangedAndUpdate:NO];
|
|
}
|
|
|
|
- (void)setHighlighted:(BOOL)highlighted {
|
|
_priorState = self.state;
|
|
[super setHighlighted:highlighted];
|
|
[self checkStateChangedAndUpdate:NO];
|
|
}
|
|
|
|
- (void)touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event {
|
|
_priorState = self.state;
|
|
[super touchesBegan:touches withEvent:event];
|
|
[self checkStateChangedAndUpdate:NO];
|
|
}
|
|
|
|
- (void)touchesMoved:(NSSet*)touches withEvent:(UIEvent*)event {
|
|
_priorState = self.state;
|
|
[super touchesMoved:touches withEvent:event];
|
|
[self checkStateChangedAndUpdate:NO];
|
|
}
|
|
|
|
- (void)touchesEnded:(NSSet*)touches withEvent:(UIEvent*)event {
|
|
_priorState = self.state;
|
|
[super touchesEnded:touches withEvent:event];
|
|
[self checkStateChangedAndUpdate:NO];
|
|
}
|
|
|
|
- (void)touchesCancelled:(NSSet*)touches withEvent:(UIEvent*)event {
|
|
_priorState = self.state;
|
|
[super touchesCancelled:touches withEvent:event];
|
|
[self checkStateChangedAndUpdate:NO];
|
|
}
|
|
|
|
- (CGSize)intrinsicContentSize {
|
|
return _animationView.intrinsicContentSize;
|
|
}
|
|
|
|
- (void)layoutSubviews {
|
|
[super layoutSubviews];
|
|
_animationView.frame = self.bounds;
|
|
}
|
|
|
|
- (UIAccessibilityTraits)accessibilityTraits {
|
|
return UIAccessibilityTraitButton;
|
|
}
|
|
|
|
- (BOOL)isAccessibilityElement
|
|
{
|
|
return YES;
|
|
}
|
|
|
|
#pragma mark - Private interface implementation
|
|
|
|
- (void)checkStateChangedAndUpdate:(BOOL)forceUpdate {
|
|
if(self.state == _priorState && !forceUpdate) {
|
|
return;
|
|
}
|
|
_priorState = self.state;
|
|
|
|
NSString *name = _layerMap[@(self.state)];
|
|
if (!name) {
|
|
return;
|
|
}
|
|
CALayer *layer = [_animationView layerForKey:name];
|
|
if (!layer) {
|
|
return;
|
|
}
|
|
|
|
for (CALayer *child in [_animationView compositionLayers]) {
|
|
child.hidden = YES;
|
|
}
|
|
layer.hidden = NO;
|
|
}
|
|
|
|
@end
|