viewController 中有两个imageView,其中一张有倾斜(imageView的transform属性发生改变),将这两张image合成一张,保持相对的位置不变。
效果大致如下图(第二张的位置有问题)
viewController 中有两个imageView,其中一张有倾斜(imageView的transform属性发生改变),将这两张image合成一张,保持相对的位置不变。
效果大致如下图(第二张的位置有问题)
有些乱但最终还是解决了实际的问题!
- (UIImage *)saveImageWithUIImage:(UIImage *)srcImage{
//要绘制的实际image
UIImage *mergeImage = srcImage;
UIGraphicsBeginImageContext(mergeImage.size);
CGContextRef context = UIGraphicsGetCurrentContext();
/*
*背景image绘制到上下文中
*/
[mergeImage drawInRect:(CGRect){0, 0, mergeImage.size.width, mergeImage.size.height}];
//imageView上的所有子视图
for (UIView *view in [self.baseView subviews]) {
if ([view isKindOfClass:[ZDStickerView class]]) {
ZDStickerView *stickerView = (ZDStickerView *)view;
/*
* step_1.1 :移动坐标中心点至要绘制view的中心
*/
CGPoint translateCenter = [self getTranslatePositionWithImageSize:mergeImage.size imageViewSize:self.baseView.bounds.size originPosition:stickerView.layer.position contentModle:self.baseView.contentMode];
CGContextTranslateCTM(context, translateCenter.x, translateCenter.y);
/*
* step_1.2 :移动坐标中心点至要绘制view的左上角
*/
CGPoint traslateCorner = [self getTranslateCornerPositionWithScaleRate:[self getScaleRateWithImageSize:mergeImage.size imageViewSize:self.baseView.bounds.size contentMode:self.baseView.contentMode] layerSize:stickerView.endScaleSize transformAngle:stickerView.endDeltaAngle];
CGContextTranslateCTM(context, traslateCorner.x, traslateCorner.y);
/*
* step_2 : 旋转坐标
*/
CGContextRotateCTM(context, stickerView.endDeltaAngle);
/*
* step_3 : 绘制
*/
CGSize t_size = [self getTranslateSizeWithImageSize:mergeImage.size imageViewSize:self.baseView.bounds.size originSize:stickerView.endScaleSize contentMode:self.baseView.contentMode];
UIImageView *drawImageView = (UIImageView *)stickerView.contentView;
[drawImageView.image drawInRect:(CGRect){0, 0, t_size.width, t_size.height}];
/*
* step_4 : 恢复坐标系
*/
CGContextRotateCTM(context, -stickerView.endDeltaAngle);
CGContextTranslateCTM(context, -traslateCorner.x, -traslateCorner.y);
CGContextTranslateCTM(context, -translateCenter.x, -translateCenter.y);
}
}
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return image;
}
(float)getScaleRateWithImageSize:(CGSize)imageSize imageViewSize:(CGSize)viewSize contentMode:(UIViewContentMode)mode{
if (mode == UIViewContentModeScaleAspectFill) {
return [self getScaleRateWithImageSize:imageSize imageViewSize:viewSize];
}else{
float viewRate = viewSize.width / viewSize.height;
float imageRate = imageSize.width / imageSize.height;
float rate = 1.0f;
/*
* image按竖直方上的比率压缩
/
if (viewRate > imageRate) {
rate = imageSize.height / viewSize.height;
}
/
* image按水平方上的比率压缩
*/
else{
rate = imageSize.width / viewSize.width;
}
return rate;
}
return 1.0;
}
(float)getScaleRateWithImageSize:(CGSize)imageSize imageViewSize:(CGSize)viewSize{
float viewRate = viewSize.width / viewSize.height;
float imageRate = imageSize.width / imageSize.height;
float rate = 1.0f;
/*
(CGPoint)getTranslatePositionWithImageSize:(CGSize)imageSize imageViewSize:(CGSize)viewSize originPosition:(CGPoint)position contentModle:(UIViewContentMode)mode{
if (mode == UIViewContentModeScaleAspectFill) {
return [self getTranslatePositionWithImageSize:imageSize imageViewSize:viewSize originPosition:position];
}else{// --- UIViewContentModeScaleAspectFit ---
float viewRate = viewSize.width / viewSize.height;
float imageRate = imageSize.width / imageSize.height;
float position_x = 0.0f;
float position_y = 0.0f;
/*
* image按竖直方上的比率压缩
*/
if (viewRate > imageRate) {
float actualViewWidth = imageSize.width * (viewSize.height / imageSize.height);
float distanceToLeft = (actualViewWidth - viewSize.width) * 0.5;
position_x = position.x + distanceToLeft;
position_y = position.y;
position_x *= imageSize.height / viewSize.height;
position_y *= imageSize.height / viewSize.height;
}
/*
* image按水平方上的比率压缩
*/
else{
float actualViewHeight = imageSize.height * (viewSize.width / imageSize.width);
float distanceToTop = (actualViewHeight - viewSize.height) * 0.5;
position_x = position.x;
position_y = position.y + distanceToTop;
position_x *= imageSize.width / viewSize.width;
position_y *= imageSize.width / viewSize.width;
}
return (CGPoint){position_x,position_y};
}
return CGPointZero;
}
(CGPoint)getTranslatePositionWithImageSize:(CGSize)imageSize imageViewSize:(CGSize)viewSize originPosition:(CGPoint)position{
float viewRate = viewSize.width / viewSize.height;
float imageRate = imageSize.width / imageSize.height;
float position_x = 0.0f;
float position_y = 0.0f;
/*
(CGSize)getTranslateSizeWithImageSize:(CGSize)imageSize imageViewSize:(CGSize)viewSize originSize:(CGSize)size contentMode:(UIViewContentMode)mode{
if (mode == UIViewContentModeScaleAspectFill) {
return [self getTranslateSizeWithImageSize:imageSize imageViewSize:viewSize originSize:size];
}else{
float viewRate = viewSize.width / viewSize.height;
float imageRate = imageSize.width / imageSize.height;
float size_w = size.width;
float size_h = size.height;
/*
* image的宽按比例缩放,竖向上得到裁剪
*/
if (viewRate > imageRate) {
float rate = imageSize.height / viewSize.height;
size_w *= rate;
size_h *= rate;
}
/*
* image的高按比例缩放,横向上得到裁剪
*/
else{
float rate = imageSize.width / viewSize.width;
size_w *= rate;
size_h *= rate;
}
return (CGSize){size_w,size_h};
}
}
/*
*甲片在绘图上下文中的尺寸
*/
- (CGSize)getTranslateSizeWithImageSize:(CGSize)imageSize imageViewSize:(CGSize)viewSize originSize:(CGSize)size{
float viewRate = viewSize.width / viewSize.height;
float imageRate = imageSize.width / imageSize.height;
float size_w = size.width;
float size_h = size.height;
/*
* image的宽按比例缩放,竖向上得到裁剪
*/
if (viewRate > imageRate) {
float rate = imageSize.width / viewSize.width;
size_w *= rate;
size_h *= rate;
}
/*
* image的高按比例缩放,横向上得到裁剪
*/
else{
float rate = imageSize.height / viewSize.height;
size_w *= rate;
size_h *= rate;
}
return (CGSize){size_w,size_h};
}
//对角线与x轴的夹角
- (float)programWithWidth:(float)w height:(float)h{
float p = [self halfDiagonalLengthWithWidth:w height:h];
float dis = 0 - w * 0.5;
float dis_p = dis / p;
return acosf(dis_p);
}
//对角线的一半
- (float)halfDiagonalLengthWithWidth:(float)w height:(float)h{
return sqrtf(w * w / 4.0 + h * h / 4.0);
}
楼主你好,我想问一下那个self.baseView是什么类啊(自定义的?),stickerView.endScaleSize,stickerView.endDeltaAngle的属性哪里来的啊,我下载ZDStickerView里面没有啊,谢谢啊!
2 回答3.2k 阅读
2 回答1.1k 阅读
1 回答1k 阅读✓ 已解决
1 回答2.7k 阅读
1 回答1.7k 阅读
1 回答1.4k 阅读
1.7k 阅读
设置第二张imageView.layer.zPosition = CGPointMake(.5, 1);
注意frame会改变 自己setFrame一下 这个时候frame的参考点变成下边中间的点了