iOS开发之窗口和视图
? ?視圖就是應用程序的界面。視圖可以使用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(框架)、即按照其父視圖為起點,得出它自己的位置信息。另一種方式是Bound(邊界),即按照它自己為起點,得出其位置。
frame和bounds是UIView中的兩個屬性(property)。
frame指的是:該view在父view坐標系統中的位置和大小。(參照點是父親的坐標系統)
bounds指的是:該view在本身坐標系統中 的位置和大小。(參照點是本身坐標系統)
| 1 2 3 4 5 6 | -(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.
類的繼承關系
?
UIScreenUIScreen對象代表iOS設備的物理屏幕([UIScreen mainScreen])。此屏幕對象建立視圖布局邊界與像素空間之間的映射。它返回全屏大小(bounds)或只是應用程序占用的矩形(applicationFrame)。
| 1 2 3 4 5 | CGrect screenBounds = [ [UIScreen mainScreen] bounds];//返回的是帶有狀態欄的Rect 對于iphone4來說screenBounds=0,0,320,480 CGRect 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的定義:
| 1 2 3 4 5 | 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:方法的調用,其中視圖將這些點繪制成線段來創建一個可視屏幕路徑。
?
以上內容參考至網絡和官方文檔:View and Window Architecture
轉載于:https://www.cnblogs.com/zsw-1993/p/4879910.html
總結
以上是生活随笔為你收集整理的iOS开发之窗口和视图的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【进程】进程通信-共享内存
- 下一篇: 解决数据库 Table 'content