123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439 |
- //
- // TOCropToolbar.h
- //
- // 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 "TOCropToolbar.h"
- @interface TOCropToolbar()
- @property (nonatomic, strong) UIButton *doneTextButton;
- @property (nonatomic, strong) UIButton *doneIconButton;
- @property (nonatomic, strong) UIButton *cancelTextButton;
- @property (nonatomic, strong) UIButton *cancelIconButton;
- @property (nonatomic, strong) UIButton *rotateButton;
- @property (nonatomic, strong) UIButton *resetButton;
- @property (nonatomic, strong) UIButton *clampButton;
- - (void)setup;
- - (void)buttonTapped:(id)button;
- + (UIImage *)doneImage;
- + (UIImage *)cancelImage;
- + (UIImage *)resetImage;
- + (UIImage *)rotateImage;
- + (UIImage *)clampImage;
- @end
- @implementation TOCropToolbar
- - (instancetype)initWithFrame:(CGRect)frame
- {
- if (self = [super initWithFrame:frame]) {
- [self setup];
- }
-
- return self;
- }
- - (void)setup {
- self.backgroundColor = [UIColor colorWithWhite:0.12f alpha:1.0f];
-
- _doneTextButton = [UIButton buttonWithType:UIButtonTypeSystem];
- _doneTextButton.contentHorizontalAlignment = UIControlContentHorizontalAlignmentLeft;
- [_doneTextButton setTitle:NSLocalizedStringFromTableInBundle(@"完成",
- @"TOCropViewControllerLocalizable",[NSBundle bundleForClass:[self class]],
- nil)forState:UIControlStateNormal];
- [_doneTextButton setTitleColor:[UIColor colorWithRed:1.0f green:0.8f blue:0.0f alpha:1.0f] forState:UIControlStateNormal];
- [_doneTextButton.titleLabel setFont:[UIFont systemFontOfSize:17.0f]];
- [_doneTextButton addTarget:self action:@selector(buttonTapped:) forControlEvents:UIControlEventTouchUpInside];
- [self addSubview:_doneTextButton];
-
- _doneIconButton = [UIButton buttonWithType:UIButtonTypeSystem];
- [_doneIconButton setImage:[TOCropToolbar doneImage] forState:UIControlStateNormal];
- [_doneIconButton setTintColor:[UIColor colorWithRed:1.0f green:0.8f blue:0.0f alpha:1.0f]];
- [_doneIconButton addTarget:self action:@selector(buttonTapped:) forControlEvents:UIControlEventTouchUpInside];
- [self addSubview:_doneIconButton];
-
- _cancelTextButton = [UIButton buttonWithType:UIButtonTypeSystem];
- _cancelTextButton.contentHorizontalAlignment = UIControlContentHorizontalAlignmentRight;
- [_cancelTextButton setTitle:NSLocalizedStringFromTableInBundle(@"取消",
- @"TOCropViewControllerLocalizable",
- [NSBundle bundleForClass:[self class]],
- nil)
- forState:UIControlStateNormal];
- [_cancelTextButton.titleLabel setFont:[UIFont systemFontOfSize:17.0f]];
- [_cancelTextButton addTarget:self action:@selector(buttonTapped:) forControlEvents:UIControlEventTouchUpInside];
- [self addSubview:_cancelTextButton];
-
- _cancelIconButton = [UIButton buttonWithType:UIButtonTypeSystem];
- [_cancelIconButton setImage:[TOCropToolbar cancelImage] forState:UIControlStateNormal];
- [_cancelIconButton addTarget:self action:@selector(buttonTapped:) forControlEvents:UIControlEventTouchUpInside];
- [self addSubview:_cancelIconButton];
-
- // _clampButton = [UIButton buttonWithType:UIButtonTypeSystem];
- // _clampButton.contentMode = UIViewContentModeCenter;
- // _clampButton.tintColor = [UIColor whiteColor];
- // [_clampButton setImage:[TOCropToolbar clampImage] forState:UIControlStateNormal];
- // [_clampButton addTarget:self action:@selector(buttonTapped:) forControlEvents:UIControlEventTouchUpInside];
- // [self addSubview:_clampButton];
-
- _rotateButton = [UIButton buttonWithType:UIButtonTypeSystem];
- _rotateButton.contentMode = UIViewContentModeCenter;
- _rotateButton.tintColor = [UIColor whiteColor];
- [_rotateButton setImage:[TOCropToolbar rotateImage] forState:UIControlStateNormal];
- [_rotateButton addTarget:self action:@selector(buttonTapped:) forControlEvents:UIControlEventTouchUpInside];
- [self addSubview:_rotateButton];
-
- _resetButton = [UIButton buttonWithType:UIButtonTypeSystem];
- _resetButton.contentMode = UIViewContentModeCenter;
- _resetButton.tintColor = [UIColor whiteColor];
- _resetButton.enabled = NO;
- [_resetButton setImage:[TOCropToolbar resetImage] forState:UIControlStateNormal];
- [_resetButton addTarget:self action:@selector(buttonTapped:) forControlEvents:UIControlEventTouchUpInside];
- [self addSubview:_resetButton];
- }
- - (void)layoutSubviews
- {
- [super layoutSubviews];
-
- BOOL verticalLayout = (CGRectGetWidth(self.bounds) < CGRectGetHeight(self.bounds));
- CGSize boundsSize = self.bounds.size;
-
- self.cancelIconButton.hidden = (!verticalLayout);
- self.cancelTextButton.hidden = (verticalLayout);
- self.doneIconButton.hidden = (!verticalLayout);
- self.doneTextButton.hidden = (verticalLayout);
-
- self.rotateButton.hidden = self.rotateButtonHidden;
-
- if (verticalLayout == NO) {
- CGRect frame = CGRectZero;
- frame.size.height = 44.0f;
- frame.size.width = [self.cancelTextButton.titleLabel.text sizeWithAttributes:@{NSFontAttributeName:self.cancelTextButton.titleLabel.font}].width + 10;
- self.cancelTextButton.frame = frame;
-
- frame.size.width = [self.doneTextButton.titleLabel.text sizeWithAttributes:@{NSFontAttributeName:self.doneTextButton.titleLabel.font}].width + 10;
- frame.origin.x = boundsSize.width - CGRectGetWidth(frame);
- self.doneTextButton.frame = frame;
-
- CGRect containerRect = (CGRect){0,0,165.0f,44.0f};
- containerRect.origin.x = (CGRectGetWidth(self.bounds) - (CGRectGetWidth(containerRect))) * 0.5f;
-
- CGRect buttonFrame = (CGRect){0,0,44.0f,44.0f};
-
- if (self.rotateButtonHidden) {
- buttonFrame.origin.x = CGRectGetMinX(containerRect);
- self.resetButton.frame = buttonFrame;
- }
- else {
- buttonFrame.origin.x = CGRectGetMinX(containerRect);
- self.rotateButton.frame = buttonFrame;
-
- buttonFrame.origin.x = CGRectGetMidX(containerRect) - 22.0f;
- self.resetButton.frame = buttonFrame;
- }
-
- // buttonFrame.origin.x = CGRectGetMaxX(containerRect) - 44.0f;
- // self.clampButton.frame = buttonFrame;
- }
- else {
- CGRect frame = CGRectZero;
- frame.size.height = 44.0f;
- frame.size.width = 44.0f;
- frame.origin.y = CGRectGetHeight(self.bounds) - 44.0f;
- self.cancelIconButton.frame = frame;
-
- frame.origin.y = 0.0f;
- frame.size.width = 44.0f;
- frame.size.height = 44.0f;
- self.doneIconButton.frame = frame;
-
- CGRect containerRect = (CGRect){0,0,44.0f,165.0f};
- containerRect.origin.y = (CGRectGetHeight(self.bounds) - (CGRectGetHeight(containerRect))) * 0.5f;
-
- CGRect buttonFrame = (CGRect){0,0,44.0f,44.0f};
-
- if (self.rotateButtonHidden) {
- buttonFrame.origin.y = CGRectGetMinY(containerRect);
- self.resetButton.frame = buttonFrame;
- }
- else {
- buttonFrame.origin.y = CGRectGetMinY(containerRect);
- self.rotateButton.frame = buttonFrame;
-
- buttonFrame.origin.y = CGRectGetMidY(containerRect) - 22.0f;
- self.resetButton.frame = buttonFrame;
- }
- // buttonFrame.origin.y = CGRectGetMaxY(containerRect) - 44.0f;
- // self.clampButton.frame = buttonFrame;
- }
- }
- - (void)buttonTapped:(id)button
- {
- if (button == self.cancelTextButton || button == self.cancelIconButton) {
- if (self.cancelButtonTapped)
- self.cancelButtonTapped();
- }
- else if (button == self.doneTextButton || button == self.doneIconButton) {
- if (self.doneButtonTapped)
- self.doneButtonTapped();
- }
- else if (button == self.resetButton && self.resetButtonTapped) {
- self.resetButtonTapped();
- }
- else if (button == self.rotateButton && self.rotateButtonTapped) {
- self.rotateButtonTapped();
- }
- else if (button == self.clampButton && self.clampButtonTapped) {
- self.clampButtonTapped();
- return;
- }
- }
- - (CGRect)clampButtonFrame
- {
- return self.clampButton.frame;
- }
- - (void)setClampButtonGlowing:(BOOL)clampButtonGlowing
- {
- if (_clampButtonGlowing == clampButtonGlowing)
- return;
-
- _clampButtonGlowing = clampButtonGlowing;
-
- if (_clampButtonGlowing)
- self.clampButton.tintColor = nil;
- else
- self.clampButton.tintColor = [UIColor whiteColor];
- }
- - (void)setRotateButtonHidden:(BOOL)rotateButtonHidden
- {
- if (_rotateButtonHidden == rotateButtonHidden)
- return;
-
- _rotateButtonHidden = rotateButtonHidden;
- [self setNeedsLayout];
- }
- - (BOOL)resetButtonEnabled
- {
- return self.resetButton.enabled;
- }
- - (void)setResetButtonEnabled:(BOOL)resetButtonEnabled
- {
- self.resetButton.enabled = resetButtonEnabled;
- }
- - (CGRect)doneButtonFrame
- {
- if (self.doneIconButton.hidden == NO)
- return self.doneIconButton.frame;
-
- return self.doneTextButton.frame;
- }
- #pragma mark - Image Generation -
- + (UIImage *)doneImage
- {
- UIImage *doneImage = nil;
-
- UIGraphicsBeginImageContextWithOptions((CGSize){17,14}, NO, 0.0f);
- {
- //// Rectangle Drawing
- UIBezierPath* rectanglePath = UIBezierPath.bezierPath;
- [rectanglePath moveToPoint: CGPointMake(1, 7)];
- [rectanglePath addLineToPoint: CGPointMake(6, 12)];
- [rectanglePath addLineToPoint: CGPointMake(16, 1)];
- [UIColor.whiteColor setStroke];
- rectanglePath.lineWidth = 2;
- [rectanglePath stroke];
-
-
- doneImage = UIGraphicsGetImageFromCurrentImageContext();
- }
- UIGraphicsEndImageContext();
-
- return doneImage;
- }
- + (UIImage *)cancelImage
- {
- UIImage *cancelImage = nil;
-
- UIGraphicsBeginImageContextWithOptions((CGSize){16,16}, NO, 0.0f);
- {
- UIBezierPath* bezierPath = UIBezierPath.bezierPath;
- [bezierPath moveToPoint: CGPointMake(15, 15)];
- [bezierPath addLineToPoint: CGPointMake(1, 1)];
- [UIColor.whiteColor setStroke];
- bezierPath.lineWidth = 2;
- [bezierPath stroke];
-
-
- //// Bezier 2 Drawing
- UIBezierPath* bezier2Path = UIBezierPath.bezierPath;
- [bezier2Path moveToPoint: CGPointMake(1, 15)];
- [bezier2Path addLineToPoint: CGPointMake(15, 1)];
- [UIColor.whiteColor setStroke];
- bezier2Path.lineWidth = 2;
- [bezier2Path stroke];
-
- cancelImage = UIGraphicsGetImageFromCurrentImageContext();
- }
- UIGraphicsEndImageContext();
-
- return cancelImage;
- }
- + (UIImage *)rotateImage
- {
- UIImage *rotateImage = nil;
-
- UIGraphicsBeginImageContextWithOptions((CGSize){18,21}, NO, 0.0f);
- {
- //// Rectangle 2 Drawing
- UIBezierPath* rectangle2Path = [UIBezierPath bezierPathWithRect: CGRectMake(0, 9, 12, 12)];
- [UIColor.whiteColor setFill];
- [rectangle2Path fill];
-
-
- //// Rectangle 3 Drawing
- UIBezierPath* rectangle3Path = UIBezierPath.bezierPath;
- [rectangle3Path moveToPoint: CGPointMake(5, 3)];
- [rectangle3Path addLineToPoint: CGPointMake(10, 6)];
- [rectangle3Path addLineToPoint: CGPointMake(10, 0)];
- [rectangle3Path addLineToPoint: CGPointMake(5, 3)];
- [rectangle3Path closePath];
- [UIColor.whiteColor setFill];
- [rectangle3Path fill];
-
-
- //// Bezier Drawing
- UIBezierPath* bezierPath = UIBezierPath.bezierPath;
- [bezierPath moveToPoint: CGPointMake(10, 3)];
- [bezierPath addCurveToPoint: CGPointMake(17.5, 11) controlPoint1: CGPointMake(15, 3) controlPoint2: CGPointMake(17.5, 5.91)];
- [UIColor.whiteColor setStroke];
- bezierPath.lineWidth = 1;
- [bezierPath stroke];
- rotateImage = UIGraphicsGetImageFromCurrentImageContext();
- }
- UIGraphicsEndImageContext();
-
- return rotateImage;
- }
- + (UIImage *)resetImage
- {
- UIImage *resetImage = nil;
-
- UIGraphicsBeginImageContextWithOptions((CGSize){22,18}, NO, 0.0f);
- {
-
- //// Bezier 2 Drawing
- UIBezierPath* bezier2Path = UIBezierPath.bezierPath;
- [bezier2Path moveToPoint: CGPointMake(22, 9)];
- [bezier2Path addCurveToPoint: CGPointMake(13, 18) controlPoint1: CGPointMake(22, 13.97) controlPoint2: CGPointMake(17.97, 18)];
- [bezier2Path addCurveToPoint: CGPointMake(13, 16) controlPoint1: CGPointMake(13, 17.35) controlPoint2: CGPointMake(13, 16.68)];
- [bezier2Path addCurveToPoint: CGPointMake(20, 9) controlPoint1: CGPointMake(16.87, 16) controlPoint2: CGPointMake(20, 12.87)];
- [bezier2Path addCurveToPoint: CGPointMake(13, 2) controlPoint1: CGPointMake(20, 5.13) controlPoint2: CGPointMake(16.87, 2)];
- [bezier2Path addCurveToPoint: CGPointMake(6.55, 6.27) controlPoint1: CGPointMake(10.1, 2) controlPoint2: CGPointMake(7.62, 3.76)];
- [bezier2Path addCurveToPoint: CGPointMake(6, 9) controlPoint1: CGPointMake(6.2, 7.11) controlPoint2: CGPointMake(6, 8.03)];
- [bezier2Path addLineToPoint: CGPointMake(4, 9)];
- [bezier2Path addCurveToPoint: CGPointMake(4.65, 5.63) controlPoint1: CGPointMake(4, 7.81) controlPoint2: CGPointMake(4.23, 6.67)];
- [bezier2Path addCurveToPoint: CGPointMake(7.65, 1.76) controlPoint1: CGPointMake(5.28, 4.08) controlPoint2: CGPointMake(6.32, 2.74)];
- [bezier2Path addCurveToPoint: CGPointMake(13, 0) controlPoint1: CGPointMake(9.15, 0.65) controlPoint2: CGPointMake(11, 0)];
- [bezier2Path addCurveToPoint: CGPointMake(22, 9) controlPoint1: CGPointMake(17.97, 0) controlPoint2: CGPointMake(22, 4.03)];
- [bezier2Path closePath];
- [UIColor.whiteColor setFill];
- [bezier2Path fill];
-
-
- //// Polygon Drawing
- UIBezierPath* polygonPath = UIBezierPath.bezierPath;
- [polygonPath moveToPoint: CGPointMake(5, 15)];
- [polygonPath addLineToPoint: CGPointMake(10, 9)];
- [polygonPath addLineToPoint: CGPointMake(0, 9)];
- [polygonPath addLineToPoint: CGPointMake(5, 15)];
- [polygonPath closePath];
- [UIColor.whiteColor setFill];
- [polygonPath fill];
- resetImage = UIGraphicsGetImageFromCurrentImageContext();
- }
-
- return resetImage;
- }
- + (UIImage *)clampImage
- {
- UIImage *clampImage = nil;
-
- UIGraphicsBeginImageContextWithOptions((CGSize){22,16}, NO, 0.0f);
- {
- //// Color Declarations
- UIColor* outerBox = [UIColor colorWithRed: 1 green: 1 blue: 1 alpha: 0.553];
- UIColor* innerBox = [UIColor colorWithRed: 1 green: 1 blue: 1 alpha: 0.773];
-
- //// Rectangle Drawing
- UIBezierPath* rectanglePath = [UIBezierPath bezierPathWithRect: CGRectMake(0, 3, 13, 13)];
- [UIColor.whiteColor setFill];
- [rectanglePath fill];
-
-
- //// Outer
- {
- //// Top Drawing
- UIBezierPath* topPath = [UIBezierPath bezierPathWithRect: CGRectMake(0, 0, 22, 2)];
- [outerBox setFill];
- [topPath fill];
-
-
- //// Side Drawing
- UIBezierPath* sidePath = [UIBezierPath bezierPathWithRect: CGRectMake(19, 2, 3, 14)];
- [outerBox setFill];
- [sidePath fill];
- }
-
-
- //// Rectangle 2 Drawing
- UIBezierPath* rectangle2Path = [UIBezierPath bezierPathWithRect: CGRectMake(14, 3, 4, 13)];
- [innerBox setFill];
- [rectangle2Path fill];
-
-
- clampImage = UIGraphicsGetImageFromCurrentImageContext();
- }
- UIGraphicsEndImageContext();
-
- return clampImage;
- }
- @end
|