// // 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