工程管理
從源碼到APP
源代碼文件(.m或.h)通過編譯生成目標(biāo)文件(.o)妒貌,再通過連接生成可執(zhí)行文件(mach-o或.dylib),可執(zhí)行文件與處理過的資源文件(.plist或.png或.storyboard文件處理轉(zhuǎn)化為二進(jìn)制文件)再經(jīng)過打包最終生成發(fā)行包(.app或.framework文件)
Xcode工程涉及的概念
Workspace
Workspace用來管理一組Project(項目)拭抬,將其所管理的項目放在同一個文件夾下,用于保存項目狀態(tài)颠通,保存構(gòu)造出來的產(chǎn)品煮仇,同時在同一個Workspace中的項目可以互相引用(implicit dependency)。Xcode會自動為獨立的項目提供Workspace(隱藏形式的)名船。加入到Workspace里的項目仍可獨立打開舞吭,注意如果項目中使用了Workspace里其他項目的資源就只能在Workspace中打開了泡垃。
Project
Project用來定義工程需要用到的哪些文件,所需文件必須加載到Project中才可以訪問羡鸥。管理構(gòu)建Target(目標(biāo))蔑穴,告訴Xcode當(dāng)前用到了哪些構(gòu)建和執(zhí)行目標(biāo)。
Target
定義如何構(gòu)造一個產(chǎn)品惧浴,指定用到的文件子集存和,定義依賴關(guān)系,提供構(gòu)建過程的規(guī)則與參數(shù)。在Build Phases
的Complie Source選項下可以看見參與編譯的所需文件捐腿。
Scheme與Destination
行動方案(Scheme)是一組指令纵朋,在指定目標(biāo)上完成特定任務(wù)。Destination用來選擇使用哪種模擬器來生成代碼茄袖。
庫與框架
staic library(.a)靜態(tài)庫:配合響應(yīng)的頭文件我們就可以直接使用了操软,程序運(yùn)行時將會全部加載到內(nèi)存中。
dynamic library(.dylib)動態(tài)庫:當(dāng)程序運(yùn)行時沒有和靜態(tài)庫一樣加載到內(nèi)存里面绞佩,而是在需要使用時再自動加載到內(nèi)存中使用的庫文件寺鸥。
framework(.framework)框架:一個按照特定格式包裝起來的動態(tài)庫。
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:用來表示設(shè)備目前可以使用的屏幕烤低,在默認(rèn)情況下是在mainScreen(設(shè)備自帶的屏幕)屏幕上顯示肘交,也有時在externalScreen(外接顯示屏幕)上顯示。
+mainScreen 拿到主屏幕的實例扑馁。
如果外接了其他屏幕
+screens 拿到所有屏幕的實例
(BOOL).mirroredScreen 判斷主屏幕和外接屏幕是否為鏡像顯示
.currentMode 屏幕的顯示模式涯呻,記錄了屏幕的大小,和縱橫比
.overscanCompensation 匹配各種不同分辨率的屏幕腻要,多用于外接電視
.bounds 這個函數(shù)平時使用較多复罐,主要在我們想創(chuàng)建一個View時用于獲取屏幕的大小。
.applicationFrame 獲取屏幕可見的區(qū)域雄家,是bounds減去狀態(tài)欄的區(qū)域效诅。目前已經(jīng)過時,僅在維護(hù)老代碼的時候使用趟济。
.scale 羅輯上的像素點和實際硬件屏幕的像素點的差別乱投,假設(shè)羅輯像素的大小是100乘200,如果scale是2的話物理屏幕的大小是200乘400顷编。
- (UIView *)snapshotViewAfterScreenUpdates:(BOOL)afterUpdates 獲取一個屏幕的截圖返回一個UIView戚炫。
UIWindow
WIndow代表當(dāng)前應(yīng)用可用的屏幕區(qū)域。
.windowLevel屬性表示窗口所在的層級媳纬,層級越高顯示的越在前面双肤。
.windowLevel >= UIWindowLeveStatusBar 這樣設(shè)置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調(diào)到前面來
-(void)sendSubviewToBack:(UIView *)view 將子view調(diào)到后面去
-(void)exchangeSubviewAtIndex:(NSInteger)index1 withSubviewAtIndex:(NSInteger)index2
將位置在index1和index2的兩個子view位置互換
查:
.window 表示當(dāng)前view所在window
.superview 表示當(dāng)前view所在的父view
.subviews 表示當(dāng)前view所有的子view
-(BOOL)isDescendantOfView:(UIView *) 判斷一個view是否是當(dāng)前view的上級關(guān)系
UIView: 表示屏幕上一塊矩形區(qū)域:負(fù)責(zé)提供相應(yīng)區(qū)域的顯示內(nèi)容钮惠,也處理相因區(qū)域的事件響應(yīng)茅糜。
-resizeToFit 讓UIView自動調(diào)整大小,讓其所有的子view可以顯示出來萌腿。
opaque 一個bool屬性限匣,no時表示為不透明。
maskView 一個view可以設(shè)置maskView屬性,生成一個View的模板米死,如果不透明的就裁剪锌历,半透明的就混合
.tag 每一個view都可以設(shè)置一個tag(一個整數(shù)),用來區(qū)分之間的區(qū)別。
UIAppearance
修改某類多有實例的外觀
在View加入Windows時生效
不影響已經(jīng)顯示的View(需要移出再加回)
事件處理
UIResponder
定義事件響應(yīng)組件的接口
提供基礎(chǔ)實現(xiàn)
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
響應(yīng)會串成一個鏈條
.nextResponder指向了下一個響應(yīng)
.isFirstResponder來表明是否為第一個響應(yīng)
Hit-Test找到最可能響應(yīng)觸摸事件的View
通過-[UIView hitTest:(CGPoint)withEvent:(UIEvent *)]
-[UIView pointInside:withEvent:]
方法可以確定點擊的位置(坐標(biāo))峦筒。
遞歸詢問每個pointInside為YES的subview究西,如果pointInside為NO的subview子樹整個略過,如果clipsToBounds = NO物喷,在subview超出superview的地方的點擊事件將不會響應(yīng)卤材。
在自定義類里響應(yīng)觸摸事件
-(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 按下的力度感應(yīng)
UIEvent
.type:UIEventTypeTouches(Motion/RemoteControl/Presses)
.timestamp
手勢操作
目前在iOS編程中手勢的識別主要是靠UIGestureRecognizer來識別
創(chuàng)建一個手勢識別器
-initWithTarget:(UIView *) action:(SEL)handleGesture
將創(chuàng)建的手勢識別器加到一個View上
-[UIView addGestureRecognizer:]
手勢識別器針對不同的手勢有不同的類型
UITapGestureRecognizer 識別點擊動作
UITapPinchRecognizer 識別兩個手指向內(nèi)滑動動作
UIPanGestureRecognizer 識別拖動動作
UISwipeGestureRecognizer 識別滑動動作
UIRotationGestureRecognizer 識別旋轉(zhuǎn)動作
UILongPressGestureRecognizer 識別長按動作
同時支持多種手勢
用依賴關(guān)系改變觸發(fā)順序
-[a requireGestureRecognizerToFail:b]
b失敗前,a先候著
使用UIGestureRecognizerDelegate控制
-gestureRecognizer:shouldReceiveTouch:
這個touch要不要處理
-gestureRecognizerShouldBegin:
這個識別可以開始了嗎?
-gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer:
識別器可以一起觸發(fā)嗎峦失?
UIScrollView
UIScrollView是一個能Scroll的UIview
創(chuàng)建ScrollView
在interface里拖
代碼創(chuàng)建
scrollView = [[UIScrollView alloc] initWithFrame:rect];
ScrollView的尺寸
ScrollView的滾動
要實現(xiàn)滾動扇丛,scrollEnabled屬性要設(shè)置成YES
監(jiān)聽滾動情況
scrollView.delegate
UIScrollViewDelegate
-scrollViewWillBeginDragging:(UIScrollView *); 確認(rèn)用戶已經(jīng)開始拖動了
-scrollViewDidScroll:(UIScrollView *); 用戶在拖動的過程中
-scrollViewDidEndDragging:(UIScrollView *) willDecelerate:(BOOL); 用戶已經(jīng)完成拖動動作
Pinch響應(yīng)
UIScrollViewDelegate
-(UIView *)viewForZoomingInScrollView:(UIScrollView *)
-scrollViewDidEndZooming:withView:atScale:
.minimumZoomScale
.maxmumZoomScale
UIScrollView
-setZoomScale:(CGFloat)animated:(BOOL)
-zoomToRect:(CGRect)animated:(BOOL)
直接zoom是位圖縮放而非重繪,要用CATiledLayer實現(xiàn)平滑縮放
分頁滾動