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