前言:
之前项目中用到图片浏览器,由于需要高度的自定义,决定动手写个轮子(目前网上已经有很多成熟的轮子TZImagePickerController) 当时也下载了很多大概看了下思路基本都是一致的但是对于图片的缩放一直达不到想要的效果(和微信一样)
一、 图片浏览器图片的缩放效果对比
用一个具有代表性的图片做代表
细长得图片


没有对比就没有伤害啊 不用我说效果在这里摆着很明显微信的更好一点 (委婉一下)
二、论述下具体实现
- 大多数图片浏览器都是以
imageview
的宽等于屏幕的宽然后imageview
的高度按图片的宽高比进行缩放 - 稍微改进点的判断图片和是否小于屏幕小于屏幕及用图片的宽高来设置
imageview
的宽高,如果大于屏幕然后判断如果宽和高哪个更大然后用更大的去等于屏幕相应的尺寸然后另一边按比例适配 - 重点的主要介绍的算法话不多说直接上代码
/**
根据需要放在多大的视图上缩放图片的尺寸
@param size 容器尺寸
@return 图片视图的尺寸
*/
- (CGRect)changeFrameWithSize:(CGSize)size{
if (CGSizeEqualToSize(size, CGSizeZero))return CGRectZero;
CGFloat imageWidthHeightRatio = self.size.width / self.size.height;
CGFloat width = 0.0;
CGFloat height = 0.0;
CGFloat x = 0.0;
CGFloat y = 0.0;
//图片本身的长宽比 *1000 为了保留小数点后三位
NSUInteger a = (self.size.height / self.size.width) * 1000;
//要适应大小的长宽比 *1000 为了保留小数点后三位
NSUInteger b = (size.height/size.width) * 1000;
if (a > b) {
height = a > 2500 ? self.size.height : size.height;
width = floor(height * imageWidthHeightRatio);
if (width > size.width) {
width = size.width;
height = floor(width/imageWidthHeightRatio);
}
} else {
width = size.width;
height = floor(width/imageWidthHeightRatio);
}
x = (width > size.width) ? 0 : (size.width - width) * 0.5;
y = (height > size.height) ? 0 : ((size.height - height) * 0.5);
return CGRectMake(x, y, width, height);
}
这种方式按照图片的长宽比 同 需要放置视图的长宽比做比较来做相应的缩放 同时保证不是特别长得图片直接放在整个视图中目前看来是能达到预期的效果。
后记:
效果是一致的就是不清楚微信具体是怎么实现的如若知道望指教多谢!
网友评论