[iOS] 日常

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]則使代碼更簡(jiǎn)潔。


要區(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:] 來(lái)覆蓋
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í)沒有看到官方說(shuō)明,所以即使是同名的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é)果來(lái)決定是否發(fā)送消息給真正的觸發(fā)的view或者發(fā)送取消事件的消息,當(dāng)事件消息發(fā)送給view時(shí),即可根據(jù) responder chain 來(lái)處理事件,通過 nextResponder 來(lái)傳遞。


偶然跑一個(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)用按此方法展示,則可以:

  1. 在應(yīng)用的Target->General中設(shè)置Launch Screen File。當(dāng)將一個(gè).storyboard或.xib文件設(shè)置為L(zhǎng)aunch Screen File時(shí),應(yīng)用在所有尺寸的iPhone上都會(huì)全屏顯示,并且不會(huì)整體的縮放。設(shè)置Launch Scrren File的作用就是可以通過一個(gè)文件,對(duì)不同尺寸的設(shè)備以及在不同方向上適配不同的啟動(dòng)界面。
  2. 若通過在.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è)試:

  1. 若不設(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ì)留有黑邊。
  2. 若設(shè)置了4寸屏的啟動(dòng)圖片,則3.5寸和4寸屏都會(huì)全屏適配顯示,但4.7寸和5.5寸會(huì)按4寸等比放大顯示。
  3. 若設(shè)置了4.7寸或5.5寸屏的啟動(dòng)圖片或者使用啟動(dòng)屏幕文件的形式,則所有屏幕都會(huì)全屏適配顯示。

暫時(shí)沒有找到官方的關(guān)于這方面的說(shuō)明。


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 屬性。


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • *面試心聲:其實(shí)這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個(gè)offer,總結(jié)起來(lái)就是把...
    Dove_iOS閱讀 27,619評(píng)論 30 472
  • 總結(jié)一些遇到的問題。日常工作中用到的一些方法總結(jié),有很簡(jiǎn)單介紹,可能也有錯(cuò)誤,如果您看到了希望可以告訴我,會(huì)不間斷...
    最后還是個(gè)農(nóng)閱讀 1,754評(píng)論 4 7
  • 來(lái)個(gè)大整容 app在橫屏狀態(tài)下是不顯示iPhone的狀態(tài)欄的(就是有個(gè)小電池的那一欄),除非你強(qiáng)制app這樣做。這...
    Billionfan閱讀 4,301評(píng)論 8 9
  • 隨著年齡漸大,內(nèi)心非常著急, 好好學(xué)習(xí)技術(shù), 好好掙錢,只能靠自己給自己買房子,沒有什么理由不去好好努力。而這最主...
    SOI閱讀 1,966評(píng)論 5 47
  • 一個(gè)人在最低谷的時(shí)候,承受能力能有多強(qiáng)? 20歲之前,我從來(lái)都沒有考慮過這個(gè)問題。 20歲之后,我和我身邊的朋友或...
    Hy_seven閱讀 1,126評(píng)論 1 18

友情鏈接更多精彩內(nèi)容