123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196 |
- //
- // TOCropOverlayView.m
- //
- // Copyright 2015 Timothy Oliver. All rights reserved.
- //
- // Permission is hereby granted, free of charge, to any person obtaining a copy
- // of this software and associated documentation files (the "Software"), to
- // deal in the Software without restriction, including without limitation the
- // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
- // sell copies of the Software, and to permit persons to whom the Software is
- // furnished to do so, subject to the following conditions:
- //
- // The above copyright notice and this permission notice shall be included in
- // all copies or substantial portions of the Software.
- //
- // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
- // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
- // IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- #import "TOCropOverlayView.h"
- static const CGFloat kTOCropOverLayerCornerWidth = 20.0f;
- @interface TOCropOverlayView ()
- @property (nonatomic, strong) NSArray *horizontalGridLines;
- @property (nonatomic, strong) NSArray *verticalGridLines;
- @property (nonatomic, strong) NSArray *outerLineViews; //top, right, bottom, left
- @property (nonatomic, strong) NSArray *topLeftLineViews; //vertical, horizontal
- @property (nonatomic, strong) NSArray *bottomLeftLineViews;
- @property (nonatomic, strong) NSArray *bottomRightLineViews;
- @property (nonatomic, strong) NSArray *topRightLineViews;
- - (void)setup;
- - (void)layoutLines;
- @end
- @implementation TOCropOverlayView
- - (instancetype)initWithFrame:(CGRect)frame
- {
- if (self = [super initWithFrame:frame]) {
- self.clipsToBounds = NO;
- [self setup];
- }
-
- return self;
- }
- - (void)setup
- {
- UIView *(^newLineView)(void) = ^UIView *(void){
- UIView *newLine = [[UIView alloc] initWithFrame:CGRectZero];
- newLine.backgroundColor = [UIColor whiteColor];
- [self addSubview:newLine];
- return newLine;
- };
-
- _outerLineViews = @[newLineView(), newLineView(), newLineView(), newLineView()];
-
- _topLeftLineViews = @[newLineView(), newLineView()];
- _bottomLeftLineViews = @[newLineView(), newLineView()];
- _topRightLineViews = @[newLineView(), newLineView()];
- _bottomRightLineViews = @[newLineView(), newLineView()];
-
- _horizontalGridLines = @[newLineView(), newLineView()];
- _verticalGridLines = @[newLineView(), newLineView()];
- }
- - (void)setFrame:(CGRect)frame
- {
- [super setFrame:frame];
-
- if (_outerLineViews)
- [self layoutLines];
- }
- - (void)didMoveToSuperview
- {
- [super didMoveToSuperview];
-
- if (_outerLineViews)
- [self layoutLines];
- }
- - (void)layoutLines
- {
- CGSize boundsSize = self.bounds.size;
-
- //border lines
- for (NSInteger i = 0; i < 4; i++) {
- UIView *lineView = self.outerLineViews[i];
-
- CGRect frame = CGRectZero;
- switch (i) {
- case 0: frame = (CGRect){0,-1.0f,boundsSize.width+2.0f, 1.0f}; break; //top
- case 1: frame = (CGRect){boundsSize.width,0.0f,1.0f,boundsSize.height}; break; //right
- case 2: frame = (CGRect){-1.0f,boundsSize.height,boundsSize.width+2.0f,1.0f}; break; //bottom
- case 3: frame = (CGRect){-1.0f,0,1.0f,boundsSize.height+1.0f}; break; //left
- }
-
- lineView.frame = frame;
- }
-
- //corner liness
- NSArray *cornerLines = @[self.topLeftLineViews, self.topRightLineViews, self.bottomRightLineViews, self.bottomLeftLineViews];
- for (NSInteger i = 0; i < 4; i++) {
- NSArray *cornerLine = cornerLines[i];
-
- CGRect verticalFrame, horizontalFrame;
- switch (i) {
- case 0: //top left
- verticalFrame = (CGRect){-3.0f,-3.0f,3.0f,kTOCropOverLayerCornerWidth+3.0f};
- horizontalFrame = (CGRect){0,-3.0f,kTOCropOverLayerCornerWidth,3.0f};
- break;
- case 1: //top right
- verticalFrame = (CGRect){boundsSize.width,-3.0f,3.0f,kTOCropOverLayerCornerWidth+3.0f};
- horizontalFrame = (CGRect){boundsSize.width-kTOCropOverLayerCornerWidth,-3.0f,kTOCropOverLayerCornerWidth,3.0f};
- break;
- case 2: //bottom right
- verticalFrame = (CGRect){boundsSize.width,boundsSize.height-kTOCropOverLayerCornerWidth,3.0f,kTOCropOverLayerCornerWidth+3.0f};
- horizontalFrame = (CGRect){boundsSize.width-kTOCropOverLayerCornerWidth,boundsSize.height,kTOCropOverLayerCornerWidth,3.0f};
- break;
- case 3: //bottom left
- verticalFrame = (CGRect){-3.0f,boundsSize.height-kTOCropOverLayerCornerWidth,3.0f,kTOCropOverLayerCornerWidth};
- horizontalFrame = (CGRect){-3.0f,boundsSize.height,kTOCropOverLayerCornerWidth+3.0f,3.0f};
- break;
- }
-
- [cornerLine[0] setFrame:verticalFrame];
- [cornerLine[1] setFrame:horizontalFrame];
- }
-
- //grid lines - horizontal
- CGFloat thickness = 1.0f / [[UIScreen mainScreen] scale];
- NSInteger numberOfLines = self.horizontalGridLines.count;
- CGFloat padding = (CGRectGetHeight(self.bounds) - (thickness*numberOfLines)) / (numberOfLines + 1);
- for (NSInteger i = 0; i < numberOfLines; i++) {
- UIView *lineView = self.horizontalGridLines[i];
- CGRect frame = CGRectZero;
- frame.size.height = thickness;
- frame.size.width = CGRectGetWidth(self.bounds);
- frame.origin.y = (padding * (i+1)) + (thickness * i);
- lineView.frame = frame;
- }
-
- //grid lines - vertical
- numberOfLines = self.verticalGridLines.count;
- padding = (CGRectGetWidth(self.bounds) - (thickness*numberOfLines)) / (numberOfLines + 1);
- for (NSInteger i = 0; i < numberOfLines; i++) {
- UIView *lineView = self.verticalGridLines[i];
- CGRect frame = CGRectZero;
- frame.size.width = thickness;
- frame.size.height = CGRectGetHeight(self.bounds);
- frame.origin.x = (padding * (i+1)) + (thickness * i);
- lineView.frame = frame;
- }
- }
- - (void)setGridHidden:(BOOL)hidden animated:(BOOL)animated
- {
- _gridHidden = hidden;
-
- if (animated == NO) {
- for (UIView *lineView in self.horizontalGridLines) {
- lineView.alpha = hidden ? 0.0f : 1.0f;
- }
-
- for (UIView *lineView in self.verticalGridLines) {
- lineView.alpha = hidden ? 0.0f : 1.0f;
- }
-
- return;
- }
-
- [UIView animateWithDuration:hidden?0.35f:0.2f animations:^{
- for (UIView *lineView in self.horizontalGridLines)
- lineView.alpha = hidden ? 0.0f : 1.0f;
-
- for (UIView *lineView in self.verticalGridLines)
- lineView.alpha = hidden ? 0.0f : 1.0f;
- }];
- }
- - (void)setGridHidden:(BOOL)gridHidden
- {
- [self setGridHidden:gridHidden animated:NO];
- }
- @end
|