GeekBand iOS开发高级进阶学习笔记(第一周)

工程管理

从源码到APP
源代码文件(.m或.h)通过编译生成目标文件(.o),再通过连接生成可执行文件(mach-o或.dylib),可执行文件与处理过的资源文件(.plist或.png或.storyboard文件处理转化为二进制文件)再经过打包最终生成发行包(.app或.framework文件)

Xcode工程涉及的概念
Workspace
Workspace用来管理一组Project(项目),将其所管理的项目放在同一个文件夹下,用于保存项目状态,保存构造出来的产品,同时在同一个Workspace中的项目可以互相引用(implicit dependency)。Xcode会自动为独立的项目提供Workspace(隐藏形式的)。加入到Workspace里的项目仍可独立打开,注意如果项目中使用了Workspace里其他项目的资源就只能在Workspace中打开了。

Project
Project用来定义工程需要用到的哪些文件,所需文件必须加载到Project中才可以访问。管理构建Target(目标),告诉Xcode当前用到了哪些构建和执行目标。

Target
定义如何构造一个产品,指定用到的文件子集,定义依赖关系,提供构建过程的规则与参数。在Build Phases
的Complie Source选项下可以看见参与编译的所需文件。

Scheme与Destination
行动方案(Scheme)是一组指令,在指定目标上完成特定任务。Destination用来选择使用哪种模拟器来生成代码。

库与框架
staic library(.a)静态库:配合响应的头文件我们就可以直接使用了,程序运行时将会全部加载到内存中。
dynamic library(.dylib)动态库:当程序运行时没有和静态库一样加载到内存里面,而是在需要使用时再自动加载到内存中使用的库文件。
framework(.framework)框架:一个按照特定格式包装起来的动态库。

CocoaPods
CocoaPods是一个第三方的模块管理工具,它可以帮我们自动解决第三方库版本更新的问题。安装CocoaPods有三个步骤:
1.安装
$ sudo gem install cocoapods
$ pod init
2.定义
在项目根目录下编写Podfile
platform:ios,'8.0 '
use_frameworks!
pod'AFNetworking','->2.0'
3.使用
$ pod install --no-repo-update

iOS界面解析
UIScreen:用来表示设备目前可以使用的屏幕,在默认情况下是在mainScreen(设备自带的屏幕)屏幕上显示,也有时在externalScreen(外接显示屏幕)上显示。
+mainScreen 拿到主屏幕的实例。
如果外接了其他屏幕
+screens 拿到所有屏幕的实例
(BOOL).mirroredScreen 判断主屏幕和外接屏幕是否为镜像显示
.currentMode 屏幕的显示模式,记录了屏幕的大小,和纵横比
.overscanCompensation 匹配各种不同分辨率的屏幕,多用于外接电视
.bounds 这个函数平时使用较多,主要在我们想创建一个View时用于获取屏幕的大小。
.applicationFrame 获取屏幕可见的区域,是bounds减去状态栏的区域。目前已经过时,仅在维护老代码的时候使用。
.scale 罗辑上的像素点和实际硬件屏幕的像素点的差别,假设罗辑像素的大小是100乘200,如果scale是2的话物理屏幕的大小是200乘400。

  • (UIView *)snapshotViewAfterScreenUpdates:(BOOL)afterUpdates 获取一个屏幕的截图返回一个UIView。

UIWindow
WIndow代表当前应用可用的屏幕区域。
.windowLevel属性表示窗口所在的层级,层级越高显示的越在前面。
.windowLevel >= UIWindowLeveStatusBar 这样设置Window将会挡在StatusBar之前。

UIView的层次管理方法
增:
-(void)addSubview:(UIView *)view 增加一个子view
-(void)insertSubview:(UIView *) atIndex:(NSInteger) 在atIndex处插入一个子view
-(void)insertSubview:(UIView *) belowSubview:(UIView *) 在一个子view之后插入一个子view
-(void)insertSubview:(UIView *) aboveSubview:(UIView *) 在一个子view之前插入一个子view

删:
-(void)removeFromSuperview 将一个view从父view中删除

改:
-(void)bringSubviewToFront:(UIView *)view 将子view调到前面来
-(void)sendSubviewToBack:(UIView *)view 将子view调到后面去
-(void)exchangeSubviewAtIndex:(NSInteger)index1 withSubviewAtIndex:(NSInteger)index2
将位置在index1和index2的两个子view位置互换

查:
.window 表示当前view所在window
.superview 表示当前view所在的父view
.subviews 表示当前view所有的子view
-(BOOL)isDescendantOfView:(UIView *) 判断一个view是否是当前view的上级关系

UIView: 表示屏幕上一块矩形区域:负责提供相应区域的显示内容,也处理相因区域的事件响应。
-resizeToFit 让UIView自动调整大小,让其所有的子view可以显示出来。
opaque 一个bool属性,no时表示为不透明。
maskView 一个view可以设置maskView属性,生成一个View的模板,如果不透明的就裁剪,半透明的就混合
.tag 每一个view都可以设置一个tag(一个整数),用来区分之间的区别。

UIAppearance
修改某类多有实例的外观
在View加入Windows时生效
不影响已经显示的View(需要移出再加回)

事件处理

UIResponder
定义事件响应组件的接口
提供基础实现
Responding to Touch Events
touchesBegan:withEvent:
touchesMoved:withEvent:
touchesEnded:withEvent:
touchesCancelled:withEvent:
touchesEstimatePropertiesUpdated:

Responding to Motion Events
motionBegan:withEvent:
motionEnded:withEvent:
motionCancelled:withEvent:

Responding to Press Events
pressesBegan:withEvent:
pressesCancelled:withEvent:
pressesChanged:withEvent:
pressesEnded:withEvent:

Responding to Remote-Control Events
remoteControlReceivedWithEvent:

Responder Chain
响应会串成一个链条
.nextResponder指向了下一个响应
.isFirstResponder来表明是否为第一个响应

Hit-Test找到最可能响应触摸事件的View
通过-[UIView hitTest:(CGPoint)withEvent:(UIEvent *)]
-[UIView pointInside:withEvent:]
方法可以确定点击的位置(坐标)。
递归询问每个pointInside为YES的subview,如果pointInside为NO的subview子树整个略过,如果clipsToBounds = NO,在subview超出superview的地方的点击事件将不会响应。

在自定义类里响应触摸事件

-(void)touchBegan:(NSSet *)touches withEvent:(UIEvent *)event;
-(void)touchMoved:(NSSet *)touches withEvent:(UIEvent *)event;
-(void)touchEnded:(NSSet *)touches withEvent:(UIEvent *)event;
-(void)touchCancelled:(NSSet *)touches withEvent:(UIEvent *)event;

UITouch
-previousLocationView: 上一下次触摸事件的位置
-locationInView:
.timestamp 按下的时间
.type 是手指按下还是触摸笔按下
.force 按下的力度感应

UIEvent
.type:UIEventTypeTouches(Motion/RemoteControl/Presses)
.timestamp

手势操作

目前在iOS编程中手势的识别主要是靠UIGestureRecognizer来识别
创建一个手势识别器
-initWithTarget:(UIView *) action:(SEL)handleGesture
将创建的手势识别器加到一个View上
-[UIView addGestureRecognizer:]
手势识别器针对不同的手势有不同的类型
UITapGestureRecognizer 识别点击动作
UITapPinchRecognizer 识别两个手指向内滑动动作
UIPanGestureRecognizer 识别拖动动作
UISwipeGestureRecognizer 识别滑动动作
UIRotationGestureRecognizer 识别旋转动作
UILongPressGestureRecognizer 识别长按动作

同时支持多种手势
用依赖关系改变触发顺序
-[a requireGestureRecognizerToFail:b]
b失败前,a先候着
使用UIGestureRecognizerDelegate控制
-gestureRecognizer:shouldReceiveTouch:
这个touch要不要处理
-gestureRecognizerShouldBegin:
这个识别可以开始了吗?
-gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer:
识别器可以一起触发吗?

UIScrollView

UIScrollView是一个能Scroll的UIview
创建ScrollView
在interface里拖
代码创建
scrollView = [[UIScrollView alloc] initWithFrame:rect];

ScrollView的尺寸

ScrollView的尺寸

ScrollView的滚动

ScrollView的滚动

要实现滚动,scrollEnabled属性要设置成YES

监听滚动情况
scrollView.delegate
UIScrollViewDelegate
-scrollViewWillBeginDragging:(UIScrollView *); 确认用户已经开始拖动了
-scrollViewDidScroll:(UIScrollView *); 用户在拖动的过程中
-scrollViewDidEndDragging:(UIScrollView *) willDecelerate:(BOOL); 用户已经完成拖动动作

Pinch响应
UIScrollViewDelegate
-(UIView *)viewForZoomingInScrollView:(UIScrollView *)
-scrollViewDidEndZooming:withView:atScale:
.minimumZoomScale
.maxmumZoomScale
UIScrollView
-setZoomScale:(CGFloat)animated:(BOOL)
-zoomToRect:(CGRect)animated:(BOOL)
直接zoom是位图缩放而非重绘,要用CATiledLayer实现平滑缩放

分页滚动

scrollview 分页滚动
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,425评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,058评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,186评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,848评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,249评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,554评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,830评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,536评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,239评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,505评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,004评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,346评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,999评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,060评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,821评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,574评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,480评论 2 267

推荐阅读更多精彩内容