網站首頁 編程語言 正文
UIScreen類
要在屏幕上顯示內容首先要創建一個窗口承載內容,要創建一個窗口,需要一個邊框(frame),含有邊框信息的底層 結構就CGRect。
每個能夠在屏幕上顯示自己的對象都有一個邊框,定義了他的顯示區域,不過許多高層的視圖類會自動計算這一信息。其他的那些類則在視圖初始化時通過一個initWithFrame的初始化方法來設置。
再來認識一個類:UIScreen。
UIScreen類代表了屏幕,通過這個類我們可以獲取一些想要的東東。
可使用下面的代碼測試一下:
CGRect screenBounds = [ [UIScreen mainScreen]bounds];//返回的是帶有狀態欄的Rect
CGRect viewBounds = [ [UIScreen mainScreen]applicationFrame];//不包含狀態欄的Rect
//screenBounds 與 viewBounds 均是相對于設備屏幕來說的
NSLog(@"screenBounds.origin.x:%f",screenBounds.origin.x);
NSLog(@"screenBounds.origin.y:%f",screenBounds.origin.y);
NSLog(@"screenBounds.size.width:%f",screenBounds.size.width);
NSLog(@"screenBounds.size.height:%f",screenBounds.size.height);
NSLog(@"viewBounds.origin.x:%f",viewBounds.origin.x);
NSLog(@"viewBounds.origin.y:%f",viewBounds.origin.y);
NSLog(@"viewBounds.size.width:%f",viewBounds.size.width);
NSLog(@"viewBounds.size.height:%f",viewBounds.size.height);
輸出結果:
2014-08-13 17:47:02.647 BookInsect[20956:907] screenBounds.origin.x:0.000000
2014-08-13 17:47:02.649 BookInsect[20956:907] screenBounds.origin.y:0.000000
2014-08-13 17:47:02.651 BookInsect[20956:907] screenBounds.size.width:320.000000
2014-08-13 17:47:02.652 BookInsect[20956:907]screenBounds.size.height:480.000000
2014-08-13 17:47:02.653 BookInsect[20956:907] viewBounds.origin.x:0.000000
2014-08-13 17:47:02.655 BookInsect[20956:907] viewBounds.origin.y:20.000000
2014-08-13 17:47:02.657 BookInsect[20956:907] viewBounds.size.width:320.000000
2014-08-13 17:47:02.668 BookInsect[20956:907] viewBounds.size.height:460.000000
UIView
下面來認識一下UIView類,這個類繼承自UIResponder,看這個名字我們就知道它是負責顯示的畫布,如果說把window比作畫框的話。我們就是不斷地在畫框上移除、更換或者疊加畫布,或者在畫布上疊加其他畫布,大小當然 由繪畫者來決定了。有了畫布,我們就可以在上面任意施為了。這個類在UIView.h里面。
UIView* myView =[[ UIView alloc]initWithFrame:CGRectMake(0.0,0.0,200.0,400.0)];//這里創建了一塊畫布,定義了相對于父窗口的位置, 以及大小。
UIWindow
UIWindow繼承自UIView,關于這一點可能有點邏輯障礙,畫框怎么繼承自畫布呢?不要過于去專牛角尖,畫框的形狀不就是跟畫布一樣嗎?拿一塊畫布然后用一些方法把它加強,是不是可以當一個畫框用呢?這也是為什么 一個view可以直接加到另一個view上去的原因了。
看一下系統的初始化過程(在application didFinishLauchingWithOptions里面):
self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
self.window.backgroundColor = [UIColor grayColor];//給window設置一個背景色
[self.window makeKeyAndVisible];//讓window顯示出來
實戰演練一下:
1)新建一個工程選擇Empty Application名字為practice
2)在application didFinishLaunchingWithOptions里面,你會發現系統已經建好一個畫框了,我們現在就用系統幫我們建好的畫框,你當然也可以自己建一個畫框,不過沒這個必要了,忘了講了,一個應用程序只能有一個畫框。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
// Override point for customization after application launch.
CGRect bound = [[UIScreen mainScreen]bounds];
NSLog(@"boundwith:%f boundheight:%f",bound.size.width,bound.size.height);
NSLog(@"boundx:%f boundy:%f",bound.origin.x,bound.origin.y);
CGRect appBound = [[UIScreen mainScreen]applicationFrame];
NSLog(@"appBoundwith:%f boundheight:%f",appBound.size.width,appBound.size.height);
NSLog(@"appBoundx:%f boundy:%f",appBound.origin.x,appBound.origin.y);
//畫第一塊畫布然涂成藍色,大小是320 X 100
CGRect CGone = CGRectMake(0.0, 0.0, 320, 100);//畫個矩形,初始化位置與大小
UIView *v_one = [[UIView alloc]initWithFrame:CGone];//初始化view
v_one.backgroundColor = [UIColor blueColor];// 涂成藍色
[self.window addSubview:v_one];//直接加到畫框上
//第二塊注意它的位置
CGRect CGtwo = CGRectMake(0.0, 100, 160, 100);//畫個矩形、初始化位置與大小
UIView *v_two = [[UIView alloc]initWithFrame:CGtwo];//初始化view
v_two.backgroundColor = [UIColor redColor];//涂成紅色
[self.window addSubview:v_two];//疊加到畫框
//第三塊注意他的位置
CGRect CGthree = CGRectMake(160, 100, 160, 100);//
UIView *v_three = [[UIView alloc]initWithFrame:CGthree];//
v_three.backgroundColor = [UIColor greenColor];//
[self.window addSubview:v_three];//
//第四塊注意它的位置
CGRect CGfour = CGRectMake(0.0, 260, 320, 200);//
UIView *v_four = [[UIView alloc]initWithFrame:CGfour];//
v_four.backgroundColor = [UIColor orangeColor];//
[self.window addSubview:v_four];//
//第五塊,計算一下它的位置,看看它的效果,
//你可以讓試一下把這段代碼移到第一快初始化的上面試試,會有意想不到的效果
CGRect CGfive = CGRectMake(100, 150, 160, 200);
UIView *v_five = [[UIView alloc]initWithFrame:CGfive];
v_five.backgroundColor = [UIColor yellowColor];
[self.window addSubview:v_five];
self.window.backgroundColor = [UIColor grayColor];//
[self.window makeKeyAndVisible];//
//最后記得release
v_one = nil;
v_two = nil;
v_three = nil;
v_four = nil;
v_five = nil;
return YES;
//self.window.backgroundColor = [UIColor whiteColor];
//[self.window makeKeyAndVisible];
//return YES;
}
取得畫面工作區域的大小
iOS 可以在很多 Apple 的裝置上執行,然而每個裝置所提供的工作區域大小 Application Frame 也不盡香同,下面提供一個簡單的方法,幫助你可以快速找出目前工作區域的畫面的大小,程式碼如下。
1,首先是狀態列 Status Bar 的部份。
//取得StatusBar的位置和大小
[self.view addSubview:theToolbar];
CGRect statusBarRect = [[UIApplication sharedApplication]statusBarFrame];
NSLog(@\"%@\", NSStringFromCGRect(statusBarRect));
2,再來是可工作區域的大小,如果你的應用程式包含狀態列,那么可工作區域的大小就會是整個畫面的減去狀態列所剩下的區域。
//取得工作區域的位置和大小
CGRect workSpaceRect = [[UIScreen mainScreen]applicationFrame];
NSLog(@\"%@\", NSStringFromCGRect(workSpaceRect));
3,最后就是整個畫面的大小
//取得整個畫面的位置和大小
CGRect windowRect = [[UIScreen mainScreen]bounds];
NSLog(@\"%@\", NSStringFromCGRect(windowRect));
上述程式碼皆是將取得的大小范圍資訊儲存在 CGRect 型態的變數中,再將此變數以字串的方式顯示出來。
一些 UIView 中管理 Subview 常用的方法
一個 UIView 里面可以包含許多的 Subview(其他的 UIView),而這些 Subview 彼此之間是有所謂的階層關系,這有點類似繪圖軟體中圖層的概念,下面程式碼示演示了幾個在管理圖層(Subview)上常用的方法,其程式碼如下。
首先是大家最常使用的新增和移除 Subview。
//將Subview從當前的UIView中移除
[Subview removeFromSuperview];
//替UIView增加一個Subview
[UIView addSubview:Subview];
在 UIView 中將 Subview 往前或是往后移動一個圖層,往前移動會覆蓋住較后層的 Subview,而往后移動則會被較上層的 Subview 所覆蓋。
//將Subview往前移動一個圖層(與它的前一個圖層對調位置)
[UIView bringSubviewToFront:Subview];
//將Subview往后移動一個圖層(與它的后一個圖層對調位置)
[UIView sendSubviewToBack:Subview];
在 UIView 中使用索引 Index 交換兩的 Subview 彼此的圖層層級。
//交換兩個圖層
[UIView exchangeSubviewAtIndex:indexA withSubviewAtIndex:indexB];
使用 Subview 的變數名稱取得它在 UIView 中的索引值(Index )。
//取得Index
NSInteger index = [[UIView subviews] indexOfObject:Subview名稱];
替 Subview 加上 NSInteger 的註記 (Tag),好讓之后它們分辨彼此
//加上註記
[Subview setTag:NSInteger];
最后是取得 UIView 中所有的 Subview,呼叫此方法會傳回一個 NSArray,并以由后往前的順序列出這些 Subview,下圖中是列出范例圖片里 Root 中所有的 Subview。
//取的UIView下的所有Subview
[UIView subviews]
原文鏈接:https://www.gowhich.com/blog/75
相關推薦
- 2022-09-18 jenkins配置golang?代碼工程自動發布的實現方法_Golang
- 2022-11-06 詳解Python中的null是什么_python
- 2022-09-09 Python如何生成指定區間中的隨機數_python
- 2021-12-02 Android?Gson基本用法學習_Android
- 2022-10-15 Tomcat啟動核心流程示例詳解_Tomcat
- 2022-10-21 K8s解決主機重啟后kubelet無法自動啟動問題(推薦)_云其它
- 2023-06-18 Redis優雅地實現延遲隊列的方法分享_Redis
- 2023-07-03 利用ant-design下拉選擇框select的labelInValue屬性給下拉選項添加圖標
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支