iOS学习20之UIView
1. UI编程概述
UI的本意是用户界面,是英文 User 和 Interface 的缩写。
UI设计则是指对软件的人机交互、操作逻辑、界面美观的整体设计。
好的UI设计不仅是让软件变得有个性有品位,还要让软件的操作变得舒适简单、自由,充分体现软件的定位和特点。
软件设计可分为两个部分:编码设计与UI设计。
从字面上看是用户与界面两个部分组成,但实际上还包括用户与界面之间的交互关系。
2. UIWindow
1> 概述
管理和协调应用程序的显示。
UIWindow 类是 UIView 的子类,可以看作是特殊的 UIView 。
一般应用程序只有一个 UIWindow 对象。
2> 自动创建流程
程序运行从 main() 函数开始执行 UIApplicationMain() 创建代理
加载配置文件 info.plist (Main Interface设置了程序的主入口)
根据 name 找到对应的 storyboard , 加载 storyboard
storyboard 会自动创建一个 UIWindow 对象
3> 手动创建流程
① 关闭 Main Interface
② 在 AppDeletegate.m 的 application 方法中创建,创建代码如下:
1 // 1.创建UIWindow对象,并设置为屏幕的大小 2 // [UIScreen mainScreen].bounds 获取屏幕的大小 3 self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]; 4 5 // 2.给window设置背景的颜色(白色) 6 self.window.backgroundColor = [UIColor whiteColor]; 7 8 // 3.使window显示 9 // makeKeyAndVisible 将窗口设为主窗口并显示 10 [self.window makeKeyAndVisible]; 11 12 // 4.为window设置根视图控制器(XCode7.0之后必须写) 13 // 创建视图控制器对象 14 ViewController *VC = [[ViewController alloc] init]; 15 16 // 把VC设置为window的根视图控制器 17 self.window.rootViewController = VC;
4> 屏幕大小
iPhone4(s) : 320 * 480
iPhone5(s) : 320 * 568
iPhone6(s) : 375 * 667
iPhone6(s) Plus : 414 * 736
3. UIView
1> 概述
UIView 表示屏幕上的一块矩形区域。
它在App中占有绝对重要的地位。
因为iOS中几乎所有可视化控件都是 UIView 的子类。
负责渲染区域的内容,并且响应该区域内发生的触摸事件。
2> 功能
- 管理矩形区域里的内容
- 处理矩形区域中的事件
- 子视图的管理
- 实现UIView动画
UIView作为父类,子类也具有这些功能
3> 坐标系相关数据的类型
坐标:
struct CGPoint {
CGFloat x;
CGFloat y;
};
typedef struct CGPoint CGPoint;
大小:
struct CGSize {
CGFloat width;
CGFloat height;
};
typedef struct CGSize CGSize;
矩形:
struct CGRect {
CGPoint origin;
CGSize size;
};
typedef struct CGRect CGRect;
iOS 中使用 CGRect 类型确定矩形位置以及大小
CGRectMake() 函数可以帮我们快速构造一个 CGRect 变量。
4> UIView常用属性
1 // center 中心点 2 view1.center = self.window.center; // 设置view1居中 3 NSLog(@"x = %.2f, y = %.2f", view1.center.x, view1.center.y); 4 5 // alpha 视图的透明度 6 view1.alpha = 0.9; 7 8 // hidden 9 view1.hidden = NO; 10 11 // superview 12 NSLog(@"%@", view1.superview); 13 14 // subviews 15 NSLog(@"%@", self.window.subviews); 16 17 // tag 唯一id 18 view1.tag = 101; 19 20 // 通过tag值查找view(在父视图上查找) 21 NSLog(@"%@", [self.window viewWithTag:101]);
5> 父视图 和 子视图
使用 addSubview: 添加视图,要确定添加到谁上面。
被添加的视图称为子视图 , 添加到的视图称为父视图。
6> 添加视图
1 // 同一个父视图上,指定位置插入子视图 2 [view2 insertSubview:view4 atIndex:0]; 3 4 // 同一父视图上,将一个视图添加到另一个视图的上面 5 [view2 insertSubview:view5 aboveSubview:view4]; 6 7 // 同一父视图上,将一个视图添加到另一个视图的下面 8 [view2 insertSubview:view3 belowSubview:view5];
7> 修改视图的层次关系
1 // 把指定的子视图移动到最前面 2 [view2 bringSubviewToFront:view4]; 3 4 // 把子视图移动到最后面 5 [view2 sendSubviewToBack:view4]; 6 7 // 交换两个指定索引位置的子视图 8 [view2 exchangeSubviewAtIndex:2 withSubviewAtIndex:1]; 9 10 // 把子视图从父视图移除 11 [view4 removeFromSuperview];
8> frame和bounds的区别
frame : 根据父视图坐标系来确定自己的位置
bounds : 该视图在自己坐标系的位置和大小
修改bounds并不会引起视图位置的变化 ,会影响自身子视图的位置
修改frame会引起视图位置的变化
3. 应用程序启动流程
1>main函数
任何一个程序,无论是基于Mac OS还是iOS,程序都是从main.m 文件的main函数开始执行的。
1 #import <UIKit/UIKit.h> 2 #import "AppDelegate.h" 3 4 int main(int argc, char * argv[]) { 5 @autoreleasepool { 6 return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); 7 } 8 }
2> UIApplicationMain
UIApplicationMain在程序入口函数main函数中调用,主要实现了3个功能:
① 创建应用程序(UIApplication)实例
② 创建应用程序代理(AppDelegate)实例
③ 建立事件循环(runloop:死循环,不断检测程序运行状态,是否被触摸、晃动等)
3> UIApplicationMain参数
1 int UIApplicationMain ( 2 int argc, 3 char *argv[], 4 NSString *principalClassName, 5 NSString *delegateClassName 6 );
principalClassName:应用程序对象的类名(UIApplication或其子类)
delegateClassName:应用程序delegate的类名(任何接受了UIApplicationDelegate的类)
UIApplicationMain根据上述两个类名创建应用程序实例、应用程序代理实例。然后建立事件循环 (runloop),检测程序的各种事件 (程序开始启动,接收到触摸等等)
4> 应用程序代理
① 应用程序代理作用,根据应用程序传递过来的状态做出相应的处理。
② 应用程序的状态有很多,比如:程序启动、进入活跃状态、进到后台、内存警告、收到远程消息等等。
③ 任何接受了UIApplicationDelegate协议的对象都可以成为应用程序代理。
④ 一旦应用程序的某种状态触发,就会执行相应的代理方法。