123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205 |
- //
- // ZLClipItem.m
- // ZLPhotoBrowser
- //
- // Created by long on 2018/5/6.
- // Copyright © 2018年 long. All rights reserved.
- //
- #import "ZLClipItem.h"
- @implementation ZLClippingCircle
- - (void)drawRect:(CGRect)rect
- {
- CGContextRef context = UIGraphicsGetCurrentContext();
-
- CGRect rct = self.bounds;
- rct.origin.x = rct.size.width/2-rct.size.width/6;
- rct.origin.y = rct.size.height/2-rct.size.height/6;
- rct.size.width /= 3;
- rct.size.height /= 3;
-
- CGContextSetFillColorWithColor(context, self.bgColor.CGColor);
- CGContextFillEllipseInRect(context, rct);
- }
- @end
- //!!!!: ZLGridLayar
- @implementation ZLGridLayar
- + (BOOL)needsDisplayForKey:(NSString*)key
- {
- if ([key isEqualToString:@"clippingRect"]) {
- return YES;
- }
- return [super needsDisplayForKey:key];
- }
- - (id)initWithLayer:(id)layer
- {
- self = [super initWithLayer:layer];
- if(self && [layer isKindOfClass:[ZLGridLayar class]]){
- self.bgColor = ((ZLGridLayar *)layer).bgColor;
- self.gridColor = ((ZLGridLayar *)layer).gridColor;
- self.clippingRect = ((ZLGridLayar *)layer).clippingRect;
- }
- return self;
- }
- - (void)drawInContext:(CGContextRef)context
- {
- CGRect rct = self.bounds;
- CGContextSetFillColorWithColor(context, self.bgColor.CGColor);
- CGContextFillRect(context, rct);
-
- CGContextClearRect(context, _clippingRect);
-
- CGContextSetStrokeColorWithColor(context, self.gridColor.CGColor);
- CGContextSetLineWidth(context, 1);
-
- rct = self.clippingRect;
-
- CGContextBeginPath(context);
- CGFloat dW = 0;
- for(int i=0;i<4;++i){
- CGContextMoveToPoint(context, rct.origin.x+dW, rct.origin.y);
- CGContextAddLineToPoint(context, rct.origin.x+dW, rct.origin.y+rct.size.height);
- dW += _clippingRect.size.width/3;
- }
-
- dW = 0;
- for(int i=0;i<4;++i){
- CGContextMoveToPoint(context, rct.origin.x, rct.origin.y+dW);
- CGContextAddLineToPoint(context, rct.origin.x+rct.size.width, rct.origin.y+dW);
- dW += rct.size.height/3;
- }
- CGContextStrokePath(context);
- }
- @end
- //!!!!: ZLClipRatio
- @implementation ZLClipRatio
- {
- CGFloat _longSide;
- CGFloat _shortSide;
- }
- - (id)initWithValue1:(CGFloat)value1 value2:(CGFloat)value2
- {
- self = [super init];
- if(self){
- _longSide = MAX(fabs(value1), fabs(value2));
- _shortSide = MIN(fabs(value1), fabs(value2));
- }
- return self;
- }
- - (NSString*)description
- {
- NSString *format = (self.titleFormat) ? self.titleFormat : @"%g : %g";
-
- if(self.isLandscape){
- return [NSString stringWithFormat:format, _longSide, _shortSide];
- }
- return [NSString stringWithFormat:format, _shortSide, _longSide];
- }
- - (CGFloat)ratio
- {
- if(_longSide==0 || _shortSide==0){
- return 0;
- }
-
- if(self.isLandscape){
- return _shortSide / (CGFloat)_longSide;
- }
- return _longSide / (CGFloat)_shortSide;
- }
- @end
- //!!!!: ZLClipItem
- @implementation ZLClipItem
- - (instancetype)initWithFrame:(CGRect)frame
- {
- return [self initWithFrame:CGRectZero image:nil target:nil action:nil];
- }
- - (instancetype)initWithCoder:(NSCoder *)coder
- {
- return [self initWithFrame:CGRectZero image:nil target:nil action:nil];
- }
- - (instancetype)initWithFrame:(CGRect)frame image:(UIImage *)image target:(id)target action:(SEL)action
- {
- self = [super initWithFrame:frame];
- if(self){
- UITapGestureRecognizer *gesture = [[UITapGestureRecognizer alloc] initWithTarget:target action:action];
- [self addGestureRecognizer:gesture];
-
- CGFloat W = frame.size.width;
- _iconView = [[UIImageView alloc] initWithFrame:CGRectMake(10, 5, W-20, W-20)];
- _iconView.clipsToBounds = YES;
- _iconView.image = image;
- _iconView.layer.cornerRadius = 5;
- _iconView.contentMode = UIViewContentModeScaleAspectFill;
- [self addSubview:_iconView];
-
- _titleLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, CGRectGetMaxY(_iconView.frame) + 5, W, 15)];
- _titleLabel.backgroundColor = [UIColor clearColor];
- _titleLabel.font = [UIFont systemFontOfSize:10];
- _titleLabel.textColor = [UIColor whiteColor];
- _titleLabel.textAlignment = NSTextAlignmentCenter;
- [self addSubview:_titleLabel];
- }
- return self;
- }
- - (void)setRatio:(ZLClipRatio *)ratio
- {
- if(ratio != _ratio){
- _ratio = ratio;
- }
- }
- - (void)refreshViews
- {
- _titleLabel.text = [_ratio description];
-
- CGPoint center = _iconView.center;
- CGFloat W, H;
- if (_ratio.ratio != 0) {
- if(_ratio.isLandscape) {
- W = 50;
- H = 50*_ratio.ratio;
- } else {
- W = 50/_ratio.ratio;
- H = 50;
- }
- } else {
- CGFloat maxW = MAX(_iconView.image.size.width, _iconView.image.size.height);
- W = 50 * _iconView.image.size.width / maxW;
- H = 50 * _iconView.image.size.height / maxW;
- }
- _iconView.frame = CGRectMake(center.x-W/2, center.y-H/2, W, H);
- }
- - (void)changeOrientation
- {
- self.ratio.isLandscape = !self.ratio.isLandscape;
-
- [UIView animateWithDuration:0.2 animations:^{
- [self refreshViews];
- }];
- }
- @end
|