這篇文章是專門用來記錄開發中一些常見的bug以及常用的零碎知識點,我會隔一段時間更新內容
最好不要在uiviewcontroller的loadview方法中改變狀態列的可視性(比如狀態列由顯示變為隱藏、或者由隱藏變為顯示),因為會導致重複呼叫2次loadview和viewdidload方法
假設狀態列本來是處於顯示狀態的:
下面的是錯誤**:
1 - (void執行效果:)loadview
1011 - (void
)viewdidload
列印資訊:
1雖然執行效果是對的,但是系統連續呼叫了2次loadview和viewdidload方法,導致建立了2次uiview,造成了不必要的開銷。2013-02-26
00:51:36.152 weibo[2251
:c07] loadview
22013-02-26
00:51:36.153 weibo[2251
:c07] loadview
32013-02-26
00:51:36.153 weibo[2251
:c07] viewdidload
42013-02-26
00:51:36.154 weibo[2251:c07] viewdidload
原因分析:
狀態列由顯示變為隱藏,意味著螢幕的可用高度變長了,uiviewcontroller的uiview的高度也要重新調整,因此系統會重新呼叫loadview方法建立uiview,建立完畢後再次呼叫viewdidload方法。
如果在uiimageview中新增了乙個按鈕,你會發現在預設情況下這個按鈕是無法被點選的,需要設定uiimageview的userinteractionenabled為yes:
imageview.userinteractionenabled = yes;設定為yes後,uiimageview內部的按鈕就可以被點選了
原因分析:
• 主視窗會呼叫hittest:withevent:方法在檢視(uiview)層次結構中找到乙個最合適的uiview來處理觸控事件
(hittest:withevent:其實是uiview的乙個方法,uiwindow繼承自uiview,因此主視窗uiwindow也是屬於檢視的一種)
• hittest:withevent:方法大致處理流程是這樣的:
首先呼叫當前檢視的pointinside:withevent:方法判斷觸控點是否在當前檢視內:
▶ 若pointinside:withevent:方法返回no,說明觸控點不在當前檢視內,則當前檢視
的hittest:withevent:返回nil
▶ 若pointinside:withevent:方法
返回yes,說明觸控點在當前檢視內,則遍歷當前檢視的所有子檢視(subviews),呼叫子檢視的hittest:withevent:方法重複前面的步驟,子檢視的遍歷順序是從top到bottom,即從subviews陣列的末尾向前遍歷,直到有子檢視的hittest:withevent:方法返回非空物件或者全部子檢視遍歷完畢:
▷ 若第一次有子檢視的hittest:withevent:方法返回非空物件,則當前檢視的hittest:withevent:方法就返回此物件,處理結束
▷ 若所有子檢視的hittest:withevent:方法都返回nil,則當前檢視的hittest:withevent:方法返回當前檢視自身(self)
•最終,這個觸控事件交給主視窗的hittest:withevent:方法返回的檢視物件去處理
我大致畫了個ios觸控事件分發的原理圖:
• hittest:withevent:方法會忽略以下檢視:
1> 隱藏(hidden=yes)的檢視
2> 禁止使用者操作(userinteractionenabled=no)的檢視
3> alpha<0.01的檢視
4>
如果乙個子檢視的區域超過父檢視的區域(如果父檢視的clipstobounds屬性為no,超過父檢視區域的子檢視內容也會顯示),那麼正常情況下在父
檢視區域外的觸控操作不會被識別,因為父檢視的pointinside:withevent:方法會返回no,這樣就不會繼續向下遍歷子檢視了。當然,也
可以重寫pointinside:withevent:方法來處理這種
綜上所述可得:
如果父檢視的userinteractionenabled=no,觸控事件不會繼續往下傳遞給子檢視,所以子檢視永遠無法處理觸控事件。而uiimageview在預設情況下的userinteractionenabled就是no。
由於ios裝置的螢幕解析度不盡相同,有大有小,那麼在不同裝置中
顯示同一張,可能會造成被拉伸、變形,嚴重影響使用者體驗。
為了讓在不同裝置中都能得到很好的顯示效果,同一類我們一般會準備3種版本,比如ios程式在啟動時會全屏顯示的default.png:
(retina即視網膜螢幕)
• default.png(尺寸為320x480):顯示在非retina-3.5英吋螢幕上(iphone3g\iphone3gs,螢幕解析度為320x480)
• [email protected](尺寸為640x960
):顯示在retina-3.5英吋螢幕上(iphone4\iphone4s,螢幕分辨為640x960)
• [email protected](尺寸為640x1136
):顯示在retina-4.0英吋螢幕上(iphone5,螢幕解析度為640x1136)
大部分情況下,我們都想隱藏狀態列,讓default.png真正全屏顯示。
我只能說你的思路是對的,但實際上達不到想要的效果,你會發現顯示default.png時狀態列還是存在的,等default.png顯示完畢後,狀態列才被隱藏。
我先解釋下為什麼這種方法不可行,其實原因很簡單:
下面說一下解決方案,在info.plist中增加乙個配置即可:
當然,在default.png顯示完畢後狀態列還是隱藏的。如果想重新顯示狀態列,補上下面**即可:
開發中常見問題
6.開發中常見問題 uiscrollview的自動布局 1.怎麼確定scrollview的約束 通過新增view設定他的約束來控制uiscorllview的滾動範圍 size和center 1.以後盡量先設尺寸在設定center,從frame中取時,他會先確定中心點後沿4周擴散形成設定的尺寸 如果到...
開發中常見問題
本文目錄 這篇文章是專門用來記錄開發中一些常見的bug以及常用的零碎知識點,我會隔一段時間更新內容 回到頂部 1.重複呼叫2次loadview和viewdidload 最好不要在uiviewcontroller的loadview方法中改變狀態列的可視性 比如狀態列由顯示變為隱藏 或者由隱藏變為顯示 ...
RedHat Linux常見問題集錦
修改主機名 vi etc sysconfig network,修改hostname一行為hostname 主機名,重啟後也能生效 ret hat linux啟動到文字介面 不啟動xwindow 將 etc inittab中 id 5 initdefault 一行中的5改為3 redhat的自動問題 ...