前言:
之前項(xiàng)目中用到圖片瀏覽器萧求,由于需要高度的自定義括蝠,決定動(dòng)手寫個(gè)輪子(目前網(wǎng)上已經(jīng)有很多成熟的輪子TZImagePickerController) 當(dāng)時(shí)也下載了很多大概看了下思路基本都是一致的但是對(duì)于圖片的縮放一直達(dá)不到想要的效果(和微信一樣)
一、 圖片瀏覽器圖片的縮放效果對(duì)比
用一個(gè)具有代表性的圖片做代表
細(xì)長(zhǎng)得圖片
大多數(shù)的縮放效果.jpg
微信的效果.jpg
沒(méi)有對(duì)比就沒(méi)有傷害啊 不用我說(shuō)效果在這里擺著很明顯微信的更好一點(diǎn) (委婉一下)
二饭聚、論述下具體實(shí)現(xiàn)
- 大多數(shù)圖片瀏覽器都是以
imageview
的寬等于屏幕的寬然后imageview
的高度按圖片的寬高比進(jìn)行縮放 - 稍微改進(jìn)點(diǎn)的判斷圖片和是否小于屏幕小于屏幕及用圖片的寬高來(lái)設(shè)置
imageview
的寬高忌警,如果大于屏幕然后判斷如果寬和高哪個(gè)更大然后用更大的去等于屏幕相應(yīng)的尺寸然后另一邊按比例適配 - 重點(diǎn)的主要介紹的算法話不多說(shuō)直接上代碼
/**
根據(jù)需要放在多大的視圖上縮放圖片的尺寸
@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;
//圖片本身的長(zhǎng)寬比 *1000 為了保留小數(shù)點(diǎn)后三位
NSUInteger a = (self.size.height / self.size.width) * 1000;
//要適應(yīng)大小的長(zhǎng)寬比 *1000 為了保留小數(shù)點(diǎn)后三位
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);
}
這種方式按照?qǐng)D片的長(zhǎng)寬比 同 需要放置視圖的長(zhǎng)寬比做比較來(lái)做相應(yīng)的縮放 同時(shí)保證不是特別長(zhǎng)得圖片直接放在整個(gè)視圖中目前看來(lái)是能達(dá)到預(yù)期的效果。
后記:
效果是一致的就是不清楚微信具體是怎么實(shí)現(xiàn)的如若知道望指教多謝秒梳!