標籤:
視圖就是應用程式的介面。視圖可以使用nib檔案實現,也可以使用代碼建立。一個視圖也是一個響應器(UIResponder的子類)這意味著一個視圖可以與使用者互動。因此,視圖不只是使用者可看到的介面,也是可以和使用者互動的介面。
視圖相關結構的名稱、屬性和功能
CGPoint {x,y} 座標資訊 視圖所在的座標資訊
CGSize {width,height} 寬度和高度 視圖所在的大小資訊
CGRect {origin,size} CGPoint和CGSize的綜合 視圖所在的座標(視圖最左上方的點)和大小資訊。
視圖相關結構的函數
CGPointMake(x,y) 聲明位置資訊
CGSizeMake(width,height) 聲明大小資訊
CGRectMake(x,y,width,height) 聲明位置和大寫資訊
Frame和Bounds
視圖的位置和大小可以用兩種方式來表示,一種方式是Frame(架構)、即按照其父視圖為起點,得出它自己的位置資訊。另一種方式是Bound(邊界),即按照它自己為起點,得出其位置。
frame和bounds是UIView中的兩個屬性(property)。
frame指的是:該view在父view座標系統中的位置和大小。(參照點是父親的座標系統)
bounds指的是:該view在本身座標系統中 的位置和大小。(參照點是本身座標系統)
-(CGRect)frame{ return CGRectMake(self.frame.origin.x,self.frame.origin.y,self.frame.size.width,self.frame.size.height);}-(CGRect)bounds{ return CGRectMake(0,0,self.frame.size.width,self.frame.size.height);}
中View B是View A的子視圖,那麼,View B的frame屬性為origin(200,100),size(200,250),而View B的bounds屬性為origin(0,0),size(200,250)。
center屬性則用CGPoint表示矩形中心點在其父視圖中的位置,如中View B的center屬性為(300,200)。
frame、bounds和center三個屬性是相互關聯、相互影響的,其中一個屬性發生變化,其他屬性也會跟著變化。
Screens, Windows, and Views 建立可視化介面
A UIScreen object that identifies a physical screen connected to the device.
A UIWindow object that provides drawing support for the screen.
A set of UIView objects to perform the drawing. These objects are attached to the window and draw their contents when the window asks them to.
類的繼承關係
UIScreen
UIScreen對象代表iOS裝置的物理螢幕([UIScreen mainScreen])。此螢幕對象建立視圖布局邊界與像素空間之間的映射。它返回全屏大小(bounds)或只是應用程式佔用的矩形(applicationFrame)。
CGrect screenBounds = [ [UIScreen mainScreen] bounds];//返回的是帶有狀態列的Rect對於iphone4來說screenBounds=0,0,320,480CGRect viewBounds = [ [UIScreen mainScreen] applicationFrame];//不包含狀態列的Rect對於iphone4來說,viewBounds=0,20,320,460
UIWindow
視圖層次的最高層是應用程式視窗,視窗是UIWindow的一個執行個體,UIWindow是UIView的子類 。視窗的主要功能一是提供一個地區顯示視圖(容器),二是將事件分發給視圖。視窗本身不具有任何可見的內容,但它對於應用的視圖提供一個基本的視窗。應用程式應該只有一個主視窗,它佔據整個螢幕形成背景,並是所有可見視圖的超視圖,其他視圖就是它的子視圖。
視窗是項目的主nib檔案中的一個頂層nib對象。在應用程式運行時,系統自動裝載該nib檔案,視窗被執行個體化。主nib檔案中的另一個頂層的nib對象是應用程式委託(delegate),它有一個window輸出口(outlet)指向這個視窗。當程式運行時,系統產生該應用程式委託的一個執行個體。它的window屬性指向視窗。
通常我們可以採取兩種方法將view添加到UIWindow中:
1、addSubview
直接將view通過addSubview方式添加到window中,程式負責維護view的生命週期以及重新整理,但是並不會為去理會view對應的ViewController,因此採用這種方法將view添加到window以後,我們還要保持view對應的ViewController的有效性,不能過早釋放。
2、rootViewController
rootViewController是UIWindow的一個遍曆方法,通過設定該屬性為要添加view對應的ViewController,UIWindow將會自動將其view添加到當前window中,同時負責ViewController和view的生命週期的維護,防止其過早釋放
UIWindow在顯示的時候會根據UIWindowLevel進行排序的,即Level高的將排在所有Level比他低的層級的前面。下面我們來看UIWindowLevel的定義:
typedef CGFloat UIWindowLevel;UIKIT_EXTERN const UIWindowLevel UIWindowLevelNormal;UIKIT_EXTERN const UIWindowLevel UIWindowLevelAlert;UIKIT_EXTERN const UIWindowLevel UIWindowLevelStatusBar;
iOS系統中定義了三個window層級,其中每一個層級又可以分好多子層級(從UIWindow的標頭檔中可以看到成員變數CGFloat _windowSublevel;),不過系統並沒有把則個屬性開出來。UIWindow的預設層級是UIWindowLevelNormal。UIWindowLevelNormal<UIWindowLevelStatusBar<UIWindowLevelAlert.
UIView
視圖是UIView類的執行個體,負責在螢幕上定義一個矩形地區。在iPhone的應用程式中,視圖在展示使用者介面及響應使用者介面互動方面發揮關鍵作用。每個視圖對象都要負責渲染 視圖矩形地區中的內容,並響應該地區中發生的觸碰事件。這一雙重行為意味著視圖是應用程式與使用者互動的重要機制。在一個基於模型-視圖-控制器的應用程式中,視圖對象明顯屬於視圖部分。
UIView有一個超視圖(superview)屬性和一個子視圖(subviews)屬性。subviews是一個UIViews的NSArray,按照由後往前的順序放置。這有助於在代碼中訪問視圖階層。isDescendantOfView方法可以判斷一個視圖是否是另一個視圖的子視圖。
UIView提供了很多建立和管理檢視的方法。
1、添加視圖
insertSubview:atIndex: //放在子視圖數組的具體索引位置
insertSubview:aboveSubview: //某個子視圖前面
insertSubview:aboveSubview: //某個子視圖前面
2、重新排序和刪除子視圖
[parentView exchangeSubviewAtIndex:i withSubviewAtIndex:j]//交換兩個視圖的位置
bringSubviewToFront:和sendSubviewToBack://將子視圖提前活置後
[childView removeSuperview]//刪除某個視圖的子視圖
3、視圖回調
某個視圖的層次一改變,該視圖就會收到一次回調。
a、調用addSubivew:成功後會給該視圖發送didAddSubivew:回調,觸發UIView的子類在心增視圖時執行其他動作。
b、didMoveToSuperview:會通知相關視圖他們的上級視圖已經變化。
c、視圖移動前會發出willMoveToSuperview:回調
d、didMoveToWindow:回調和didMoveToSuperview:相似,從命名上能看出其區別。
e、willMoveToWindow:在視圖移動前發出的回調。
f、willRemoveToSubview:回調通知父視圖子視圖即將被刪除
UIView掌管直接螢幕繪圖。他的drawRect:方法提供一種低級方式來直接繪製內容,允許使用Quartz 2D調用建立和顯示任意元素,可將這兩個元素結合起來共同構建具體、可操作的介面。
當使用者觸控螢幕幕時,Touchview類收集一系列點,在每個觸摸移動之處,touchesMoved:WithEvent:方法調用setNeedsDisplay。這又會觸發對drawRect:方法的調用,其中視圖將這些點繪製成線段來建立一個可視螢幕路徑。
iOS開發之視窗和視圖