iOS 根据UIImage 修改UIImageView Frame (包括截取图片中间部分)
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;
}
iOS 根据UIImage 修改UIImageView Frame (包括截取图片中间部分)的更多相关文章
- ios的UIImage的两种不同的图片加载方式 tom猫
在ios的UI交互设计时,对图片的处理是难免的:不同的处理方式会对内存有不同的影响: ********************************************************* ...
- iOS UIView 快速修改 frame,
在iOS开发布局修改 frame 时需要繁琐的代码实现,今天偶尔看到一播客说到快速修改的 frame 的方法,自己动手写了一遍实现代码. 快速实现主要通过 添加类目的方式,对UIView 控件添加了一 ...
- 关于UIImageView的显示问题——居中显示或者截取图片的中间部分显示
我们都知道在ios中,每一个UIImageView都有他的frame大小,但是如果图片的大小和这个frame的大小不符合的时候会怎么样呢?在默认情况,图片会被压缩或者拉伸以填满整个区域. 通过查看UI ...
- iOS Webview 实现修改javascript confirm 和 alert
贴代码: @interface UIWebView (JavaScriptAlert) -(void) webView:(UIWebView *)sender runJavaScriptAlertPa ...
- IOS 截取图片 部分 并生成新图片
/** * 从图片中按指定的位置大小截取图片的一部分 * * @param image UIImage image 原始的图片 * @param rect CGRect rect 要截取的区域 * * ...
- ios 动画 创建一个UIImageView并将其属性设置animationImages为UIImages 的数组
NSArray *animationFrames = [NSArray arrayWithObjects: [UIImage imageWithName:@"image1.png" ...
- SQL SERVER 2005修改数据库名称,包括物理文件名和逻辑名称
SQL SERVER 2005修改数据库名称,包括物理文件名和逻辑名称 原来数据库名称为 aa,物理文件名称为 aa.mdf 和 aa_log.ldf: 需要修改数据库名称为 bb,物理文件名 ...
- 李洪强iOS开发之-修改状态栏的字体的颜色
李洪强iOS开发之-修改状态栏的字体的颜色 修改的效果: -(void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; [ ...
- iOS开发系列-修改项目工程名
当前有项目工程名为iOS,需要修改工程名为IFLY.在修改前注意备份项目 修改项目名 出现弹框,点击Rename 修改工程目录文件名 注意Tests与UITests不要删除 选中IFLY.xcodep ...
随机推荐
- IOS 键盘 禁止输入字母
在开发中有时候需要数字键盘,但是设置textfield为默认数字键后, 在模拟器上如果用电脑键盘仍然可以输入字母, 在真机上如果使用搜狗等其他输入法也可能会出现可以输入字母的情况.解决方法如下,在te ...
- Oracle简单的函数语言
函数:这里的函数相当于java中写好的一些方法,有名字,可以传递参数,实现某一项具体功能. 函数分为: 1.单行函数 1.字符函数 2.日期函数 3.数字函数 4.转换函数 2.分组函数(后面的章节再 ...
- sql2008 表名为全数字时查询报错
今天遇到个很奇葩的问题,在写一个应用程序时需要查询表的数据,但是表名是全数字的,直接查询会报错,于是想到给111的表名加一对中括号:即——>select * from [111] 刚开始还是报错 ...
- Query Designer中的特征限制(Characteristic Restrictions)、缺省值(Default Values)、自由特性(Free Characteristics)
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...
- 轻松解决Linux安装Eclipse方法
随着Linux的发展,很多人开始学习Linux系统,你了解Linux系统么?你是Linux系统的应用者么?本文为你详细介绍Linux安装Eclipse,为你在学习Linux安装Eclipse时起一定的 ...
- Google Protocol Buffer的安装与.proto文件的定义
什么是protocol Buffer呢? Google Protocol Buffer( 简称 Protobuf) 是 Google 公司内部的混合语言数据标准. 我理解的就是:它是一种轻便高效的结构 ...
- MFC编程入门之十二(对话框:非模态对话框的创建及显示)
上一节讲了模态对话框及其弹出过程,本节接着讲另一种对话框--非模态对话框的创建及显示. 非模态对话框显示后,程序其他窗口仍然能正常运行,可以响应用户输入,还可以相互切换.上一讲中创建的Tip模态对话框 ...
- ASP.NET MVC Html.Partial/Html.RenderPartial/Html.Action/Html.RenderAction区别
1. @Html.Raw() 方法输出带有html标签的字符串: <div style="margin:10px 0px 0px;border:1px;border-color:red ...
- ORACLE分页查询SQL语法——最高效的分页
--1:无ORDER BY排序的写法.(效率最高)--(经过测试,此方法成本最低,只嵌套一层,速度最快!即使查询的数据量再大,也几乎不受影响,速度依然!) SELECT * FROM (SELECT ...
- 新建web工程Jdk怎么不是自己安装的, 是自带的
需要在eclipse中配置默认的jdk环境的,不要用它默认的那个,这个不能用的http://blog.csdn.net/clj198606061111/article/details/11881575 ...