本文目錄
這篇文章是專門用來記錄開發中一些常見的bug以及常用的零碎知識點,我會隔一段時間更新內容
回到頂部
1.重複呼叫2次loadview和viewdidload
最好不要在uiviewcontroller的loadview方法中改變狀態列的可視性(比如狀態列由顯示變為隱藏、或者由隱藏變為顯示),因為會導致重複呼叫2次loadview和viewdidload方法
假設狀態列本來是處於顯示狀態的:
下面的是錯誤**:
- (void)loadview執行效果:- (void)viewdidload
列印資訊:
1 2013-02-26 00:51:36.152 weibo[2251:c07] loadview
2 2013-02-26 00:51:36.153 weibo[2251:c07] loadview
3 2013-02-26 00:51:36.153 weibo[2251:c07] viewdidload
4 2013-02-26 00:51:36.154 weibo[2251:c07] viewdidload
雖然執行效果是對的,但是系統連續呼叫了2次loadview和viewdidload方法,導致建立了2次uiview,造成了不必要的開銷。
原因分析:
狀態列由顯示變為隱藏,意味著螢幕的可用高度變長了,uiviewcontroller的uiview的高度也要重新調整,因此系統會重新呼叫loadview方法建立uiview,建立完畢後再次呼叫viewdidload方法。
回到頂部
2.按鈕無法點選
如果在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。
回到頂部
3.@2x和-568h@2x
由於ios裝置的螢幕解析度不盡相同,有大有小,那麼在不同裝置中 顯示同一張,可能會造成被拉伸、變形,嚴重影響使用者體驗。
為了讓在不同裝置中都能得到很好的顯示效果,同一類我們一般會準備3種版本,比如ios程式在啟動時會全屏顯示的default.png
(retina即視網膜螢幕)
• default.png(尺寸為320x480):顯示在非retina-3.5英吋螢幕上(iphone3g\iphone3gs,螢幕解析度為320x480)
回到頂部
4.啟動時全屏顯示default.png
大部分情況下,我們都想隱藏狀態列,讓default.png真正全屏顯示。
我只能說你的思路是對的,但實際上達不到想要的效果,你會發現顯示default.png時狀態列還是存在的,等default.png顯示完畢後,狀態列才被隱藏。
我先解釋下為什麼這種方法不可行,其實原因很簡單:
下面說一下解決方案,在info.plist中增加乙個配置即可:
當然,在default.png顯示完畢後狀態列還是隱藏的。如果想重新顯示狀態列,補上下面**即可:
**自:
開發中常見問題
6.開發中常見問題 uiscrollview的自動布局 1.怎麼確定scrollview的約束 通過新增view設定他的約束來控制uiscorllview的滾動範圍 size和center 1.以後盡量先設尺寸在設定center,從frame中取時,他會先確定中心點後沿4周擴散形成設定的尺寸 如果到...
開發中常見問題集錦
這篇文章是專門用來記錄開發中一些常見的bug以及常用的零碎知識點,我會隔一段時間更新內容 最好不要在uiviewcontroller的loadview方法中改變狀態列的可視性 比如狀態列由顯示變為隱藏 或者由隱藏變為顯示 因為會導致重複呼叫2次loadview和viewdidload方法 假設狀態列...
Visual C 開發中常見問題的答案
1 簡述vc6下如何進行程式的除錯 在主選單 build 中,有乙個start build的子選單,它下面包含了go選單 快捷鍵為f5 選擇後,程式將從當前語句進入除錯執行,直到遇到斷點或程式結束。將滑鼠移動到要除錯的 行,單擊滑鼠右鍵選擇 insert remove breakpoint 或者按下...