自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

深度解析iPhone窗口和視圖

移動(dòng)開發(fā) iOS
如果您希望視圖使用不同類型的層,必須重載其layerClass類方法,并在該方法中返回您希望使用的層對(duì)象。使用不同層類的最常見理由是為了實(shí)現(xiàn)一個(gè)基于OpenGL的應(yīng)用程序。

iPhone窗口視圖是本文要介紹的內(nèi)容,主要是來了解iphone中的窗口視圖的使用。不多說,一起來看詳細(xì)內(nèi)容講解。

1.程序創(chuàng)建一個(gè)UIWindow

  1. UIWindow* aWindow = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]   
  2. autorelease]; 

2、在iPhone OS系統(tǒng)中,由于視圖必須有一個(gè)與之關(guān)聯(lián)的層對(duì)象,所以UIView類在初始化時(shí)會(huì)自動(dòng)創(chuàng)建相應(yīng)的層。您可以通過視圖的layer屬性訪問這個(gè)層,但是不能在視圖創(chuàng)建完成后改變層對(duì)象。

如果您希望視圖使用不同類型的層,必須重載其layerClass類方法,并在該方法中返回您希望使用的層對(duì)象。使用不同層類的最常見理由是為了實(shí)現(xiàn)一個(gè)基于OpenGL的應(yīng)用程序。為了使用OpenGL描畫命令,視圖下面的層必須是CAEAGLLayer類的實(shí)例,這種類型的層可以和OpenGL渲染調(diào)用進(jìn)行交互,最終在屏幕上顯示期望的內(nèi)容。

3、在代碼中,您可以將frame、bounds、和center屬性用于不同的目的。邊界矩形代表視圖本地的坐標(biāo)系統(tǒng),因此,在描畫和事件處理代碼中,經(jīng)常借助它來取得視圖中發(fā)生事件或需要更新的位置。中心點(diǎn)代表視圖的中心,改變中心點(diǎn)一直是移動(dòng)視圖位置的***方法。邊框矩形是一個(gè)通過bounds和center屬性計(jì)算得到的便利值,只有當(dāng)視圖的變換屬性被設(shè)置恒等變換時(shí),邊框矩形才是有效的。

4、如果一個(gè)視圖必須具有某些子視圖才能工作,則應(yīng)該在其initWithFrame:方法中進(jìn)行對(duì)其創(chuàng)建,以確保子視圖可以和視圖一起被顯示和初始化。如果子視圖是應(yīng)用程序設(shè)計(jì)的一部分(而不是視圖工作必需的),則應(yīng)該在視圖的初始化代碼之外進(jìn)行創(chuàng)建。在iPhone程序中,有兩個(gè)地方最常用于創(chuàng)建視圖和子視圖,它們是應(yīng)用程序委托對(duì)象的applicationDidFinishLaunching:方法和視圖控制器的loadView方法。

5、觸摸事件通常使用基于窗口指標(biāo)系統(tǒng)的坐標(biāo)值來報(bào)告事件發(fā)生的位置,但是視圖對(duì)象需要的是相對(duì)于視圖本地坐標(biāo)的位置信息,兩者可能是不一樣的。

6、任何時(shí)候,當(dāng)視圖的布局發(fā)生改變時(shí),UIKit會(huì)激活每個(gè)視圖的自動(dòng)尺寸調(diào)整行為,然后調(diào)用各自的layoutSubviews方法,使您有機(jī)會(huì)進(jìn)一步調(diào)整子視圖的幾何尺寸。下面列舉的情形都會(huì)引起視圖布局的變化:視圖邊界矩形的尺寸發(fā)生變化。

滾動(dòng)視圖的內(nèi)容偏移量—也就是可視內(nèi)容區(qū)域的原點(diǎn)—發(fā)生變化。和視圖關(guān)聯(lián)的轉(zhuǎn)換矩陣發(fā)生變化。和視圖層相關(guān)聯(lián)的Core Animation子層組發(fā)生變化。您的應(yīng)用程序調(diào)用視圖的setNeedsLayout或layoutIfNeeded方法來強(qiáng)制進(jìn)行布局。您的應(yīng)用程序調(diào)用視圖背后的層對(duì)象的setNeedsLayout方法來強(qiáng)制進(jìn)行布局。

7、當(dāng)您改變視圖內(nèi)容時(shí),可以通過setNeedsDisplay或setNeedsDisplayInRect:方法來將需要重畫的部分通知給系統(tǒng)。

在應(yīng)用程序返回運(yùn)行循環(huán)之后,會(huì)對(duì)所有的描畫請(qǐng)求進(jìn)行合并,計(jì)算界面中需要被更新的部分;之后就開始遍歷視圖層次,向需要更新的視圖發(fā)送drawRect:消息。遍歷的起點(diǎn)是視圖層次的根視圖,然后從后往前遍歷其子視圖。在可視邊界內(nèi)顯示定制內(nèi)容的視圖必須實(shí)現(xiàn)其drawRect:方法,以便對(duì)該內(nèi)容進(jìn)行渲染。

8、您定義的每個(gè)新的視圖對(duì)象都應(yīng)該包含initWithFrame:初始化方法。該方法負(fù)責(zé)在創(chuàng)建對(duì)象時(shí)對(duì)類進(jìn)行初始化,使之處于已知的狀態(tài)。

在通過代碼創(chuàng)建您的視圖實(shí)例時(shí),需要使用這個(gè)方法。如果您從nib文件中裝載定制視圖類的實(shí)例,則需要知道:在iPhone OS中,裝載nib的代碼并不通過initWithFrame:方法來實(shí)例化新的視圖對(duì)象,而是通過NSCoding協(xié)議定義的initWithCoder:方法來進(jìn)行。

即使您的視圖采納了NSCoding協(xié)議,Interface Builder也不知道它的定制屬性,因此不知道如何將那些屬性編碼到nib文件中。所以,當(dāng)您從nib文件裝載定制視圖時(shí),initWithCoder:方法不具有進(jìn)行正確初始化所需要的信息。為了解決這個(gè)問題,您可以在自己的類中實(shí)現(xiàn)awakeFromNib方法,特別用于從nib文件裝載的定制類。

9、如果您能確定自己的描畫代碼總是以不透明的內(nèi)容覆蓋整個(gè)視圖的表面,則可以將視圖的opaque屬性聲明設(shè)置為YES,以提高描畫代碼的總體效率。當(dāng)您將視圖標(biāo)識(shí)為不透明時(shí),UIKit會(huì)避免對(duì)該視圖正下方的內(nèi)容進(jìn)行描畫。這不僅減少了描畫開銷的時(shí)間,而且減少內(nèi)容合成需要的工作。然而,只有當(dāng)您能確定視圖提供的內(nèi)容為不透明時(shí),才能將這個(gè)屬性設(shè)置為YES;如果您不能保證視圖內(nèi)容總是不透明,則應(yīng)該將它設(shè)置為NO。

10、提高描畫性能(特別是在滾動(dòng)過程)的另一個(gè)方法是將視圖的clearsContextBeforeDrawing屬性設(shè)置為NO。當(dāng)這個(gè)屬性被設(shè)置為YES時(shí),UIKIt會(huì)在調(diào)用drawRect:方法之前,把即將被該方法更新的區(qū)域填充為透明的黑色。將這個(gè)屬性設(shè)置為NO可以取消相應(yīng)的填充操作,而由應(yīng)用程序負(fù)責(zé)完全重畫傳給drawRect:方法的更新矩形中的部分。這樣的優(yōu)化在滾動(dòng)過程中通常是一個(gè)好的折衷。

11、在處理觸摸事件時(shí),UIKit會(huì)通過UIView的hitTest:withEvent:和pointInside:withEvent:方法來確定觸摸事件是否發(fā)生在指定的視圖上。雖然很少需要重載這些方法,但是您可以通過重載來使子視圖無法處理觸摸事件。

小結(jié):深度解析iPhone窗口視圖的內(nèi)容介紹完了,希望本文能對(duì)你有所幫助!

責(zé)任編輯:zhaolei 來源: 互聯(lián)網(wǎng)
相關(guān)推薦

2011-07-29 15:09:48

iPhone Category

2011-08-02 18:07:03

iPhone 內(nèi)省 Cocoa

2011-07-18 14:23:40

iPhone 多任務(wù)

2011-07-27 17:02:12

Xcode iPhone 單元測(cè)試

2011-06-07 17:16:47

iPhone 數(shù)據(jù)

2011-08-12 14:54:45

iPhone委托

2011-08-19 13:45:14

iPhone應(yīng)用iPhone OS數(shù)據(jù)

2011-07-29 14:55:25

iPhone開發(fā) 動(dòng)畫過渡

2011-08-11 17:00:33

iPhone數(shù)據(jù)庫(kù)SQLite

2011-08-19 14:47:48

iPhoneiPhone4iPad

2011-07-26 14:07:29

iPhone 二維碼

2013-01-14 11:40:50

IBMdW

2010-06-11 12:37:53

UML視圖

2011-07-22 17:24:46

iPhone 視圖

2011-07-29 10:51:41

iPhone 全屏顯示 視圖

2011-08-19 17:36:42

iPhone操作隊(duì)列Java

2009-09-23 15:12:41

Hibernate視圖

2011-07-07 17:36:13

iPhone Xcode 窗口

2011-06-02 17:27:49

iphone 多線程

2011-08-04 17:24:12

iPhone開發(fā) Xcode 窗口
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)