iOS开发创建frame实现window窗口view视图示例

目录
  • UIScreen类
  • UIView
  • UIWindow
  • 实战演练一下:
    • 取得画面工作区域的大小
    • 一些 UIView 中管理 Subview 常用的方法

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]

以上就是iOS开发创建frame实现window窗口view视图示例的详细内容,更多关于iOS开发创建frame的资料请关注我们其它相关文章!

(0)

相关推荐

  • iOS状态栏frame计算问题的实现

    我们知道除了iPhoneX以外的设备导航栏默认高度都是20,当然苹果也为我们提供了计算状态栏frame的方法: [[UIApplication sharedApplication] statusBarFrame]; 这个方法在正常情况下返回的状态栏高度也是20,但当正在通话时,或者后台有APP正在使用定位功能时,顶部会出现两种提示条: 正在通话.png 后台有APP使用定位.jpeg 当顶部有这两种提示条出现时,上面的statusBarFrame方法返回的状态栏高度就变成了40,在手动更改顶部约

  • ios 不支持 iframe 的完美解决方法(兼容iOS&安卓)

    最近做微信公众号页面,因为入口不同,需要把公共页面抽取出来,然后根据不同的值,传递给后台不同的入口.刚开始用iframe页面嵌套(第一次尝试使用),但发现iOS系统对iframe嵌套页面的高度和定位控制的不到位,具体表现为,当嵌套的子页面的高度大于父页面的高度,且子页面中有触发弹框事件时,这时,如果子页面高度远远大于父页面高度,就会出现弹框找不到的情况,其实可能是在视口以下,弹框的位置只是相对于子页面来定位,并没有相对于视口定位. 尝试了好多种方法,均不理想,而安卓系统则表现良好,于是想到,iO

  • ios设备使用iframe宽度超出屏幕的解决方法

    场景 在做公司官网h5项目时遇到iframe在苹果X手机上右侧超出屏幕的问题,感觉像是被截断一样,但是在其他手机上显示正常. 分析 问题原因:页面a利用iframe嵌入了b,同时设置iframe的宽度为100% ,但是页面b的实际宽度要大于外层设置的100%. 正常情况下,页面b的显示宽度应该为外层赋予的100%,但是在ios上,当iframe内真实宽度大于外层给予的宽度的时候,显示的宽度则为真实宽度. 解决 1.给iframe的外层div添加样式:overflow: auto;-webkit-

  • iOS中封装.framework及使用的方法详解

    .framework是什么? 这个问题相信做iOS的都知道答案. 在我们的日常开发中,经常会用到各种已经封装好的库,比如支付宝.微信SDK等等中的库,这些库可以给我们的开发带来很大的便利.有的时候,由于工作的需要,我们需要对自己的项目进行封装,生成库,方便别人的使用.在这里就边参考好点的博客,边总结一下我们经常看到的.framework. 那什么是"库"呢? "库"是共享程序代码的一种方式!同行总结的这句话很简单也很好的说明了它的作用! 一般的分为"静态库

  • iOS开发创建frame实现window窗口view视图示例

    目录 UIScreen类 UIView UIWindow 实战演练一下: 取得画面工作区域的大小 一些 UIView 中管理 Subview 常用的方法 UIScreen类 要在屏幕上显示内容首先要创建一个窗口承载内容,要创建一个窗口,需要一个边框(frame),含有边框信息的底层 结构就CGRect. 每个能够在屏幕上显示自己的对象都有一个边框,定义了他的显示区域,不过许多高层的视图类会自动计算这一信息.其他的那些类则在视图初始化时通过一个initWithFrame的初始化方法来设置. 再来认

  • iOS开发-调用系统相机和相册获取照片示例

    前言:相信大家都知道大部分的app都是有我的模块的,而在我的模块基本都有用户的头像等信息,并且是可以更改头像的.那么今天小编给大家简单介绍一下iOS开发中如何调用系统相机拍照或者相册获取照片.要获取系统相机或者相册,我们需要使用到 UIImagePickerController 这个类.下面我们来看一下如何实现: 首先,需要遵循 UIImagePickerController 代理的两个协议: <UIImagePickerControllerDelegate, UINavigationContr

  • iOS开发中runtime常用的几种方法示例总结

    前言 Objective-C runtime是一个实现Objective-C语言的C库.它是一门编译型语言.也是一门动态型的语言(这里强调下OC是静态类型语言),之前没接触runtime的时候也不觉着它有多重要,接触之后才发现其实runtime挺强大的.就拿我们在iOS开发中所使用的OC编程语言来讲,OC之所以能够做到即是编译型语言,又能做到动态语言,就是得益于runtime的机制. 最近公司项目中用了一些 runtime 相关的知识, 初看时有些蒙, 虽然用的并不多, 但还是想着系统的把 ru

  • iOS开发中使用文字图标iconfont的应用示例

    在iOS的开发中,各种图标的使用是不可避免的,如果把全部图标做成图片放在项目中,那么随着项目的逐渐庞大起来,图片所占的地方就会越来越大,安装包也就随之变大了,如果图标需要根据不同的场景改变使用不同的颜色,那么,如果做成图片就需要多张不同颜色的图片,对于能更换皮肤的APP来说,安装包也就会更大,为了让APP的安装包瘦身,iconfont就产生了.关于iconfont的介绍与制作方式就暂时不进行介绍了. 第一步:获取iconfont文件. 公司会有UI做图,让他们提供文件就好了,如果自己学习测试或者

  • iOS开发中最基本的位置功能实现示例

    定位获取位置及位置编码-反编码 我们的应用程序,可以通过添加Core Location框架所包含的类,获取设备的地图位置. 添加CoreLocation.framework框架,导入#import<CoreLocation/CoreLocation.h>. 使用地图服务时,会消耗更多地设备电量.因此,在获取到设备的位置后,应该停止定位来节省电量. 我们通过一个demo来展示内容与效果 复制代码 代码如下: // // HMTRootViewController.h // My-GPS-Map

  • 比较IOS开发中常用视图的四种切换方式

    在iOS开发中,比较常用的切换视图的方式主要有以下几种: 1. push.pop 使用举例(ViewController假设为需要跳转的控制器): [self.navigationController pushViewController:ViewController animated:YES]; //入栈,跳转到指定控制器视图 [self.navigationController popViewControllerAnimated:YES]; //弹栈,返回到前一个视图 [self.navig

  • IOS开发自定义view方法规范示例

    目录 前言 一.关于自定义View的初始化方法 二.关于addSubview 三.关于layoutSubviews 四.关于frame与bounds 总结 前言 对于接触业务开发的童鞋,自定义View的开发是进行最频繁的工作了.但发现一些童鞋还是没有以一个好的规范甚至以一种错误的方式来搭建UI控件.由此,本文将以以下目录来进行讲叙,详细描述关于自定义View的一些书写注意事项. 关于自定义View的初始化方法 关于addSubview 关于layoutSubviews 关于frame与bound

  • IOS开发OC代码中创建Swift编写的视图控制器

    IOS开发OC代码中创建Swift编写的视图控制器 背景 近日在和一群朋友做项目,我和另一位同学负责iOS客户端,我是一直使用OC的,而他只会Swift,因此在我们分工协作之后,就需要把代码合在一起,这就牵扯到如何在TabbarController中添加一个swift创建的子控制器的问题. 解决 首先在一个OC项目中新建一个Swift类,继承自UITableViewController,并且修改其view背景色,方便后续测试. import UIKit class ESSwiftTableVie

  • iOS开发中AVPlayer的简单应用

    前言 在iOS开发中,播放视频通常有两种方式,一种是使用MPMoviePlayerController(需要导入MediaPlayer.Framework),还有一种是使用AVPlayer.关于这两个类的区别简而言之就是MPMoviePlayerController使用更简单,功能不如AVPlayer强大,而AVPlayer使用稍微麻烦点,不过功能更加强大.下面这篇文章主要介绍下AVPlayer的简单应用,需要的朋友们一起来看看吧. AVPlayer的简单应用 1.引入系统框架 2.创建视频的u

  • iOS开发--仿新闻首页效果WMPageController的使用详解

    这一篇记录的是iOS开发中第三方库WMPageController控件的使用方法,主要是用来分页显示内容的,可以通过手势滑动来切换页面,也可以通过点击标题部分来切换页面,如下图所示: 使用方法: 新建工程DemoTest1,然后通过cocoapods引入WMPageController到项目中,Podfile文件的内容如下: platform :ios,'7.0' target 'DemoTest1' do pod 'WMPageController', '~> 1.6.4' end 方法一:

随机推荐