iOS开发基础3-UIImage
1.iOS开发基础1-第一个iOS程序2.iOS开发基础2-基础控件3.iOS开发基础6-懒加载、Plist 文件操作、字典转模型、自定义 View 详解4.iOS开发基础5-UIButton5.iOS开发基础4-图像资源
6.iOS开发基础3-UIImage
7.iOS开发基础14-KVC的应用与底层逻辑8.iOS开发基础13-深入理解 UITableView(二)9.iOS开发基础12-深入理解UITableView(一)10.iOS开发基础11-屏幕适配、Autolayout及 Masonry 框架11.iOS开发基础10-UIButton内边距和图片拉伸模式12.iOS开发基础9-提示框(UIAlertController)13.iOS开发基础8-UIScrollView14.iOS开发基础7-自定义构造方法、layoutSubviews、Xib文件与自定义View15.iOS开发基础30-UITabBarController16.iOS开发基础29-触摸事件及手势识别17.iOS开发基础28-数据存储与沙盒机制18.iOS开发基础27-导航控制器入栈与出栈机制及微博个人详情页19.iOS开发基础26-空20.iOS开发基础25-ARC和MRC深入探析21.iOS开发基础24-UIPickerView、UITextField、KVC、UIDatePicker、控制器及导航控制器22.iOS开发基础23-iOS开发中的Info.plist、UIApplication及其Delegate、UIWindow详解23.iOS开发基础22-键盘通知在iOS开发中的应用24.iOS开发基础21-深入理解通知、代理、KVO和Block在iOS开发中的应用25.iOS开发基础20-UITableView的全局及局部刷新、左滑操作与批量删除26.iOS开发基础19-深入理解和实现不等高的 UITableViewCell27.iOS开发基础18-深入理解 Objective-C Runtime 机制28.iOS开发基础16-使用 `NSTimer` 时避免内存泄露的技巧和最佳实践29.iOS开发基础15-KVO的应用与底层逻辑30.iOS开发基础65-iPad 开发指南31.iOS开发基础64-二维码32.iOS开发基础63-AVFoundation/MediaPlayer33.iOS开发基础62-音频播放34.iOS开发基础61-通讯录35.iOS开发基础60-传感器36.iOS开发基础59-内存优化37.iOS开发基础58-支付宝集成指南38.iOS开发基础57-换肤功能与静态库开发指南39.iOS开发基础56-UIDynamic物理引擎40.iOS开发基础55-利用 UIWindow 实现快速滚动到界面顶部41.iOS开发基础54-CoreLocation42.iOS开发基础53-MapKit 框架43.iOS开发基础47-iOS键盘44.iOS开发基础46-数据安全与HTTPS保护详解45.iOS开发基础45-UIWebview46.iOS开发基础44-网络编程之NSURLSession&AFN47.iOS开发基础43-CocoaPods48.iOS开发基础42-网络编程之文件下载与处理49.iOS开发基础41-网络编程之JSON和XML50.iOS开发基础40-网络编程之NSURLConnection51.iOS开发基础39-RunLoop52.iOS开发基础38-多线程之多图片下载及缓存处理53.iOS开发基础37-多线程之NSOperation54.iOS开发基础36-多线程之GCD55.iOS开发基础35-多线程之NSThread56.iOS开发基础34-多线程57.iOS开发基础33-核心动画(二)58.iOS开发基础33-核心动画(一)59.iOS开发基础32-Quartz2D(二)60.iOS开发基础32-Quartz2D(一)61.iOS开发基础31-Modal 与 Push 详解62.iOS开发基础76-iOS 开发中的属性修饰符详解63.iOS开发基础75-iOS开发中的Block深度解析64.iOS开发基础74-Swift他来了65.iOS开发基础73-24种性能优化技巧66.iOS开发基础72-Xcode 7 升级后的问题与解决方案详解67.iOS开发基础71-应用中的 StatusBar 详解68.iOS开发基础70-TCP与UDP69.iOS开发基础69-应用开发中的 Controller 间通信模式70.iOS开发基础68-图片轮播71.iOS开发基础67-流水布局相册缩放72.iOS开发基础66-UISearchBar 控件指南73.iOS开发基础78-iOS 国际化在iOS开发中,UIImage
和 UIImageView
是用于处理和显示图像的核心类。UIViewContentMode
则用于控制子视图在其父视图中的位置和缩放方式。下面我们将详细介绍这三个概念,并结合示例代码深入分析它们的用法和特点。
UIImage
UIImage
类表示一个图像对象,包含一个图像的像素数据,并提供了多种方法和属性来处理图像数据。
特点
- 支持多种图片格式:包括 PNG、JPEG、GIF 等等。
- 图片加载:从文件、数据、URL 或者内置资源中加载图片。
- 图片修改:进行拉伸、裁剪、缩放等图像处理。
用法示例
// 从文件加载图片
UIImage *imageFromFile = [UIImage imageNamed:@"example.png"];
// 从数据加载图片
NSData *imageData = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"https://example.com/image.png"]];
UIImage *imageFromData = [UIImage imageWithData:imageData];
// 调整大小
CGSize newSize = CGSizeMake(100, 100);
UIGraphicsBeginImageContext(newSize);
[imageFromFile drawInRect:CGRectMake(0, 0, newSize.width, newSize.height)];
UIImage *resizedImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
底层实现
UIImage
的底层实现主要依赖于 Core Graphics
框架,用于处理位图和向量图像。它通过 CGImage
对象来管理图像的实际像素数据,而 UIImage
本身是这些低级图像数据的高层次封装。
UIImageView
UIImageView
是一个用于显示 UIImage
对象的视图,它是 UIView
的子类。它不仅能显示静态图片,还能显示动画图片。
特点
- 高效的图片呈现:直接将
UIImage
对象渲染到视图中。 - 动画支持:可以显示一系列图片形成的动画。
- 内容模式:通过
UIViewContentMode
属性来控制图片在视图中的显示方式。
用法示例
UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(10, 110, 300, 200)];
imageView.image = [UIImage imageNamed:@"example.png"];
imageView.contentMode = UIViewContentModeScaleAspectFit;
[self.view addSubview:imageView];
// 设置动画图片
NSArray *imageArray = @[[UIImage imageNamed:@"frame1.png"], [UIImage imageNamed:@"frame2.png"], [UIImage imageNamed:@"frame3.png"]];
imageView.animationImages = imageArray;
imageView.animationDuration = 1.0; // 1秒一轮动画
[imageView startAnimating];
底层实现
UIImageView
的底层实现依赖于 Core Animation
。它通过 CALayer
的 contents
属性来显示图像,并通过 CABasicAnimation
等实现图片动画。具体来说,UIImageView
会根据 UIImage
的内容创建一个 CAContentLayer
,然后把图像数据存放在这个图层的 contents
属性中,最后通过 draw
方法进行渲染。
UIViewContentMode
UIViewContentMode
是 UIView
的一个属性,用于控制子视图在其父视图中的显示和对齐方式。常见的模式包括:
- scaleToFill:拉伸内容以填充视图边界(不按比例)。
- scaleAspectFit:按比例缩放内容以适应视图边界(内容可能会留空白)。
- scaleAspectFill:按比例缩放内容以填充视图边界(内容可能会裁剪)。
- center:不缩放,内容保持在视图中心。
用法示例
UIImageView *imageView1 = [[UIImageView alloc] initWithFrame:CGRectMake(10, 320, 100, 100)];
imageView1.image = [UIImage imageNamed:@"example.png"];
imageView1.contentMode = UIViewContentModeScaleToFill;
[self.view addSubview:imageView1];
UIImageView *imageView2 = [[UIImageView alloc] initWithFrame:CGRectMake(120, 320, 100, 100)];
imageView2.image = [UIImage imageNamed:@"example.png"];
imageView2.contentMode = UIViewContentModeScaleAspectFit;
[self.view addSubview:imageView2];
UIImageView *imageView3 = [[UIImageView alloc] initWithFrame:CGRectMake(230, 320, 100, 100)];
imageView3.image = [UIImage imageNamed:@"example.png"];
imageView3.contentMode = UIViewContentModeScaleAspectFill;
[self.view addSubview:imageView3];
UIImageView *imageView4 = [[UIImageView alloc] initWithFrame:CGRectMake(340, 320, 100, 100)];
imageView4.image = [UIImage imageNamed:@"example.png"];
imageView4.contentMode = UIViewContentModeCenter;
[self.view addSubview:imageView4];
总结
UIImage
优点:
- 支持多种格式。
- 多种初始化方式(文件、数据、URL等)。
- 提供图像处理功能(拉伸、裁剪、缩放等)。
缺点:
- 主要用于图像数据处理,不涉及图像展示。
底层逻辑:
- 基于
Core Graphics
,使用CGImage
管理像素数据。
UIImageView
优点:
- 高效展示图片。
- 支持图片动画。
- 支持不同的内容模式(通过
UIViewContentMode
)。
缺点:
- 仅用于图像展示,不处理图像数据。
底层逻辑:
- 基于
Core Animation
,通过CALayer
的contents
属性和动画实现。
UIViewContentMode
优点:
- 灵活控制子视图在父视图中的展示方式。
缺点:
- 仅控制视图内容的对齐和缩放,不涉及具体图像或图层。
总结
UIImage
是图像数据的封装,用于处理和操作图像。UIImageView
用于显示UIImage
对象,高效且支持动画。UIViewContentMode
控制内容在视图中的显示方式,提供多种模式适应不同需求。
理解这些类和属性的特点及底层逻辑,有助于在开发中更高效地使用它们,提高应用的性能和用户体验。
将来的你会感谢今天如此努力的你!
版权声明:本文为博主原创文章,未经博主允许不得转载。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· NetPad:一个.NET开源、跨平台的C#编辑器
· PowerShell开发游戏 · 打蜜蜂
· 凌晨三点救火实录:Java内存泄漏的七个神坑,你至少踩过三个!