嗦嘶话,第一次见到这个需求的时候,感觉很简单。不就是缩放,然后裁剪吗,加个旋转和快速恢复。
但似。做的时候,可就不这么想了。
因为:我要做的需要有弹簧效果,这就需要scroll做容器了。然而,调试缩放完后去切图,可就找不到原点了。裁剪出来的乱七八糟的。
找了很多github上的缩放的案例,没有一个合适的。只好自己造轮子了。
造出来之后,挺简单,这玩意儿就跟0->1似的,逻辑不跑通,你永远隔河远望,等你过了河,就觉得其实没啥。不废话,说思路:
缩放+裁剪+旋转+快速缩放-->见大家APP晒呗首页右上角按钮点击。
思路:
一:最下层是一个view,做总容器--我称之为绘图层
{// 绘图方法
#pragma mark - 绘制画布上的图
-(UIImage *)getScreenSnapshot{
CGSize imgSize = CGSizeMake(kSCREEN_WIDTH,kSCREEN_WIDTH);
UIGraphicsBeginImageContextWithOptions(imgSize, NO, [UIScreen mainScreen].scale);
// UIGraphicsBeginImageContext(imgSize);
CGContextRef context = UIGraphicsGetCurrentContext();
[self.contextRefView.layer renderInContext:context];
UIImage * img = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return img;
}
#pragma mark -剪切某图片某区域的图片
- (UIImage *)image:(UIImage *)image cropInRect:(CGRect)rect
{// 这个没用到
CGImageRef imageRef = CGImageCreateWithImageInRect([image CGImage], rect);
UIImage *cropped = [UIImage imageWithCGImage:imageRef];
CGImageRelease(imageRef);
return cropped;
}
}
二:倒数第二层,旋转层,还是一个uiview,用来旋转
旋转方法:
-(void)rotationImage:(UIButton *)sender{
NSInteger swich = self.direction%4;// 记得初始化
[UIView animateWithDuration:0.3 animations:^{
self.contentView.transform = CGAffineTransformMakeRotation(-90*swich *M_PI / 180.0);// 度数和速度自调
}];
self.direction++;//控制方向变化
}
三:再上一层,缩放层,放scrollview,手势缩放和快速缩放使用
#pragma mark - UIScrollViewDelegate
- (nullable UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView{
return self.showImage;
}
- (void)scrollViewDidZoom:(UIScrollView *)scrollView
{
CGFloat xcenter = scrollView.center.x , ycenter = scrollView.center.y;
//目前contentsize的width是否大于原scrollview的contentsize,如果大于,设置imageview中心x点为contentsize的一半,以固定imageview在该contentsize中心。如果不大于说明图像的宽还没有超出屏幕范围,可继续让中心x点为屏幕中点,此种情况确保图像在屏幕中心。
xcenter = scrollView.contentSize.width > scrollView.frame.size.width ? scrollView.contentSize.width/2 : xcenter;
ycenter = scrollView.contentSize.height > scrollView.frame.size.height ? scrollView.contentSize.height/2 : ycenter;
[self.showImage setCenter:CGPointMake(xcenter, ycenter)];
}
快速缩放使用了巧招
-(void)sizeBtnImage:(UIButton *)sender{
if (self.isScaleFit) {
self.scrollView.zoomScale = fillScale;// 这个比例为按短边填满,长边等比放大。
self.isScaleFit = NO;
}else{
self.scrollView.zoomScale = fitScale;// 这个比例为按长边填满,短边等比缩小。
self.isScaleFit = YES;
}
}
就是酱紫了,OK了