iOS開發之視窗和視圖

來源:互聯網
上載者:User

標籤:

視圖就是應用程式的介面。視圖可以使用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 建立可視化介面

  • UIScreen object that identifies a physical screen connected to the device.

  • 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開發之視窗和視圖

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.