開發中常見問題

2022-07-26 04:51:12 字數 3426 閱讀 2580

本文目錄

這篇文章是專門用來記錄開發中一些常見的bug以及常用的零碎知識點,我會隔一段時間更新內容

回到頂部

1.重複呼叫2loadviewviewdidload

最好不要在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 或者按下...