IOS 照片编辑的view封装的实例详解

2020-01-21 00:19:17王旭

对UIImage添加了一个category

UIImage+Rotation.h


#import <UIKit/UIKit.h>

@interface UIImage (Rotation)

- (UIImage *)imageRotatedByRadians:(CGFloat)radians;
- (UIImage *)imageRotatedByDegrees:(CGFloat)degrees;

@end

UIImage+Rotation.m


#import "UIImage+Rotation.h"

/************
 角度=弧度/Pi*180
 弧度=角度/180*Pi
 *************/

CGFloat DegreesToRadians(CGFloat degrees) {return degrees * M_PI / 180;};
CGFloat RadiansToDegrees(CGFloat radians) {return radians * 180/M_PI;};

@implementation UIImage (Rotation)

- (UIImage *)imageRotatedByRadians:(CGFloat)radians
{
  return [self imageRotatedByDegrees:RadiansToDegrees(radians)];
}

- (UIImage *)imageRotatedByDegrees:(CGFloat)degrees
{
  /*****
   CGAffineTransformMakeRotation
   通过指定角度来创建一个旋转矩阵
   CGAffineTransformRotate
   在已存在的矩阵中使用旋转
   *****/
  UIView *rotatedViewBox = [[UIView alloc] initWithFrame:CGRectMake(0,0,self.size.width, self.size.height)];
  CGAffineTransform t = CGAffineTransformMakeRotation(DegreesToRadians(degrees));
  //给view旋转角度
  rotatedViewBox.transform = t;
  CGSize rotatedSize = rotatedViewBox.frame.size;
  [rotatedViewBox release];
  //开始编辑图形上下文
  UIGraphicsBeginImageContext(rotatedSize);
  //定义一个图形上下文
  CGContextRef bitmap = UIGraphicsGetCurrentContext();
  //沿x轴移动rotatedSize.width/2,y轴移动rotatedSize.height
  CGContextTranslateCTM(bitmap, rotatedSize.width/2, rotatedSize.height/2);
  //以原点(左下角)为中心旋转DegreesToRadians(degrees)弧度,正角度逆时针,负角度顺时针
  CGContextRotateCTM(bitmap, DegreesToRadians(degrees));
  //缩放x轴,y轴方向
  CGContextScaleCTM(bitmap, 1.0, -1.0);
  //绘制位图
  CGContextDrawImage(bitmap, CGRectMake(-self.size.width / 2, -self.size.height / 2, self.size.width, self.size.height), [self CGImage]);
  //赋值给UIImage
  UIImage *resImage = UIGraphicsGetImageFromCurrentImageContext();
  //结束绘制
  UIGraphicsEndImageContext();
  return resImage; 
}

@end;

ViewController.m


#import "ViewController.h"
#import <QuartzCore/QuartzCore.h>
#import "ImagecropperView.h"

@interface ViewController ()<ImageCropperDelegate>{
}

@property (nonatomic, retain) IBOutlet ImageCropperView *cropper;
@property (nonatomic, retain) IBOutlet UIImageView *result;
@property (retain, nonatomic) IBOutlet UIImageView *resultSecond;
@property (nonatomic, retain) IBOutlet UIButton *btn;
@property (retain, nonatomic) IBOutlet ImageCropperView *cropperSecond;
@property (retain, nonatomic) IBOutlet UIButton *cropButton;

@end

@implementation ViewController
//@synthesize cropper, result, btn;

- (void)viewDidLoad
{
  [super viewDidLoad];
  // Do any additional setup after loading the view, typically from a nib.
  _cropper.layer.borderWidth = 1.0;
  _cropper.layer.borderColor = [UIColor blueColor].CGColor;
  _cropper.delegate = self;
  [_cropper setup];
  _cropper.image = [UIImage imageNamed:@"2.jpg"];
  [_btn addTarget:self action:@selector(buttonClicked) forControlEvents:UIControlEventTouchUpInside];
  
  _cropperSecond.layer.borderColor = [UIColor blackColor].CGColor;
  _cropperSecond.layer.borderWidth = 2.0;
  _cropperSecond.delegate = self;
  [_cropperSecond setup];
  _cropperSecond.image = [UIImage imageNamed:@"1.jpg"];
  [_cropButton addTarget:self action:@selector(tapCropButton) forControlEvents:UIControlEventTouchUpInside];
}

- (void)buttonClicked
{
  if ([_btn.currentTitle isEqualToString:@"Crop1"]) {
    [_cropper finishCropping];//保存
    _result.image = _cropper.croppedImage;
    _cropper.hidden = YES;
    [_btn setTitle:@"Back" forState:UIControlStateNormal];
    [_btn setTitle:@"Back" forState:UIControlStateHighlighted];
  }else
  {
    [_cropper reset];
    _cropper.hidden = NO;
    [_btn setTitle:@"Crop1" forState:UIControlStateNormal];
    [_btn setTitle:@"Crop1" forState:UIControlStateHighlighted];
    _result.image = nil;
  }
  _cropperSecond.enable = YES;
  _cropper.enable = YES;
}

- (void)tapCropButton{
  if ([_cropButton.currentTitle isEqualToString:@"Crop2"]) {
    [_cropperSecond finishCropping];
    _cropperSecond.enable = NO;
    _resultSecond.image = _cropperSecond.croppedImage;
    _cropperSecond.hidden = YES;
    [_cropButton setTitle:@"Back" forState:UIControlStateNormal];
    [_cropButton setTitle:@"Back" forState:UIControlStateHighlighted];
  }else
  {
    [_cropperSecond reset];
    
    _cropperSecond.hidden = NO;
    [_cropButton setTitle:@"Crop2" forState:UIControlStateNormal];
    [_cropButton setTitle:@"Crop2" forState:UIControlStateHighlighted];
    _resultSecond.image = nil;
  }
  _cropperSecond.enable = YES;
  _cropper.enable = YES;
}

#pragma mark - ImageCropperDelegate
- (void)changeMoveStateWithCropper:(UIPanGestureRecognizer*)gesture Crop:(ImageCropperView*)imageCrop{
  if (gesture.state == UIGestureRecognizerStateEnded) {    
    NSLog(@"点击编辑器结束,两个_cropper都可以进行编辑");
    _cropperSecond.enable = YES;
    _cropper.enable = YES;
  }
}


- (void)touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event;
{
//判断点击在控件上
  UITouch *touch = [touches anyObject];
  if ([_cropper pointInside:[touch locationInView:_cropper] withEvent:nil]) {
    NSLog(@"_cropper1 被触摸,禁用_cropper2");
    _cropperSecond.enable = NO;
  }else if ([_cropperSecond pointInside:[touch locationInView:_cropperSecond] withEvent:nil]){
    NSLog(@"_cropper2 被触摸,禁用_cropper1");
    _cropper.enable = NO;
  }
}

- (void)dealloc {
  [_cropperSecond release];
  [_cropButton release];
  [_resultSecond release];
  [super dealloc];
}
- (void)viewDidUnload {
  [self setCropperSecond:nil];
  [self setCropButton:nil];
  [self setResultSecond:nil];
  [super viewDidUnload];
}
@end