-
Notifications
You must be signed in to change notification settings - Fork 2
/
ASCIImage.m
80 lines (63 loc) · 2.01 KB
/
ASCIImage.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
//
// ASCIImage.m
//
// Created by Ben Turley on 5/10/15.
// Copyright (c) 2015 Ben Turley. All rights reserved.
//
#import "ASCIImage.h"
#import "ASCIImageCommon.h"
#define OBSERVED_KEYS @[NSStringFromSelector(@selector(ascii)), NSStringFromSelector(@selector(color)), NSStringFromSelector(@selector(contextOptions))]
@interface ASCIImage () {
UIImageView *_imageView;
}
@property (nonatomic, strong) NSArray *ascii;
@property (nonatomic, strong) UIColor *color;
@property (nonatomic, strong) NSArray *contextOptions;
@end
@implementation ASCIImage
- (instancetype)init
{
self = [super initWithFrame:CGRectZero];
if (self) {
for (NSString *key in OBSERVED_KEYS) {
[self addObserver:self forKeyPath:key options:0 context:nil];
}
_imageView = [[UIImageView alloc] initWithFrame:self.bounds];
[_imageView setContentMode:UIViewContentModeScaleAspectFit];
[self addSubview:_imageView];
}
return self;
}
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
[self setNeedsLayout];
}
- (void)updateASCIImage
{
[_imageView setFrame:self.bounds];
[_imageView setImage:[ASCIImageCommon imageFromASCII:_ascii scaleFactor:[self bestScale] defaultColor:_color contextOptions:_contextOptions]];
}
- (CGFloat)bestScale
{
NSArray *strictRep = [PARImage strictASCIIRepresentationFromLenientASCIIRepresentation:self.ascii];
if (strictRep != nil) {
NSUInteger imgWidth = [(NSString*)strictRep.firstObject length] * [UIScreen mainScreen].scale;
return ceil(self.frame.size.width / imgWidth) * [UIScreen mainScreen].scale;
}
return [UIScreen mainScreen].scale;
}
- (void)layoutSubviews
{
[super layoutSubviews];
[self updateASCIImage];
}
- (void) dealloc
{
for (NSString *key in OBSERVED_KEYS) {
@try {
[self removeObserver:self forKeyPath:key];
}
@catch (NSException * __unused exception) {}
}
}
@end