深度解析iPhone視窗和視圖

來源:互聯網
上載者:User
iPhone視窗和視圖是本文要介紹的內容,主要是來瞭解iphone中的視窗和視圖的使用。不多說,一起來看詳細內容講解。1.程式建立一個UIWindowUIWindow* aWindow = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]   autorelease]; 2、在iPhone OS系統中,由於視圖必須有一個與之關聯的層對象,所以UIView類在初始化時會自動建立相應的層。您可以通過視圖的layer屬性訪問這個層,但是不能在視圖建立完成後改變層對象。如果您希望視圖使用不同類型的層,必須重載其layerClass類方法,並在該方法中返回您希望使用的層對象。使用不同層類的最常見理由是為了實現一個基於OpenGL的應用程式。為了使用OpenGL描畫命令,視圖下面的層必須是CAEAGLLayer類的執行個體,這種類型的層可以和OpenGL渲染調用進行互動,最終在螢幕上顯示期望的內容。3、在代碼中,您可以將frame、bounds、和center屬性用於不同的目的。邊界矩形代表視圖本地的座標系統,因此,在描畫和事件處理代碼中,經常藉助它來取得視圖中發生事件或需要更新的位置。中心點代表視圖的中心,改變中心點一直是行動裝置檢視位置的最好方法。邊框矩形是一個通過bounds和center屬性計算得到的便利值,只有當視圖的變換屬性被設定恒等變換時,邊框矩形才是有效。4、如果一個視圖必須具有某些子視圖才能工作,則應該在其initWithFrame:方法中進行對其建立,以確保子視圖可以和視圖一起被顯示和初始化。如果子視圖是應用程式設計的一部分(而不是視圖工作必需的),則應該在視圖的初始化代碼之外進行建立。在iPhone程式中,有兩個地方最常用於建立視圖和子視圖,它們是應用程式委派物件的applicationDidFinishLaunching:方法和視圖控制器的loadView方法。5、觸摸事件通常使用基於視窗指標系統的座標值來報告事件發生的位置,但是視圖對象需要的是相對於視圖本地座標的位置資訊,兩者可能是不一樣的。6、任何時候,當視圖的布局發生改變時,UIKit會啟用每個視圖的自動尺寸調整行為,然後調用各自的layoutSubviews方法,使您有機會進一步調整子視圖的幾何尺寸。下面列舉的情形都會引起視圖布局的變化:視圖邊界矩形的尺寸發生變化。滾動視圖的內容位移量—也就是可視內容地區的原點—發生變化。和視圖關聯的轉換矩陣發生變化。和視圖層相關聯的Core Animation子層組發生變化。您的應用程式調用視圖的setNeedsLayout或layoutIfNeeded方法來強制進行布局。您的應用程式調用視圖背後的層對象的setNeedsLayout方法來強制進行布局。7、當您改變視圖內容時,可以通過setNeedsDisplay或setNeedsDisplayInRect:方法來將需要重畫的部分通知給系統。在應用程式返回運行迴圈之後,會對所有的描畫請求進行合并,計算介面中需要被更新的部分;之後就開始遍曆視圖層次,向需要更新的視圖發送drawRect:訊息。遍曆的起點是視圖層次的根視圖,然後從後往前遍曆其子視圖。在可視邊界內顯示定製內容的視圖必須實現其drawRect:方法,以便對該內容進行渲染。8、您定義的每個新的視圖對象都應該包含initWithFrame:初始化方法。該方法負責在建立對象時對類進行初始化,使之處於已知的狀態。在通過代碼建立您的視圖執行個體時,需要使用這個方法。如果您從nib檔案中裝載定製視圖類的執行個體,則需要知道:在iPhone OS中,裝載nib的代碼並不通過initWithFrame:方法來執行個體化新的視圖對象,而是通過NSCoding協議定義的initWithCoder:方法來進行。即使您的視圖採納了NSCoding協議,Interface Builder也不知道它的定製屬性,因此不知道如何將那些屬性編碼到nib檔案中。所以,當您從nib檔案裝載定製視圖時,initWithCoder:方法不具有進行正確初始化所需要的資訊。為瞭解決這個問題,您可以在自己的類中實現awakeFromNib方法,特別用於從nib檔案裝載的定製類。9、如果您能確定自己的描畫代碼總是以不透明的內容覆蓋整個視圖的表面,則可以將視圖的opaque屬性聲明設定為YES,以提高描畫代碼的總體效率。當您將視表徵圖識為不透明時,UIKit會避免對該視圖正下方的內容進行描畫。這不僅減少了描畫開銷的時間,而且減少內容合成需要的工作。然而,只有當您能確定視圖提供的內容為不透明時,才能將這個屬性設定為YES;如果您不能保證視圖內容總是不透明,則應該將它設定為NO。10、提高描畫效能(特別是在滾動過程)的另一個方法是將視圖的clearsContextBeforeDrawing屬性設定為NO。當這個屬性被設定為YES時,UIKIt會在調用drawRect:方法之前,把即將被該方法更新的地區填充為透明的黑色。將這個屬性設定為NO可以取消相應的填充操作,而由應用程式負責完全重畫傳給drawRect:方法的更新矩形中的部分。這樣的最佳化在滾動過程中通常是一個好的折衷。11、在處理觸摸事件時,UIKit會通過UIView的hitTest:withEvent:和pointInside:withEvent:方法來確定觸摸事件是否發生在指定的視圖上。雖然很少需要重載這些方法,但是您可以通過重載來使子視圖無法處理觸摸事件。
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.