開發中常見問題集錦

2022-05-27 22:03:20 字數 3297 閱讀 2557

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

最好不要在uiviewcontroller的loadview方法中改變狀態列的可視性(比如狀態列由顯示變為隱藏、或者由隱藏變為顯示),因為會導致重複呼叫2次loadview和viewdidload方法

假設狀態列本來是處於顯示狀態的:

下面的是錯誤**:

1 - (void

)loadview

1011 - (void

)viewdidload

執行效果:

列印資訊:

1

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

雖然執行效果是對的,但是系統連續呼叫了2次loadview和viewdidload方法,導致建立了2次uiview,造成了不必要的開銷。

原因分析:

狀態列由顯示變為隱藏,意味著螢幕的可用高度變長了,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的自動問題 ...