iOS UIImageView 根據需求調整frame
1、圖片的寬和高不相等,截取圖片的中間部分,截取的部分Size明確
2、圖片的寬度要等於其父視圖的類的寬度,然后根據寬度計算高度,保證
圖片不變形,顯示正常
3、圖片的寬度或高度大於其父視圖的類的寬的或高度,如果是寬度的問題,
就以其父視圖的寬度為准,確定圖片的顯示寬度;如果是高度的問題,就以
其父視圖的高度為准,確定圖片的顯示高度。
以上三種情況,具體示例依次如下:
第一種情況,調用方法:
- (void)imageLoadedFinish:(UrlImageView *)oldImageView image:(UIImage *)imageV skuInfo:(NSDictionary *)skuInfo
{
截取的目標尺寸
float imgW = (WIN_SIZE.width-40)/3;
//截取中間部分
oldImageView.image = [self squareImageFromImage:imageV scaledToSize:imgW];
}
---截圖操作 //截取中間部分
- (UIImage *)squareImageFromImage:(UIImage *)image scaledToSize:(CGFloat)newSize
{
--縮放比例
CGAffineTransform scaleTransform;
CGPoint origin;
圖片大小大於圖片高度的情況
if (image.size.width > image.size.height)
{
//image原始高度為200,縮放image的高度為400pixels,所以縮放比率為2
計算縮放比例
CGFloat scaleRatio = newSize / image.size.height;
scaleTransform = CGAffineTransformMakeScale(scaleRatio, scaleRatio);
//設置繪制原始圖片的畫筆坐標為CGPoint(-100, 0)pixels
計算畫筆的X軸
origin = CGPointMake(-(image.size.width - image.size.height) / 2.0f, 0);
} else
{
圖片的高度大於寬度的情況
CGFloat scaleRatio = newSize / image.size.width;
scaleTransform = CGAffineTransformMakeScale(scaleRatio, scaleRatio);
計算畫筆的Y軸
origin = CGPointMake(0, -(image.size.height - image.size.width) / 2.0f);
}
CGSize size = CGSizeMake(newSize, newSize);
//創建畫板為(400x400)pixels
if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)])
{
UIGraphicsBeginImageContextWithOptions(size, YES, 0);
} else
{
UIGraphicsBeginImageContext(size);
}
CGContextRef context = UIGraphicsGetCurrentContext();
//將image原始圖片(400x200)pixels縮放為(800x400)pixels
CGContextConcatCTM(context, scaleTransform);
//origin也會從原始(-100, 0)縮放到(-200, 0)
[image drawAtPoint:origin];
//獲取縮放后剪切的image圖片
image = UIGraphicsGetImageFromCurrentImageContext();
結束畫板繪制
UIGraphicsEndImageContext();
return image;
}
第二種情況:
//等比例縮放
{ 得到當前視圖的frame
CGSize selfSize = self.frame.size;
得到image的frame
CGSize imageSize = imageV.size;
得到imageView 的frame
CGRect imageVRect = self.imageView.frame;
確定imageView 的寬度
imageVRect.size.width = selfSize.width;
根據寬度計算imageView 的高度
imageVRect.size.height = imageVRect.size.width*imageSize.height/imageSize.width;
//計算x,y
imageVRect.origin.x = 0;
imageVRect.origin.y = 0;
self.imageView.frame = imageVRect;
CGRect selfRect = self.frame;
selfRect.size.width = imageVRect.size.width;
selfRect.size.height = imageVRect.size.height;
self.frame = selfRect;
}
第三種情況:
//等比例縮放
(void)imageLoadedFinish:(UrlImageView *)oldImageView image:(UIImage *)imageV skuInfo:(NSDictionary *)skuInfo
{
得到當前視圖的frame
CGSize selfSize = self.frame.size;
得到當前Image的frame
CGSize imageSize = imageV.size;
得到當前ImageView 的frame
CGRect imageVRect = self.imageView.frame;
image的寬度大於當前視圖的寬度
if(imageSize.width > selfSize.width)
{
根據寬度計算高度,確定寬度
imageVRect.size.height = selfSize.width * imageSize.height / imageSize.width;
imageVRect.size.width = selfSize.width;
}
image的高度大於當前視圖的高度
if(imageVRect.size.height > selfSize.height)
{
根據高度計算寬度,確定寬度
imageVRect.size.width = selfSize.height * imageVRect.size.width / imageVRect.size.height;
imageVRect.size.height = selfSize.height;
}
//計算x,y
imageVRect.origin.x = (selfSize.width-imageVRect.size.width)/2;
imageVRect.origin.y = (selfSize.height-imageVRect.size.height)/2;
self.imageView.frame = imageVRect;
}
