工程管理
从源码到App
Workspace
管理一组Project,这些项目将使用同一个位置:保存项目状态;保存构造出来的产品;自动可以互相引用(implicit dependency),Xcode自动为独立的项目提供Workspace,Workspace里的Project仍可独立打开
Project
组织工程用到的文件,管理构建目标( Target),告诉Xcode当前构建和执行目标(通过Scheme选择)
Folder Reference里的文件不在工程里
Project文件管理的风格:并无一定规则。按类型分组或按模块分组;与文件目录对应 或全部放在一个目录里。
Target
定义如何构造一个产品。指定用到的文件子集;定义依赖关系;提供构建过程的规则与参数。
Scheme 与Destination
Scheme:一组指令。在指定目标上完成特定任务。
Destination:告诉Xcode使用哪个设备或模拟器。
静态库与框架
static library(.a)
dynamic library(.dylib)
framework(.framework)
命令行工具
xcode-select:选择Xcode默认版本
xcodebuild:
查看帮助:$ xcodebuild -help,或者随便输入一个不存在的选项:$ xcodebuild -fuck
查看用法:$ xcodebuild -usage
查看已安装 sdk 列表:$ xcodebuild -showsdks
查看当前 Xcode 版本:$ xcodebuild -version
查看 xcodebuild 目录:$ xcode-select -print-path
查看项目配置:$ xcodebuild -showBuildSettings
编译项目:$ xcodebuild
xcrun
clang,swift/swfitc
ld
nm
libtool/ranlib
lipo
otool
第三方模块管理工具
CocoaPods , Carthage
CocoaPods:
安装:
$ sudo gem install cocoapods
$ pod init
定义:在项目根目录下编写 Podfile
使用:
$ pod install --no-repo-update
View层次结构与属性
UIView表示屏幕上一块矩形区域;负责提供相应区域的显示内容,也处理相应区域的事件响应。
UIWindow
Window代表当前应用可用的屏幕区域
UIApplicationMain 或 appDelegate创建,保存到delegate.window里,makeVisibleAndKey显示
[[UIApplication sharedApplication] keyWindow];
.windowLevel >= UIWindowLevelStatusBar 会显示在状态栏前面
UIView的层次管理方法
增:
- (void)addSubview:(UIView *)view
- (void)insertSubview:(UIView *) atIndex:(NSInteger)
- (void)insertSubview:(UIView *) belowSubview:(UIView *)
- (void)insertSubview:(UIView *) aboveSubview:(UIView *)
删:
- (void)removeFromSuperview
改:
- (void)bringSubviewToFront:(UIView *)view
- (void)sendSubviewToBack:(UIView *)view
- (void)exchangeSubviewAtIndex:(NSInteger) index1
withSubviewAtIndex:(NSInteger) index2
查:
.window
.superview
.subviews
- (BOOL)isDescendantOfView:(UIView *)
事件处理--Event
Events:objects ,sent to an app, informing user actions
事件分发过程:
NSRunLoop:线程附属对象,监听一组事件源。
NSRunLoop的主要作用:控制NSRunLoop里面线程的执行和休眠,在有事情做的时候使当前NSRunLoop控制的线程工作,没有事情做让当前NSRunLoop的控制的线程休眠。
NSRunLoop 就是一直在循环检测,从线程start到线程end,检测inputsource(如点击,双击等操作)同步事件,检测timesource同步事件,检测到输入源会执行处理函数,首先会产生通知,corefunction向线程添加runloop observers来监听事件,意在监听事件发生时来做处理。
runloopmode是一个集合,包括监听:事件源,定时器,以及需通知的runloop observers 模式包括:
default模式:几乎包括所有输入源(除NSConnection) NSDefaultRunLoopMode模式
mode模式:处理modal panels
connection模式:处理NSConnection事件,属于系统内部,用户基本不用
event tracking模式:如组件拖动输入源 UITrackingRunLoopModes 不处理定时事件
common modes模式:NSRunLoopCommonModes 这是一组可配置的通用模式。将input sources与该模式关联则同时也将input sources与该组中的其它模式进行了关联。
每次运行一个run loop,你指定(显式或隐式)run loop的运行模式。当相应的模式传递给run loop时,只有与该模式对应的 input sources才被监控并允许run loop对事件进行处理(与此类似,也只有与该模式对应的observers才会被通知
UIResponder定义事件响应组件的接口,提供基础实现。
Responder Chain
Responder串成一个链条:.nextResponder
First Responder: .isFirstResponder
Hit-Test找到最可能响应触摸事件的View
触摸点在哪个View里?
-[UIView hitTest:(CGPoint) withEvent:(UIEvent*)]
-[UIView pointInside:withEvent:]
递归询问每个pointInside为YES 的subview
pointInside为NO的subview子树整个略过
触摸事件
iOS支持多点触摸
view.multipleTouchEnabled
手势操作--gesture
触摸手势:按照特定规律出现的一系列触摸事件
常见手势:Tap,Swipe,Double tap,Long press,Pinch,Two finger tap,Rotate
触摸手势实现的原理:
收集一系列的UITouch;分析是否符合所需要的规律。如果符合,触发手势响应;否则,作为普通触摸事件响应。
同时支持多种手势:
用依赖关系改变触发顺序
-[a requireGestureRecognizerToFail:b]
b失败之前,a先等着
用UIGestureRecognizerDelegate控制
-gestureRecognizer:shouldReceiveTouch:
UIScrollView
创建UIScrollView
-在Interface Builder 里拖
-在代码里创建
scrollView = [[UIScrollView alloc] initWithFrame:rect];
UIScrollView的尺寸
设定方法:
-用代码指定.contentSize
-使用Autolayout,constraints要能推算出 contentSize
UIScrollView的滚动
BOOL scrollEnabled;
BOOL bounces;
BOOL showsHorizontalScrollIndicator;
BOOL showsVerticalScrollIndicator;
监听滚动情况:
->scrollView.delegate
-->UIScrollViewDelegate
- scrollViewWillBeginDragging:(UIScrollView *);
- scrollViewDidScroll:(UIScrollView *);
- scrollViewDidEndDragging:(UIScrollView *) willDecelerate:(BOOL);
Pinch响应
->UIScrollViewDelegate
-->- (UIView *)viewForZoomingInScrollView:(UIScrollView *)
-->-scrollViewDidEndZooming:withView:atScale:
-->.minimumZoomScale
-->.maximumZoomScale
->UIScrollView
-->-setZoomScale:(CGFloat) animated:(BOOL)
-->-zoomToRect:(CGRect) animated:(BOOL)
分页滚动
->.pageEnabled
页面来源
一个巨大的view,简单,费资源
每页一个view,delegate -scrollViewDidScroll: