首要的第一步是了解iPhone应用程序的声明周期和它的界面分布情况,UIApplication和UIView相关知识是iPhone应用程序开发基础。
1.UIWindow和UIView:
在iOS平台上运行的程序都有一个UIApplication类的对象,UIApplication类继承于UIResponder类,它是iOS应用程序的起点,负责初始化和显示UIWindow,还接收事件,通过委托"UIApplicationDelegate"来处理,此外就是帮助管理应用程序的生命周期。
UIKit框架是应用程序的基础,它通过main和UIApplicationMain进行对用户界面的管理/事件的管理及应用程序整体的运行管理。当进入到应用程序后,main函数和UIApplicationMain函数相继执行,然后通过初始化窗口信息来载入应用程序的主窗口,接着会处理响应事件。
应用程序的状态:
- Not Running(未运行) :程序没有启动;
- Inactive(未激活):程序在前台运行,但没有收到事件;
- Active(激活):程序在前台运行,而且接收到事件;
- Background(后台):续程在后台但能执行代码;
- Suspended(挂起):程序在后台不能执行代码。
UIKit | 程序代码 |
---|---|
用户单击应用程序图标 | |
main函数被执行 | |
UIApplication Main函数被执行 |
ApplicationDidLaunching WithOptions: |
响应事件 | 处理事件 |
是否从前台推出 |
ApplicationWillResignActive: |
应用程序移到后台 | ApplicationDidEnterBackground |
UIApplication主要任务是处理用户事件,它创建一个队列,将所有用户事件都放入队列中。在处理过程中,它会发送当前事件到一个合适处理事件的控件。即UIApplication类不具体实现某项功能,只负责监听事件,当需要实际完成工作时,就将工作分配给UIApplicationDelegate去完成,而在UIApplicationDelegate中定义了许多协议需要实现,这些协议中定义好方法就是UIApplication对象监听到系统变化的时候通知UIApplication对象代理类执行的相应方法。
- 在应用程序将要进入到非活动状态时执行,在此期间程序不接受消息(类似Android中activity的onCreate()这个方法是启动activity首先执行)
-(void)applicationWillResignActive:(UIApplication *)application
- 在应用程序将要进入活动状态时执行。(类似Android中activity的onResume()此方法在进入可视状态,不接受事件的处理。或者是onReStart()方法)
-(void)applicationDidBecomeActive:(UIApplication *)application
- 执行此方法可以进行内存清理以防止程序被太多内存所占用而导致程序执行终止。(类似Android中activity的onDestory()方法在销毁activity时进行的操作方法)
-(void)applicationDidReceiveMemoryWarning:(UIApplication *)application
- 此方法的功能时在程序载入后可以执行一些用户需要的操作。
-(void)applicationDidFinishLaunching:(UIApplication *)application
- 此方法是程序被推送到后台时调用。(类似Android中activity的onPause()方法,可视状态,但不可接受事件处理。或onStop()方法)
-(void)applicationDidEnterBackground:(UIApplication *)application
2 .窗口和视图:
在iOS应用程序中一般只有一个窗口,表示为一个UIWindow类,iOS是单窗口多视图的一个系统。UIWindow类一个应用程序最为基础的类,就像一个画布,UIWindow就是最底层的画布,我们需要做的就是往窗口中加入各种视图。UIWindow其实就是一个视图,因为它的父类是UIView。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
//创建窗口
// self.viewController = [[ViewController alloc] initWithNibName: @"ViewController" bundle: nil];
// self.window.rootViewController;
self.window = [[[UIWindow alloc]initWithFrame:[[UIScreen mainScreen]bounds]] autorelease];
NSArray *windows = [[UIApplication sharedApplication] windows];
for(UIWindow *window in windows) {
if(window.rootViewController == nil){
UIViewController *vc = [[UIViewController alloc]initWithNibName:nil bundle:nil];
window.rootViewController = vc;
}
}
// self.window.backgroundColor = [UIColor cyanColor];
[self.window makeKeyAndVisible];
//创建视图
UIView *baseView = [[UIView alloc]initWithFrame:CGRectMake(10, 50, 300, 400)];
baseView.backgroundColor = [UIColor redColor];
[self.window addSubview:baseView];
[self.window release];
[self.window makeKeyAndVisible];
return YES;
}
应哟个程序在载入时,系统就创建一个UIWindow窗口作为基本的窗口,并设置了它的尺寸等于物理设备尺寸,通过[[UIScreen mainScreen] bounds]这条语句能获得不同设备当前的屏幕尺寸,可以通用于多种设备之间,最后让窗口显示在屏幕上。不必考虑对窗口的操作,因为一般的操作都建立在视图上,但要了解窗口和视图之间的框架结构关系。
视图是UIView类的实例,它负责在屏幕上绘制一个矩形区域。视图的作用主要体现在用户界面的显示及相应用户界面交互上。UIView有父视图(superview)和子视图(subview)属性,通过定义这两个属性,可以建立视图之间的层次关系,并且这两个属性还关系到视图座标的确定。
- CGPoint{x,y} 代表了所在视图的座标信息;
- CGSize{width,height} 代表了所在视图的大小信息;
- CGRect{origin,size} 代表所在视图的座标(视图左上角的点)信息和大小信息,还有3个于之对应的函数;
- CGPointMake{x,y} 声明了位置信息;
- CGSizeMake(width,height) 声明了位置信息和大小信息;
- CGRectMake{x,y,width,height} 声明了位置和大小信息。
3.iOS座标系统:
在使用UIView时,视图的座标位置是一个很重要的信息,iOS中描述视图的座标位置有三个属性分别是frame/bounds和center。
- frame:用来描述当前视图在父视图中的座标位置和大小;
- bounds:用来描述当前视图在其自身座标系统中的位置和大小;
- center:用来描述当前视图在的中心点在父视图中的位置。
4.视图的层次关系及常用属性:
UIView层次结构堪称数据结构中的树型结构,一个视图可以有多个子视图,但是只能有一个父视图(基视图)。在添加子视图时,最后添加的视图会显示在最顶层。
- 添加和移除子视图:[UIView addSubview:subView]
[UIView addSubview:subView];
[subView release];
- 前移和后移视图:[UIView bringSubviewToFront:subview],命令将特定视图移到顶层。父视图管理子视图过程中,是通过一个有序的数组存储它的子视图,因此,数组存储的顺序会影响到子视图的显示效果。
- 获取视图的index值:对多个视图进行操作,首先要获取各个视图的index值;:
NSInterger index = [[UIView subViews]indexOfObject:Subview];
[View insertSubview:subviewAtIndex:0]; //将视图添加到特定的视图上
- 获取所有视图信息:父视图可以通过[view1 subviews]将view1子视图的信息以数组的形式输出。
- 设置tag值对视图进行操作:通过设置视图的tag值,可以标记视图对象(整数),它能使用viewWithTag方法来更方便地对视图进行操作。Tag值的默认值是0,可以通过view.tag设置。clipsTobounds属性是将子视图超出父视图的范围隐藏起来,他默认是no。“view.clipsTobounds = YES”显示超出部分;alpha属性是透明度;hidden属性是否隐藏视图。
//
// ViewController.m
// MyFristIos
//
// Created by 王耀 on 2019/6/13.
// Copyright © 2019 王耀. All rights reserved.
//
#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
NSLog(@"ViewController添加textview");
UIView *viewChange1 = [[UIView alloc]initWithFrame:CGRectMake(100, 100, 120, 160)];
viewChange1.tag = 1;
viewChange1.backgroundColor = [UIColor yellowColor];
[self.view addSubview:viewChange1];
UIView *viewChange2 = [[UIView alloc]initWithFrame:CGRectMake(110, 150, 100, 50)];
viewChange2.tag = 2;
viewChange2.backgroundColor = [UIColor blueColor];
[self.view addSubview:viewChange2];
//创建改变视图层次按钮1
UIButton *button1 = [UIButton buttonWithType:UIButtonTypeRoundedRect];
button1.frame = CGRectMake(120, 270, 100, 30);
button1.backgroundColor = [UIColor whiteColor];
[button1 setTitle:@"view1 top" forState:UIControlStateNormal];
[button1 addTarget:self action:@selector(ViewChange1) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:button1];
//创建改变视图层次按钮2
UIButton *button2 = [UIButton buttonWithType:UIButtonTypeRoundedRect];
button2.frame = CGRectMake(120, 320, 100, 30);
button2.backgroundColor = [UIColor whiteColor];
[button2 setTitle:@"view2 top" forState:UIControlStateNormal];
[button2 addTarget:self action:@selector(ViewChange2) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:button2];
//创建改变视图颜色的按钮3
UIButton *button3 = [UIButton buttonWithType:UIButtonTypeRoundedRect];
button3.frame = CGRectMake(120, 370, 100, 30);
button3.backgroundColor = [UIColor whiteColor];
[button3 setTitle:@"change color" forState:UIControlStateNormal];
[button3 addTarget:self action:@selector(ViewChange3) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:button3];
}
-(void) ViewChange1
{
UIView *view = [self.view viewWithTag:1];
[self.view bringSubviewToFront:view];
}
-(void) ViewChange2
{
UIView *view = [self.view viewWithTag:2];
[self.view bringSubviewToFront:view];
}
-(void) ViewChange3
{
UIView *view = [self.view viewWithTag:2];
view.backgroundColor = [UIColor greenColor];
}
@end
5.UIView中的layer属性:
在UIView视图上进行各种可视化的操作,以达到用户所需的效果。在UIView中有一个layer属性,每一个视图都有一个layer属性。真正绘图的部分是由CALayer类来完成的,UIView的功能是CALayer的管理容器,在访问UIView中与绘图/座标有关的属性时,其实时访问了它的管理的CALayer的相关属性。在使用CALayer之前需要将QuartzCore.framework框架引入项目中。
UIView主要时用于对显示内容的管理,而CALayer则侧重于对内容的绘制。
-(void) viewDidLoad1
{
UIView *baseView = [[UIView alloc]initWithFrame:CGRectMake(120, 500, 300, 120)];
baseView.backgroundColor = [UIColor blueColor];
[self.view addSubview:baseView];
//设置视图的layer属性
baseView.layer.backgroundColor = [UIColor orangeColor].CGColor;
baseView.layer.cornerRadius = 20.0f;
//创建子layer层
CALayer *Mylayer = [CALayer layer];
Mylayer.frame = CGRectMake(50, 700, 200, 100);
Mylayer.backgroundColor = [UIColor redColor].CGColor;
Mylayer.cornerRadius = 10.0f; //设置圆角切值
[baseView.layer addSublayer:Mylayer];
}
6.内容模式属性(ContenMode):
ConentMode(内容模式)用来设置视图的显示的方法,如居中/向左对齐/缩放等,它是一个枚举类型的数据里面有许多常量。要设置视图属性,则可以通过view.ContentMode来时止,选择属性的时候可以按住“Command”键进入API接口进行选择。
typedef NS_ENUM(NSInteger, UIViewContentMode) {
UIViewContentModeScaleToFill,
UIViewContentModeScaleAspectFit, // contents scaled to fit with fixed aspect. remainder is transparent
UIViewContentModeScaleAspectFill, // contents scaled to fill with fixed aspect. some portion of content may be clipped.
UIViewContentModeRedraw, // redraw on bounds change (calls -setNeedsDisplay)
UIViewContentModeCenter, // contents remain same size. positioned adjusted.
UIViewContentModeTop,
UIViewContentModeBottom,
UIViewContentModeLeft,
UIViewContentModeRight,
UIViewContentModeTopLeft,
UIViewContentModeTopRight,
UIViewContentModeBottomLeft,
UIViewContentModeBottomRight,
};