167 lines
6.3 KiB
Mathematica
167 lines
6.3 KiB
Mathematica
|
|
// Copyright (c) 2024 Tencent. All rights reserved.
|
||
|
|
// Author: eddardliu
|
||
|
|
|
||
|
|
#import "TUIMultimediaCropControlView.h"
|
||
|
|
#import <Masonry/Masonry.h>
|
||
|
|
#import <TUICore/TUIThemeManager.h>
|
||
|
|
#import "TUIMultimediaPlugin/TUIMultimediaImageUtil.h"
|
||
|
|
#import "TUIMultimediaPlugin/TUIMultimediaCommon.h"
|
||
|
|
|
||
|
|
#import "TUIMultimediaCropView.h"
|
||
|
|
#import "TUIMultimediaCommonEditorControlView.h"
|
||
|
|
|
||
|
|
@interface TUIMultimediaCropControlView()<TUIMultimediaCropDelegate> {
|
||
|
|
TUIMultimediaCommonEditorControlView* _editorControl;
|
||
|
|
TUIMultimediaCropView *_cropView;
|
||
|
|
UIButton* _restoreButton;
|
||
|
|
UIButton* _rotationButton;
|
||
|
|
UIButton* _confirmButton;
|
||
|
|
UIButton* _cancelButton;
|
||
|
|
}
|
||
|
|
@end
|
||
|
|
|
||
|
|
@implementation TUIMultimediaCropControlView
|
||
|
|
- (instancetype)initWithFrame:(CGRect)frame editorControl:(TUIMultimediaCommonEditorControlView*)editorControl{
|
||
|
|
self = [super initWithFrame:frame];
|
||
|
|
if (self != nil) {
|
||
|
|
_editorControl = editorControl;
|
||
|
|
[self initUI];
|
||
|
|
self.backgroundColor = [UIColor clearColor];
|
||
|
|
}
|
||
|
|
return self;
|
||
|
|
}
|
||
|
|
#pragma mark - UI init
|
||
|
|
|
||
|
|
- (void)initUI {
|
||
|
|
_cropView = [[TUIMultimediaCropView alloc] initWithFrame:self.frame];
|
||
|
|
[self addSubview:_cropView];
|
||
|
|
[_cropView mas_makeConstraints:^(MASConstraintMaker *make) {
|
||
|
|
make.size.equalTo(self);
|
||
|
|
}];
|
||
|
|
_cropView.delegate = self;
|
||
|
|
|
||
|
|
_restoreButton = [self addFuncitonButtonWithText:[TUIMultimediaCommon localizedStringForKey:@"restore"]
|
||
|
|
action:@selector(onResetBtnClicked) bottomOffset:-75 leftOffset:7.5 rightOffset:0 size:CGSizeMake(80, 22)];
|
||
|
|
_cancelButton = [self addFunctionButtonWithImage:TUIMultimediaPluginBundleThemeImage(@"editor_crop_cancel", @"crop_cancel")
|
||
|
|
action:@selector(onCancelBtnClicked) bottomOffset:-25 leftOffset:35 rightOffset:0 size:CGSizeMake(25, 25)];
|
||
|
|
_confirmButton = [self addFunctionButtonWithImage:TUIMultimediaPluginBundleThemeImage(@"editor_crop_confirm", @"crop_ok")
|
||
|
|
action:@selector(onConfirmBtnClicked) bottomOffset:-25 leftOffset:0 rightOffset:-32.5 size:CGSizeMake(30, 28)];
|
||
|
|
_rotationButton = [self addFunctionButtonWithImage:TUIMultimediaPluginBundleThemeImage(@"editor_crop_rotation", @"crop_rotation")
|
||
|
|
action:@selector(onRotationBtnClicked) bottomOffset:-75 leftOffset:0 rightOffset:-35 size:CGSizeMake(25, 25)];
|
||
|
|
|
||
|
|
_restoreButton.enabled = NO;
|
||
|
|
}
|
||
|
|
|
||
|
|
-(void)show {
|
||
|
|
self.hidden = NO;
|
||
|
|
_cropView.preViewFrame = _editorControl.previewView.frame;
|
||
|
|
[_cropView reset];
|
||
|
|
_restoreButton.enabled = NO;
|
||
|
|
}
|
||
|
|
|
||
|
|
- (void)changeResetButtonStatus {
|
||
|
|
_restoreButton.enabled = ![self isApproximateSize:[_cropView getCropRect].size size2:_editorControl.previewView.frame.size];
|
||
|
|
}
|
||
|
|
|
||
|
|
-(void)onResetBtnClicked {
|
||
|
|
[_editorControl previewRotationToZero];
|
||
|
|
_cropView.preViewFrame = _editorControl.previewView.frame;
|
||
|
|
[_cropView reset];
|
||
|
|
_restoreButton.enabled = NO;
|
||
|
|
}
|
||
|
|
|
||
|
|
-(void)onRotationBtnClicked {
|
||
|
|
CGRect cropRect = [_cropView getCropRect];
|
||
|
|
CGPoint rotationCenter = CGPointMake(CGRectGetMidX(cropRect), CGRectGetMidY(cropRect));
|
||
|
|
[_editorControl previewRotation90:rotationCenter];
|
||
|
|
[_cropView rotation90];
|
||
|
|
_restoreButton.enabled = YES;
|
||
|
|
}
|
||
|
|
|
||
|
|
-(void)onCancelBtnClicked {
|
||
|
|
self.hidden = YES;
|
||
|
|
if (_delegate != nil) {
|
||
|
|
[_delegate onCancelCrop];
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
-(void)onConfirmBtnClicked {
|
||
|
|
self.hidden = YES;
|
||
|
|
if (_delegate != nil) {
|
||
|
|
if (_restoreButton.isEnabled) {
|
||
|
|
[_delegate onConfirmCrop:[_cropView getCropRect]];
|
||
|
|
} else {
|
||
|
|
[_delegate onCancelCrop];
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
-(UIButton*) addFuncitonButtonWithText:(NSString*)text action:(SEL)actionSel bottomOffset:(int)bottomOffset
|
||
|
|
leftOffset:(int)leftOffset rightOffset:(int)rightOffset size:(CGSize)size {
|
||
|
|
UIButton* button = [UIButton buttonWithType:UIButtonTypeSystem];
|
||
|
|
[self addSubview:button];
|
||
|
|
button.backgroundColor = [UIColor clearColor];
|
||
|
|
[button mas_makeConstraints:^(MASConstraintMaker *make) {
|
||
|
|
if (leftOffset > 0) {
|
||
|
|
make.leading.equalTo(self).offset(leftOffset);
|
||
|
|
}
|
||
|
|
|
||
|
|
if (rightOffset < 0) {
|
||
|
|
make.trailing.equalTo(self).offset(rightOffset);
|
||
|
|
}
|
||
|
|
|
||
|
|
make.bottom.equalTo(self).offset(bottomOffset);
|
||
|
|
make.size.mas_equalTo(size);
|
||
|
|
}];
|
||
|
|
[button addTarget:self action:actionSel forControlEvents:UIControlEventTouchUpInside];
|
||
|
|
[button setTitle:text forState:UIControlStateNormal];
|
||
|
|
[button setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
|
||
|
|
[button setTitleColor:[UIColor grayColor] forState:UIControlStateDisabled];
|
||
|
|
return button;
|
||
|
|
}
|
||
|
|
|
||
|
|
- (UIButton *)addFunctionButtonWithImage:(UIImage *)image action:(SEL)actionSel bottomOffset:(int)bottomOffset
|
||
|
|
leftOffset:(int)leftOffset rightOffset:(int)rightOffset size:(CGSize)size{
|
||
|
|
UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
|
||
|
|
[self addSubview:button];
|
||
|
|
UIImage *imgNormal = [TUIMultimediaImageUtil imageFromImage:image withTintColor:
|
||
|
|
TUIMultimediaPluginDynamicColor(@"editor_func_btn_normal_color", @"#FFFFFF")];
|
||
|
|
[button setImage:imgNormal forState:UIControlStateNormal];
|
||
|
|
[button setImageEdgeInsets:UIEdgeInsetsMake(0, 0, 0, 0)];
|
||
|
|
[button addTarget:self action:actionSel forControlEvents:UIControlEventTouchUpInside];
|
||
|
|
|
||
|
|
[button mas_makeConstraints:^(MASConstraintMaker *make) {
|
||
|
|
if (leftOffset > 0) {
|
||
|
|
make.leading.equalTo(self).offset(leftOffset);
|
||
|
|
}
|
||
|
|
|
||
|
|
if (rightOffset < 0) {
|
||
|
|
make.trailing.equalTo(self).offset(rightOffset);
|
||
|
|
}
|
||
|
|
|
||
|
|
make.bottom.equalTo(self).offset(bottomOffset);
|
||
|
|
make.size.mas_equalTo(size);
|
||
|
|
}];
|
||
|
|
return button;
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
-(BOOL)isApproximateSize:(CGSize)size1 size2:(CGSize)size2 {
|
||
|
|
return ABS(size1.width - size1.width ) < 1 && ABS(size1.height - size2.height) < 1;
|
||
|
|
}
|
||
|
|
|
||
|
|
#pragma mark - TUIMultimediaCropViewDelegate
|
||
|
|
- (void)onStartCrop {
|
||
|
|
_editorControl.isStartCrop = YES;
|
||
|
|
_restoreButton.enabled = YES;
|
||
|
|
}
|
||
|
|
|
||
|
|
- (void)onCropComplete:(CGFloat)scale centerPoint:(CGPoint)centerPoint offset:(CGPoint)offset {
|
||
|
|
_editorControl.isStartCrop = NO;
|
||
|
|
_editorControl.previewLimitRect = [_cropView getCropRect];
|
||
|
|
[_editorControl previewScale:scale center:centerPoint];
|
||
|
|
[_editorControl previewMove:offset];
|
||
|
|
}
|
||
|
|
|
||
|
|
@end
|