工程管理
從源碼到App


Workspace
管理一組Project,這些項(xiàng)目將使用同一個(gè)位置:保存項(xiàng)目狀態(tài);保存構(gòu)造出來的產(chǎn)品;自動(dòng)可以互相引用(implicit dependency),Xcode自動(dòng)為獨(dú)立的項(xiàng)目提供Workspace,Workspace里的Project仍可獨(dú)立打開
Project
組織工程用到的文件,管理構(gòu)建目標(biāo)( Target),告訴Xcode當(dāng)前構(gòu)建和執(zhí)行目標(biāo)(通過Scheme選擇)
Folder Reference里的文件不在工程里
Project文件管理的風(fēng)格:并無一定規(guī)則。按類型分組或按模塊分組;與文件目錄對(duì)應(yīng) 或全部放在一個(gè)目錄里。
Target
定義如何構(gòu)造一個(gè)產(chǎn)品。指定用到的文件子集;定義依賴關(guān)系;提供構(gòu)建過程的規(guī)則與參數(shù)。
Scheme 與Destination
Scheme:一組指令。在指定目標(biāo)上完成特定任務(wù)。
Destination:告訴Xcode使用哪個(gè)設(shè)備或模擬器。
靜態(tài)庫與框架
static library(.a)
dynamic library(.dylib)
framework(.framework)
命令行工具
xcode-select:選擇Xcode默認(rèn)版本
xcodebuild:
查看幫助:$ xcodebuild -help,或者隨便輸入一個(gè)不存在的選項(xiàng):$ xcodebuild -fuck
查看用法:$ xcodebuild -usage
查看已安裝 sdk 列表:$ xcodebuild -showsdks
查看當(dāng)前 Xcode 版本:$ xcodebuild -version
查看 xcodebuild 目錄:$ xcode-select -print-path
查看項(xiàng)目配置:$ xcodebuild -showBuildSettings
編譯項(xiàng)目:$ xcodebuild
xcrun
clang,swift/swfitc
ld
nm
libtool/ranlib
lipo
otool
第三方模塊管理工具
CocoaPods , Carthage
CocoaPods:
安裝:
$ sudo gem install cocoapods
$ pod init
定義:在項(xiàng)目根目錄下編寫 Podfile
使用:
$ pod install --no-repo-update
View層次結(jié)構(gòu)與屬性
UIView表示屏幕上一塊矩形區(qū)域;負(fù)責(zé)提供相應(yīng)區(qū)域的顯示內(nèi)容,也處理相應(yīng)區(qū)域的事件響應(yīng)。
UIWindow
Window代表當(dāng)前應(yīng)用可用的屏幕區(qū)域
UIApplicationMain 或 appDelegate創(chuàng)建,保存到delegate.window里,makeVisibleAndKey顯示
[[UIApplication sharedApplication] keyWindow];
.windowLevel >= UIWindowLevelStatusBar 會(huì)顯示在狀態(tài)欄前面
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
事件分發(fā)過程:

NSRunLoop:線程附屬對(duì)象,監(jiān)聽一組事件源。
NSRunLoop的主要作用:控制NSRunLoop里面線程的執(zhí)行和休眠,在有事情做的時(shí)候使當(dāng)前NSRunLoop控制的線程工作,沒有事情做讓當(dāng)前NSRunLoop的控制的線程休眠。
NSRunLoop 就是一直在循環(huán)檢測,從線程start到線程end,檢測inputsource(如點(diǎn)擊,雙擊等操作)同步事件,檢測timesource同步事件,檢測到輸入源會(huì)執(zhí)行處理函數(shù),首先會(huì)產(chǎn)生通知,corefunction向線程添加runloop observers來監(jiān)聽事件,意在監(jiān)聽事件發(fā)生時(shí)來做處理。
runloopmode是一個(gè)集合,包括監(jiān)聽:事件源,定時(shí)器,以及需通知的runloop observers 模式包括:
default模式:幾乎包括所有輸入源(除NSConnection) NSDefaultRunLoopMode模式
mode模式:處理modal panels
connection模式:處理NSConnection事件,屬于系統(tǒng)內(nèi)部,用戶基本不用
event tracking模式:如組件拖動(dòng)輸入源 UITrackingRunLoopModes 不處理定時(shí)事件
common modes模式:NSRunLoopCommonModes 這是一組可配置的通用模式。將input sources與該模式關(guān)聯(lián)則同時(shí)也將input sources與該組中的其它模式進(jìn)行了關(guān)聯(lián)。
每次運(yùn)行一個(gè)run loop,你指定(顯式或隱式)run loop的運(yùn)行模式。當(dāng)相應(yīng)的模式傳遞給run loop時(shí),只有與該模式對(duì)應(yīng)的 input sources才被監(jiān)控并允許run loop對(duì)事件進(jìn)行處理(與此類似,也只有與該模式對(duì)應(yīng)的observers才會(huì)被通知
UIResponder定義事件響應(yīng)組件的接口,提供基礎(chǔ)實(shí)現(xiàn)。

Responder Chain
Responder串成一個(gè)鏈條:.nextResponder
First Responder: .isFirstResponder
Hit-Test找到最可能響應(yīng)觸摸事件的View
觸摸點(diǎn)在哪個(gè)View里?
-[UIView hitTest:(CGPoint) withEvent:(UIEvent*)]
-[UIView pointInside:withEvent:]
遞歸詢問每個(gè)pointInside為YES 的subview
pointInside為NO的subview子樹整個(gè)略過
觸摸事件
iOS支持多點(diǎn)觸摸
view.multipleTouchEnabled
手勢操作--gesture
觸摸手勢:按照特定規(guī)律出現(xiàn)的一系列觸摸事件
常見手勢:Tap,Swipe,Double tap,Long press,Pinch,Two finger tap,Rotate
觸摸手勢實(shí)現(xiàn)的原理:
收集一系列的UITouch;分析是否符合所需要的規(guī)律。如果符合,觸發(fā)手勢響應(yīng);否則,作為普通觸摸事件響應(yīng)。
同時(shí)支持多種手勢:
用依賴關(guān)系改變觸發(fā)順序
-[a requireGestureRecognizerToFail:b]
b失敗之前,a先等著
用UIGestureRecognizerDelegate控制
-gestureRecognizer:shouldReceiveTouch:
UIScrollView
創(chuàng)建UIScrollView
-在Interface Builder 里拖
-在代碼里創(chuàng)建
scrollView = [[UIScrollView alloc] initWithFrame:rect];
UIScrollView的尺寸
設(shè)定方法:
-用代碼指定.contentSize
-使用Autolayout,constraints要能推算出 contentSize

UIScrollView的滾動(dòng)
BOOL scrollEnabled;
BOOL bounces;
BOOL showsHorizontalScrollIndicator;
BOOL showsVerticalScrollIndicator;

監(jiān)聽滾動(dòng)情況:
->scrollView.delegate
-->UIScrollViewDelegate
- scrollViewWillBeginDragging:(UIScrollView *);
- scrollViewDidScroll:(UIScrollView *);
- scrollViewDidEndDragging:(UIScrollView *) willDecelerate:(BOOL);
Pinch響應(yīng)
->UIScrollViewDelegate
-->- (UIView *)viewForZoomingInScrollView:(UIScrollView *)
-->-scrollViewDidEndZooming:withView:atScale:
-->.minimumZoomScale
-->.maximumZoomScale
->UIScrollView
-->-setZoomScale:(CGFloat) animated:(BOOL)
-->-zoomToRect:(CGRect) animated:(BOOL)
分頁滾動(dòng)
->.pageEnabled
頁面來源
一個(gè)巨大的view,簡單,費(fèi)資源
每頁一個(gè)view,delegate -scrollViewDidScroll: