iOS UI基础控件之UIImageView

2024-03-16 16:38
文章标签 基础 ui ios 控件 uiimageview

本文主要是介绍iOS UI基础控件之UIImageView,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、UIImageView和UIImage

UIImageView是iOS中用于显示图片的类,UIImage是用于存储图片数据的类;iOS中几乎所有看到的图片数据都存储在UIImage中,同时所要的图片都是用UIImageView来显示;UIImageView和UIImage关系如下图:

UIImageView和UIImage的关系

二. 创建UIImageView的两种方式

1.自己设置图片位置和尺寸

“`
UIImageView *iv = [[UIImageView alloc] init]; //创建的图片, 没有默认的宽高
iv.backgroundColor = [UIColor redColor];
UIImage *image = [UIImage imageNamed:@”meinv.jpg”];
iv.image = image;

//自己设置图片位置和尺寸
iv.frame =  CGRectMake(100, 100, image.size.width, image.size.height);
[self.view addSubview:iv];

“`

2、使用默认图片尺寸和位置

    //默认宽高,为图片宽高,位置为00UIImageView *iv = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"meinv.jpg"]]; //推荐设置iv的frame,以便于设置图片的摆放位置//iv = CGRectMake(100, 100, image.size.width, image.size.height);iv.backgroundColor = [UIColor redColor];[self.view addSubview:iv];NSLog(@"%@",NSStringFromCGRect(iv.frame));

三. ContentMode属性


typedef NS_ENUM(NSInteger, UIViewContentMode) {UIViewContentModeScaleToFill,UIViewContentModeScaleAspectFit,      // contents scaled to fit with fixed aspect. remainder is transparentUIViewContentModeScaleAspectFill,     // contents scaled to fill with fixed aspect. some portion of content may be clipped.UIViewContentModeRedraw,              // redraw on bounds change (calls -setNeedsDisplay)UIViewContentModeCenter,              // contents remain same size. positioned adjusted.UIViewContentModeTop,UIViewContentModeBottom,UIViewContentModeLeft,UIViewContentModeRight,UIViewContentModeTopLeft,UIViewContentModeTopRight,UIViewContentModeBottomLeft,UIViewContentModeBottomRight,
};规律:但凡取值中包含Scale单词的, 都会对图片进行拉伸(缩放)但凡取值中没有出现Scale单词的, 都不会对图片进行拉伸UIViewContentModeScaleToFill,> 会按照UIImageView的宽高比来拉伸图片> 直到让整个图片都填充UIImageView为止> 因为是按照UIImageView的宽高比来拉伸, 所以图片会变形规律:但凡取值中包含Aspect单词的, 都会按照图片的宽高比来拉伸> 因为是按照图片的宽高比来拉伸, 所以图片不会变形UIViewContentModeScaleAspectFit,> 会按照图片的宽高比来拉伸> 要求整张图片都必须在UIImageView的范围内> 并且宽度和高度其中一个必须和UIImageView一样> 居中显示UIViewContentModeScaleAspectFill,> 会按照图片的宽高比来拉伸> 要求整张图片必须填充UIImageView> 并且图片的宽度或者高度其中一个必须和UIImageView一样

四. 剪裁超出部分属性

    观察下面运行效果,理解clipsToBounds属性// 1.创建一个UIImageViewUIImageView *iv = [[UIImageView alloc] init];// 2.设置相关属性iv.backgroundColor = [UIColor redColor];iv.image = [UIImage imageNamed:@"meinv.jpg"];iv.contentMode = UIViewContentModeLeft;// 3.设置frameiv.frame = CGRectMake(100, 100, 200, 200);// 剪切超出的部分iv.clipsToBounds = YES;[self.view addSubview:iv];

五. UIImageView动画

- (IBAction)run:(UIButton *)sender
{NSMutableArray *arrM = [NSMutableArray array];// 1.创建多张图片for (int i = 1; i <= 6; i++) {NSString *imageNmae = [NSString stringWithFormat:@"run_%i", i];UIImage *image = [UIImage imageNamed:imageNmae];// 2.将所有的图片放到数组中[arrM addObject:image];}// 3.将保存了所有图片的数组赋值给UIImageViewself.containerView.animationImages = arrM;// 设置重复次数,0,代表无线self.containerView.animationRepeatCount = 1; //设置一次动画所需时间self.containerView.animationDuration = 1;// 开始动画[self.containerView startAnimating]; 
}- (IBAction)stop:(id)sender {//判断是否正在动画if([self.containerView isAnimating]){//停止动画[self.containerView stopAnimating];}
}

六. UIImageView性能优化问题

问题描述: 如果直接用 UIImage *image = [UIImage imageNamed:imageNmae];加载图片,图片会自动到内存中缓存起来. 这时,当加载多张图片后,假如执行动画,就会导致,内存暴增,而且当动画执行完毕之后,也不会释放。

解决方案:
//使用initWithContentOfFile:方法直接从mainBundle,app根目录中加载图片,
//这样如果遇到上述问题,在执行完动画之后,图片会自动释放..NSString *imageNmae = [NSString stringWithFormat:@"%@_%i", prefix, i];
imageNmae = [[NSBundle mainBundle] pathForResource:imageNmae ofType:@"png"];
UIImage *image = [[UIImage alloc] initWithContentOfFile:imageName];代替UIImage *image = [UIImage imageNamed:imageNmae];

七. 图片拉伸

为什么要让图片拉伸?

如果我们要设置背景图片,如按钮,当我们直接实用图片时(有时美工也会给我们一张可拉伸小图片),可能图片会被系统拉伸变形,变得很丑,严重影响美观!

图片拉伸就是为了解决如上问题而存在的,让图片在拉伸时,保证图片不变形
图片拉伸历史过程:

- (void)viewDidLoad {[super viewDidLoad];UIButton *btn = [[UIButton alloc]init];btn.frame = CGRectMake(100, 100, 200, 100);//旧图片UIImage *image = [UIImage imageNamed:@"common_button_blue_highlighted"];//可以指定平铺还是拉伸,得到一张新图片//指定受保护的区域UIEdgeInsets insets = UIEdgeInsetsMake(5, 5, 5, 5);UIImage *newImage =  [image resizableImageWithCapInsets:insets resizingMode:UIImageResizingModeStretch];//按钮设置背景[btn setBackgroundImage:newImage forState:UIControlStateNormal];[self.view addSubview:btn];}

对于图片的处理还有很多,大家可以上网搜索,这里给大家推荐一篇:
http://blog.csdn.net/hastar521/article/details/49122607

这篇关于iOS UI基础控件之UIImageView的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/816066

相关文章

0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeek R1模型的操作流程

《0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeekR1模型的操作流程》DeepSeekR1模型凭借其强大的自然语言处理能力,在未来具有广阔的应用前景,有望在多个领域发... 目录0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeek R1模型,3步搞定一个应

Vue项目中Element UI组件未注册的问题原因及解决方法

《Vue项目中ElementUI组件未注册的问题原因及解决方法》在Vue项目中使用ElementUI组件库时,开发者可能会遇到一些常见问题,例如组件未正确注册导致的警告或错误,本文将详细探讨这些问题... 目录引言一、问题背景1.1 错误信息分析1.2 问题原因二、解决方法2.1 全局引入 Element

C#实现WinForm控件焦点的获取与失去

《C#实现WinForm控件焦点的获取与失去》在一个数据输入表单中,当用户从一个文本框切换到另一个文本框时,需要准确地判断焦点的转移,以便进行数据验证、提示信息显示等操作,本文将探讨Winform控件... 目录前言获取焦点改变TabIndex属性值调用Focus方法失去焦点总结最后前言在一个数据输入表单

Python中的可视化设计与UI界面实现

《Python中的可视化设计与UI界面实现》本文介绍了如何使用Python创建用户界面(UI),包括使用Tkinter、PyQt、Kivy等库进行基本窗口、动态图表和动画效果的实现,通过示例代码,展示... 目录从像素到界面:python带你玩转UI设计示例:使用Tkinter创建一个简单的窗口绘图魔法:用

MySQL中my.ini文件的基础配置和优化配置方式

《MySQL中my.ini文件的基础配置和优化配置方式》文章讨论了数据库异步同步的优化思路,包括三个主要方面:幂等性、时序和延迟,作者还分享了MySQL配置文件的优化经验,并鼓励读者提供支持... 目录mysql my.ini文件的配置和优化配置优化思路MySQL配置文件优化总结MySQL my.ini文件

element-ui下拉输入框+resetFields无法回显的问题解决

《element-ui下拉输入框+resetFields无法回显的问题解决》本文主要介绍了在使用ElementUI的下拉输入框时,点击重置按钮后输入框无法回显数据的问题,具有一定的参考价值,感兴趣的... 目录描述原因问题重现解决方案方法一方法二总结描述第一次进入页面,不做任何操作,点击重置按钮,再进行下

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

安卓链接正常显示,ios#符被转义%23导致链接访问404

原因分析: url中含有特殊字符 中文未编码 都有可能导致URL转换失败,所以需要对url编码处理  如下: guard let allowUrl = webUrl.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) else {return} 后面发现当url中有#号时,会被误伤转义为%23,导致链接无法访问

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

【Linux 从基础到进阶】Ansible自动化运维工具使用

Ansible自动化运维工具使用 Ansible 是一款开源的自动化运维工具,采用无代理架构(agentless),基于 SSH 连接进行管理,具有简单易用、灵活强大、可扩展性高等特点。它广泛用于服务器管理、应用部署、配置管理等任务。本文将介绍 Ansible 的安装、基本使用方法及一些实际运维场景中的应用,旨在帮助运维人员快速上手并熟练运用 Ansible。 1. Ansible的核心概念