工程管理
從源碼到App
Workspace
管理一組Project,這些項目將使用同一個位置:保存項目狀態(tài);保存構造出來的產(chǎn)品;自動可以互相引用(implicit dependency),Xcode自動為獨立的項目提供Workspace,Workspace里的Project仍可獨立打開
Project
組織工程用到的文件,管理構建目標( Target),告訴Xcode當前構建和執(zhí)行目標(通過Scheme選擇)
Folder Reference里的文件不在工程里
Project文件管理的風格:并無一定規(guī)則。按類型分組或按模塊分組;與文件目錄對應 或全部放在一個目錄里。
Target
定義如何構造一個產(chǎn)品。指定用到的文件子集;定義依賴關系;提供構建過程的規(guī)則與參數(shù)。
Scheme 與Destination
Scheme:一組指令。在指定目標上完成特定任務。
Destination:告訴Xcode使用哪個設備或模擬器。
靜態(tài)庫與框架
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表示屏幕上一塊矩形區(qū)域;負責提供相應區(qū)域的顯示內(nèi)容,也處理相應區(qū)域的事件響應。
UIWindow
Window代表當前應用可用的屏幕區(qū)域
UIApplicationMain 或 appDelegate創(chuàng)建,保存到delegate.window里,makeVisibleAndKey顯示
[[UIApplication sharedApplication] keyWindow];
.windowLevel >= UIWindowLevelStatusBar 會顯示在狀態(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:線程附屬對象,監(jiān)聽一組事件源。
NSRunLoop的主要作用:控制NSRunLoop里面線程的執(zhí)行和休眠,在有事情做的時候使當前NSRunLoop控制的線程工作,沒有事情做讓當前NSRunLoop的控制的線程休眠。
NSRunLoop 就是一直在循環(huán)檢測,從線程start到線程end,檢測inputsource(如點擊,雙擊等操作)同步事件,檢測timesource同步事件,檢測到輸入源會執(zhí)行處理函數(shù),首先會產(chǎn)生通知,corefunction向線程添加runloop observers來監(jiān)聽事件,意在監(jiān)聽事件發(fā)生時來做處理。
runloopmode是一個集合,包括監(jiān)聽:事件源,定時器,以及需通知的runloop observers 模式包括:
default模式:幾乎包括所有輸入源(除NSConnection) NSDefaultRunLoopMode模式
mode模式:處理modal panels
connection模式:處理NSConnection事件,屬于系統(tǒng)內(nèi)部,用戶基本不用
event tracking模式:如組件拖動輸入源 UITrackingRunLoopModes 不處理定時事件
common modes模式:NSRunLoopCommonModes 這是一組可配置的通用模式。將input sources與該模式關聯(lián)則同時也將input sources與該組中的其它模式進行了關聯(lián)。
每次運行一個run loop,你指定(顯式或隱式)run loop的運行模式。當相應的模式傳遞給run loop時,只有與該模式對應的 input sources才被監(jiān)控并允許run loop對事件進行處理(與此類似,也只有與該模式對應的observers才會被通知
UIResponder定義事件響應組件的接口,提供基礎實現(xiàn)。
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
觸摸手勢:按照特定規(guī)律出現(xiàn)的一系列觸摸事件
常見手勢:Tap,Swipe,Double tap,Long press,Pinch,Two finger tap,Rotate
觸摸手勢實現(xiàn)的原理:
收集一系列的UITouch;分析是否符合所需要的規(guī)律。如果符合,觸發(fā)手勢響應;否則,作為普通觸摸事件響應。
同時支持多種手勢:
用依賴關系改變觸發(fā)順序
-[a requireGestureRecognizerToFail:b]
b失敗之前,a先等著
用UIGestureRecognizerDelegate控制
-gestureRecognizer:shouldReceiveTouch:
UIScrollView
創(chuàng)建UIScrollView
-在Interface Builder 里拖
-在代碼里創(chuàng)建
scrollView = [[UIScrollView alloc] initWithFrame:rect];
UIScrollView的尺寸
設定方法:
-用代碼指定.contentSize
-使用Autolayout,constraints要能推算出 contentSize
UIScrollView的滾動
BOOL scrollEnabled;
BOOL bounces;
BOOL showsHorizontalScrollIndicator;
BOOL showsVerticalScrollIndicator;
監(jiān)聽滾動情況:
->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: