GeekBand iOS開發(fā)高級進(jìn)階學(xué)習(xí)筆記(第一周)

工程管理

從源碼到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的尺寸

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)平滑縮放

分頁滾動

scrollview 分頁滾動
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末尉辑,一起剝皮案震驚了整個濱河市帆精,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌隧魄,老刑警劉巖卓练,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異购啄,居然都是意外死亡襟企,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進(jìn)店門狮含,熙熙樓的掌柜王于貴愁眉苦臉地迎上來顽悼,“玉大人,你說我怎么就攤上這事辉川”眚” “怎么了?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵乓旗,是天一觀的道長府蛇。 經(jīng)常有香客問我,道長屿愚,這世上最難降的妖魔是什么汇跨? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮妆距,結(jié)果婚禮上穷遂,老公的妹妹穿的比我還像新娘。我一直安慰自己娱据,他們只是感情好蚪黑,可當(dāng)我...
    茶點故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般忌穿。 火紅的嫁衣襯著肌膚如雪抒寂。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天掠剑,我揣著相機(jī)與錄音屈芜,去河邊找鬼。 笑死朴译,一個胖子當(dāng)著我的面吹牛井佑,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播眠寿,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼躬翁,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了盯拱?” 一聲冷哼從身側(cè)響起姆另,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎坟乾,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蝶防,經(jīng)...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡甚侣,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了间学。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片殷费。...
    茶點故事閱讀 39,711評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖低葫,靈堂內(nèi)的尸體忽然破棺而出详羡,到底是詐尸還是另有隱情,我是刑警寧澤嘿悬,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布实柠,位于F島的核電站,受9級特大地震影響善涨,放射性物質(zhì)發(fā)生泄漏窒盐。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一钢拧、第九天 我趴在偏房一處隱蔽的房頂上張望蟹漓。 院中可真熱鬧,春花似錦源内、人聲如沸葡粒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽嗽交。三九已至卿嘲,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間轮纫,已是汗流浹背腔寡。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留掌唾,地道東北人放前。 一個月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像糯彬,于是被迫代替她去往敵國和親凭语。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,611評論 2 353

推薦閱讀更多精彩內(nèi)容