If a segue can be triggered only programmatically, you usually draw the connection arrow directly from the source view controller to the destination view controller.
NSObject 分配對(duì)象的類方法有 [+ alloc] 和 [+ allocWithZone:]赌蔑,alloc內(nèi)部其實(shí)調(diào)用的就是 [+ allocWithZone:]挽铁。并且在 Objective-c2.0 中 [+ allocWithZone:] 的參數(shù)zone會(huì)被忽略。[+ new] 方法是 [+ alloc] 方法和 [- init] 方法的結(jié)合,如果使用[[NSObject alloc] init]
會(huì)讓代碼風(fēng)格更統(tǒng)一浅侨,直接使用[NSObject new]
則使代碼更簡潔狞尔。
要區(qū)分設(shè)備方向和界面方向潘靖,設(shè)備方向是指物理設(shè)備的方向降淮,可以通過[UIDevice currentDevice].orientation
獲得。而界面方向則是指應(yīng)用的界面支持哪些方向哲思,當(dāng)設(shè)備旋轉(zhuǎn)到某一方向時(shí)洼畅,若應(yīng)用界面支持這一方向,則應(yīng)用界面也會(huì)隨之旋轉(zhuǎn)變化棚赔。應(yīng)用支持的界面方向可以在項(xiàng)目的 target 中設(shè)置帝簇。另外我們可以在 Application Delegate 對(duì)象中實(shí)現(xiàn)方法 [- application:supportedInterfaceOrientationsForWindow:] 來覆蓋
target 中的設(shè)置。最后是View Controller級(jí)別的設(shè)置靠益,UIViewController 類中包含兩個(gè)方法 [- shouldAutorotate] 和
[- supportedInterfaceOrientations]己儒。只有當(dāng) [- shouldAutorotate] 方法返回 YES 時(shí),[- supportedInterfaceOrientations] 方法才會(huì)被調(diào)用捆毫。如果是iPad,supportedInterfaceOrientations方法默認(rèn)返回所有方向冲甘,如果是 iPhone绩卤,該方法則默認(rèn)返回除豎向反向外的其他方向。一個(gè)界面最終支持的方向是兩種級(jí)別支持方向的交集江醇。
通過 xib 文件指定 view controller 的 view 時(shí)濒憋,初始化 view controller 使用的方法是
[- initWithNibName:bundle:]。當(dāng)xib文件的名字與 view controller 的名字相同時(shí)陶夜,直接使用 [- init] 方法初始化 view controller 也可指定其
view 為 xib 文件中的 view凛驮。經(jīng)測(cè)試發(fā)現(xiàn)在調(diào)用 UIViewController 的
init 方法之前,self 的 nibName 屬性在有同名 xib 的情況下已賦值為該名稱条辟,之后 [- init] 方法會(huì)調(diào)用 [- initWithNibName:bundle:] 方法黔夭,但傳入的參數(shù)為 null宏胯,而 [- initWithNibName:bundle:] 方法在參數(shù)為
null 的情況下會(huì)去搜尋 nibName 屬性指定的xib文件加載,所以在有同名xib文件時(shí)本姥, [- init] 的方法也可加載到 xib 文件肩袍,但暫時(shí)沒有看到官方說明,所以即使是同名的xib文件婚惫,也最好用 [- initWithNibName:bundle:] 方法去加載 xib 文件初始化 view controller氛赐。
通過 Interface Builder 搭建的界面 xib 文件本質(zhì)上是 XML 文檔,它保存了界面上所有對(duì)象的信息和其之間的聯(lián)系先舷。編譯時(shí)艰管,xib 文件會(huì)被編譯成二進(jìn)制的 nib 文件(讀取xml文件,生成所有界面對(duì)象蒋川,調(diào)用 encodeWithCoder 序列化為二進(jìn)制 nib 文件)牲芋。運(yùn)行時(shí),反序列化尔破,調(diào)用所有對(duì)象的 initWithCoder街图,最后生成所有界面元素的實(shí)例,向?qū)嵗l(fā)送 awakeFromNib 消息懒构。所以餐济,所有控件都支持initWithCoder 和 encodeWithCoder 的 NSCoding 規(guī)范。如果直接通過 xml 文件解析生成實(shí)例對(duì)象應(yīng)該會(huì)影響性能胆剧。
通過 UITableView 和 UICollectionView 顯示數(shù)據(jù)時(shí)絮姆,當(dāng)數(shù)據(jù)變?yōu)榭諘r(shí),一般要顯示沒有數(shù)據(jù)的提示信息秩霍,隨著數(shù)據(jù)的改變篙悯,一般會(huì)伴隨著 reloadData 方法的調(diào)用或者 cell 的插入或刪除的方法的調(diào)用,而此時(shí)都會(huì)觸發(fā) delegate 的 numberOfRowsInSection 方法铃绒,將提示信息的顯示和隱藏的判斷放在這里不容易遺漏一些改變的情況鸽照。
iOS 通過設(shè)備可以獲取三類事件:Multitouch events,Accelerometer events颠悬,Remote control events矮燎。一個(gè)多點(diǎn)觸控序列表示從第一根手指的觸摸屏幕開始到最后一根手指的離開的過程。在這個(gè)過程中赔癌,一個(gè) UITouch 的對(duì)象代表一根手指在屏幕上的觸摸或者移動(dòng)诞外,并更新它的 phase,location in a view灾票,previous location等屬性峡谊,當(dāng)有新的
UITouch 對(duì)象或已有 UITouch 對(duì)象更新,UIApplication 對(duì)象會(huì)將
UITouch 對(duì)象傳給 key window 對(duì)象,之后 window 對(duì)象通過
hitTest:withEvent:(內(nèi)部調(diào)用pointInside:withEvent:)確定 touch 真正觸發(fā)的 view既们,如果有 gesture recognizer 附加在該view上濒析,
window 對(duì)象會(huì)先將touch對(duì)象先傳給gesture recognizer,然后
window 會(huì)根據(jù) gesture recognizer 的識(shí)別結(jié)果來決定是否發(fā)送消息給真正的觸發(fā)的view或者發(fā)送取消事件的消息贤壁,當(dāng)事件消息發(fā)送給view時(shí)悼枢,即可根據(jù) responder chain 來處理事件,通過 nextResponder 來傳遞脾拆。
偶然跑一個(gè)老的項(xiàng)目時(shí)發(fā)現(xiàn)馒索,由于該項(xiàng)目沒有對(duì)iPhone的4.7寸和5.5寸屏幕適配,所以當(dāng)應(yīng)用運(yùn)行在新尺寸的設(shè)備上時(shí)名船,系統(tǒng)會(huì)將應(yīng)用的界面整體放大到占滿整個(gè)屏幕(例如高度固定20點(diǎn)的status bar已明顯超過該值)绰上。若不想應(yīng)用按此方法展示,則可以:
- 在應(yīng)用的Target->General中設(shè)置Launch Screen File渠驼。當(dāng)將一個(gè).storyboard或.xib文件設(shè)置為Launch Screen File時(shí)蜈块,應(yīng)用在所有尺寸的iPhone上都會(huì)全屏顯示,并且不會(huì)整體的縮放迷扇。設(shè)置Launch Scrren File的作用就是可以通過一個(gè)文件百揭,對(duì)不同尺寸的設(shè)備以及在不同方向上適配不同的啟動(dòng)界面。
- 若通過在.xcassets中設(shè)置靜態(tài)圖片LaunchImage的方式蜓席,則可以加入對(duì)新尺寸圖片器一。之后應(yīng)用的效果也會(huì)變?yōu)槿溜@示,不會(huì)整體放大了厨内。
發(fā)現(xiàn)啟動(dòng)圖片的設(shè)置對(duì)應(yīng)用展示方式的影響后祈秕,做了一個(gè)不同情況的統(tǒng)計(jì)測(cè)試:
- 若不設(shè)置任何的啟動(dòng)資源(靜態(tài)圖片或文件),或者只設(shè)置了3.5寸屏的啟動(dòng)靜態(tài)圖片雏胃,此時(shí)的感覺像系統(tǒng)認(rèn)為所有界面針對(duì)3.5寸屏設(shè)備做展示请毛,在3.5寸上會(huì)全屏展示,各種bar的高度也肯定是默認(rèn)值瞭亮。若在4寸設(shè)備上運(yùn)行方仿,因?yàn)?.5寸屏與4寸屏寬相同,則在4寸設(shè)備上會(huì)按3.5寸屏的尺寸居中顯示统翩,上下會(huì)有黑邊仙蚜。4.7寸屏和5.5寸的寬高比與4寸相同,但寬度都大于4寸和3.5寸的320點(diǎn)寬唆缴,所以在這兩個(gè)設(shè)備上會(huì)按寬度等比放大然后居中顯示,同樣上下都會(huì)留有黑邊黍翎。
- 若設(shè)置了4寸屏的啟動(dòng)圖片面徽,則3.5寸和4寸屏都會(huì)全屏適配顯示,但4.7寸和5.5寸會(huì)按4寸等比放大顯示。
- 若設(shè)置了4.7寸或5.5寸屏的啟動(dòng)圖片或者使用啟動(dòng)屏幕文件的形式趟紊,則所有屏幕都會(huì)全屏適配顯示氮双。
暫時(shí)沒有找到官方的關(guān)于這方面的說明。
UIView 內(nèi)設(shè)置邊框?qū)挾?layer.borderWidth)向 view 內(nèi)延伸霎匈,不會(huì)占用 view 外部空間戴差。
在 Objective-C 中,協(xié)議可以繼承铛嘱,當(dāng)類聲明實(shí)現(xiàn)子協(xié)議時(shí)暖释,編譯器也會(huì)提示父協(xié)議中的方法。
測(cè)試 Demo 一般會(huì)創(chuàng)建新的工程墨吓,如果想測(cè)試應(yīng)用運(yùn)行在舊版本系統(tǒng)模擬器上的效果球匕,可能會(huì)在 Destination 的模擬器列表里看不到已添加的舊版本模擬器,這時(shí)要注意應(yīng)用的 Deployment Target 是否設(shè)置為支持所要測(cè)試的舊版本系統(tǒng)及以下帖烘。
通過 UIController 的 automaticallyAdjustsScrollViewInsets 屬性亮曹,可以設(shè)置系統(tǒng)是否調(diào)整 scroll view 以防止被 navigation bar 等遮擋。但是該屬性在 iOS11 中被廢棄秘症,代替的是 UIScrollView 的 contentInsetAdjustmentBehavior 屬性照卦。
當(dāng)界面上只有一個(gè) scroll view 時(shí),點(diǎn)擊狀態(tài)欄可以將其內(nèi)容滾動(dòng)回頂部乡摹。但如果同時(shí)存在多個(gè) scroll view 則該功能不起作用役耕,原因是這一行為受 scroll view 的屬性 scrollsToTop 的影響,iOS 系統(tǒng)只允許同時(shí)有一個(gè) scroll view 的該屬性為 YES趟卸,這時(shí)這一個(gè) scroll view 可以使用該功能蹄葱,當(dāng)有多個(gè) scroll view 的該屬性為 YES 時(shí),則都不起作用锄列。解決辦法就是根據(jù)需求動(dòng)態(tài)的修改 scroll view 的 scrollsToTop 屬性图云。