从 0 开发一款 iOS App
朱德权
腾讯高级工程师
24183 人已学习
新⼈⾸单¥59
课程目录
已完结/共 106 讲
第一章:课程简介和开发前的准备 (4讲)
第二章:实现App的基本界面 (33讲)
第三章:实现App的基础功能 (35讲)
时长 18:24
第四章:App功能扩展和完善 (34讲)
从 0 开发一款 iOS App
登录|注册
留言
7
收藏
沉浸
阅读
分享
手机端
回顶部
当前播放: 24 | iOS中图片的展示:UIImage与UIImageView的应用
00:00 / 00:00
高清
  • 高清
1.0x
  • 2.0x
  • 1.5x
  • 1.25x
  • 1.0x
  • 0.75x
  • 0.5x
网页全屏
全屏
00:00
付费课程,可试看
01 | 课程介绍
02 | 内容综述
03 | 常见App类型及技术栈浅析
04 | 使用Xcode创建第一个工程
05 | MVC模式:iOS中的架构基石
06 | iOS中的视图UIView
07 | 了解UIView的生命周期
08 | 视图的控制器UIViewController
09 | 结合视图和控制器构建Tabbar样式页面
10 | 使用Navigation构建App的基础交互
11 | iOS基本页面框架的构成和实现
12 | 系统函数中常见模式Delegate
13 | UITableView简介
14 | UITableView中Delegate和Datasource的使用
15 | UITableViewCell的复用及原理
16 | 结合子视图实现完整的列表界面
17 | UICollectionView的基本应用和实现
18 | UICollectionViewLayout的应用
19 | 基本列表视图的选择和使用
20 | 滚动视图的基类UIScrollView简介
21 | 应用UIScrollViewDelegate实现复杂逻辑
22 | iOS中滚动视图对比及App内应用场景浅析
23 | iOS中文字的展示:UILabel的使用与布局
24 | iOS中图片的展示:UIImage与UIImageView的应用
25 | iOS中按钮的实现:UIButton的使用
26 | UIControl以及Target-Action模式
27 | 使用UIGestureRecognizer实现自定义点击与手势
28 | 通过UIAlertView了解UIKit系统函数的设计和使用
29 | Web基础知识及WKWebView 介绍
30 | 使用WKWebView及Delgate实现简单的页面加载
31 | 认识观察者模式KVO并展示页面加载进度
32 | iOS开发中的Web应用浅析
33 | 使用UIView动画完善界面的交互
34 | 动画背后的CALayer基本应用
35 | CoreAnimation及开源动画框架介绍
36 | 常用代码规范和重构方式
37 | 结合UIKit分析常用App的页面结构
38 | 网络基础及请求的封装
39 | NSURLSession基础原理、组织和使用
40 | 使用系统网络架构NSURLSession加载网络数据
41 | 常用框架集成方式Submodule、Carthage和CocoaPods对比和使用
42 | 集成和使用开源网络框架
43 | iOS中的JSON解析
44 | 使用结构化的数据进行解析和展示
45 | 实现列表数据加载、解析和展示的完整流程
46 | iOS沙盒机制和文件结构
47 | 使用NSFileManager操作和管理文件
48 | iOS中的序列化NSCoding
49 | 开源存储方案对比与分析
50 | 缓存新闻列表数据及已读状态
51 | iOS中线程的基础知识及NSThread
52 | GCD的常用方法分析和使用
53 | 了解Operation、Runloop以及多线程开发总结
54 | 如何管理App中的图片下载与存储
55 | 开源图片框架接触的架构和使用
56 | 了解iOS系统的音视频框架
57 | 重构视频列表展示视频
58 | 实现简单视频播放器AVPlayer
59 | iOS消息机制NSNotification简介
60 | 使用Notification接收和处理播放状态通知
61 | 使用KVO监听和处理播放资源的状态变化
62 | CMTime及播放缓冲进度的获取和使用
63 | 使用单例模式重构播放器业务逻辑
64 | 常用App视频业务及流程浅析
65 | AutoLayout简介
66 | 使用AutoLayout实现通用ToolBar视图
67 | iOS常用布局方式选择
68 | 逻辑分辨率适配
69 | 物理分辨率适配
70 | 使用ImageAsset管理图片资源
71 | iPhone X适配
72 | iOS开发适配常用方法总结
73 | App启动过程及生命周期分析
74 | 通过App生命周期回调实现启动页
75 | 使用URL Scheme进行App间的唤起和通信
76 | Universal Link简介
77 | 常用组件化Target-Action方案
78 | 常用组件化URL Scheme方案
79 | 常用组件化Protocol-Class方案
80 | 实现简单的第三方登录和分享功能
81 | iOS中静态库的制作和使用
82 | iOS当中Framework的制作和使用
83 | OAuth和OpenID原理和使用
84 | 集成QQ SDK实现登录和分享功能
85 | iOS中常用日志和上报系统浅析
86 | 类CocoaLumberjack日志框架架构浅析
87 | Crash的类型介绍和常用收集方案
88 | 常用上报技术方案对比和分析
89 | iOS中定位和定位权限
90 | 定位功能实现和位置信息的获取
91 | iOS中推送和推送权限
92 | 使用UserNotifications实现本地推送
93 | 远程推送与APNs简介
94 | 使用UserNotifications接收远程推送
95 | iOS图标管理和动态更新
96 | iOS App Extension简介
97 | 实现Today Extension以及数据共享
98 | UITextField和UITextView
99 | 使用UITextField实现搜索条
100 | 使用UITextView实现输入框
101 | 复杂列表页实现方案及IGListKit浅析
102 | 复杂内容页展示逻辑及实现方案浅析
103 | App的签名原理和证书申请
104 | 常用iOS唯一标识符
105 | App的打包和上架流程
106 | 结课测试&结束语
本节摘要

PDF 课件和源代码下载地址:

https://gitee.com/geektime-geekbang/geektime-ios-course

登录 后留言

全部留言(7)

  • 最新
  • 精选
VHJM
https://github.com/plusend/SampleApp/tree/master/SampleApp 这个是我的代码,麻烦老师了。

作者回复: 两个小问题哈 1. 那张图片名称是 “timg” .. 我之后修改下 2.使用imageNamed这个函数,对于png图片是可以忽略扩展名的,其它类型的图片需要加上扩展名,这张图片是jpeg的,所以应该是[UIImage imageNamed:@"icon.bundle/timg.jpeg"],相关的文档可以在https://developer.apple.com/documentation/uikit/uiimage/1624146-imagenamed中看到,在讲解的demo中都加入了扩展名,建议也都加上哈。 3. 具体本地图片都管理和适配,在后续都课程中会有单独讲解

2019-05-30
2
JackYang
老师,你好,在加载图片的时候遇到了一个问题: 用模拟器iphone11,在tableView中打印的屏幕宽度 self.view.frame.size.width是 414 ,但是在cell中增加image的时候打印cell的宽度却是320, 更神奇的是此时设置 cell 背景颜色运行出来却是充满一行的(按道理说不是应该是320的宽度颜色吗?),不知道什么原因 [self.contentView addSubview:({ self.rightImageView = [[UIImageView alloc]init]; self.rightImageView.frame = CGRectMake(320, 10, 80, 80); self.rightImageView.backgroundColor = [UIColor redColor]; self.contentView.backgroundColor = [UIColor greenColor]; //cell背景充满一行 NSLog(@"cell.contentView------>%f",self.contentView.frame.size.width);// 打印宽度 320 NSLog(@"cell.contentView------>%f",self.frame.size.width); // 打印宽度 320 self.rightImageView; })];

作者回复: view是414,展示出来的cell宽度也是414。为什么在你log中打印出来的是320呢,因为这个是一个初始化的默认状态。当我们使用initWithStyle创建cell的时候,是没有给cell赋值frame的,所以系统会分配给cell 320的默认宽度,而cell初始化结束,即将进入willdisplay的时候,系统内部会对cell进行frame的重新赋值,我们可以重写cell的 setFrame方法并加上断点,可以看到cell 在init的时候默认设置了320,之后系统函数_configCellForDisplay时会再次的setFrame为正确的宽度414,这也就印证了,我们在cellForRowAtIndexPath这个函数中取到的宽度是错误的,但是在willDisplayCell这个delegate中取到的cell宽度是正确的。以上其实也是我们使用UITableView需要注意的一个问题,就是我们的复杂UI计算和布局,其实尽量应该写在willDisplayCell而不是cellForRowAtIndexPath。当然简单一致的逻辑是没区别的,同时我们也可以在cell的setFrame中重新触发layout来避免这个问题。

2020-05-13
1
夏小鹏吖~
我不明白 为什么要修饰这几个property title source time comment 什么时候适合修饰呢 什么时候不用修饰呢

作者回复: 在OC中, @property 修饰的其实就是我们常说的实例变量。当然和其它语言的实例变量一样,我们可以在类的内部任何的函数中来使用和修改它。当然对于OC中,使用@property编译器会自动添加实例变量的setter和getter方法等等。在自动生成方法的同时,也提供了多种关键字来控制变量的一些额外的特性,比如readonly、readwrite、assign、weak等等,通常不特殊声明使用的都是默认的关键字,有特殊情况的时候我们才会使用,比如我们不想持有一个外部对象的时候,就会使用weak关键字。具体深入的了解可以看下https://developer.apple.com/library/archive/releasenotes/ObjectiveC/ModernizationObjC/AdoptingModernObjective-C/AdoptingModernObjective-C.html

2020-04-30
RamboPan
老师你好,我试了下,UIViewContentModeScaleAspectFill ,发现 ImageView 加载图片之后变成长方形了,我给 frame 设置的长宽是正方形的。 我后面尝试切换为 UIViewContentModeScaleToFill,UIViewContentModeScaleAspectFit,发现加载图片时都是正方形。 代码片段: …… @property(nonatomic,strong,readwrite) UIImageView * icon; …… self.icon = [[UIImageView alloc] init]; self.icon.frame = CGRectMake(250, 15, 70, 70); self.icon.contentMode = UIViewContentModeScaleAspectFill; self.icon.backgroundColor = [UIColor redColor]; …… self.icon.image = [UIImage imageNamed:@"icon.bundle/Resident_Evil6.jpg"]; //用时间label 右边位置 self.icon.frame = CGRectMake(self.timeLabel.frame.origin.x + self.timeLabel.frame.size.width + 15, 15, 70, 70);

作者回复: 加一下imageView的clipsToBounds属性哈,如果图片大于ImageView,是需要裁剪掉的

2019-08-09
VHJM
请问老师,这个 icon.bundle 直接从 github 的demo 中复制一份就可以了吗? 之前我用 Xcode 9 + ios11 的模拟器所有的图片引用都不能正确显示。 今天我升级了 Xcode 10 + ios12 的模拟器也不行,然后我把 icon.bundle 删了又导入进去以后,tabbar 上的图片可以正常显示了,但是 time.jpeg 还是不行,老师能猜到原因吗?

作者回复: 方便上传下代码哈,我帮看看

2019-05-19
Geek_2acdf0
如何将自己的图片加入工程?icon.bundle 是怎么添加进工程中的?另外jpg在磁盘中应该存在什么位置?
2022-12-06
1
Doratree
这种addSubView的写法倒是没见过,swift应该没有类似的写法
2021-07-15
收起评论