- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// 一、 window
// window 就是用来展示控件的窗口。 在iOS中, 手机应用开发 只能有一个 主 window
// window 类似于我们作画的画板,我们通常不会在画板上作画,而是 在纸上作画。 window 一般不改变,改变的是内部内容。
// 创建window对象,并且初始化为等屏大小
self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
// Override point for customization after application launch.
// 设置 window 的背景颜色
self.window.backgroundColor = [UIColor whiteColor];
// 把 window 设置为主窗口,并且可见
[self.window makeKeyAndVisible];
/*
// 二、 UIView
// UIView 是所有可视化控件的基类,代表一个矩形空间,展示相应内容和用户进行交互。
// uiview 就相当于 画画的纸,需要添加到window上面。
// 1. 创建view 并且进行初始化
UIView *view = [[UIView alloc] initWithFrame:CGRectMake(100, 100, 200, 200)];
// 2. 设置背景颜色
view.backgroundColor = [UIColor yellowColor]; // 黄色
// 3. 添加到window 上
[self.window addSubview:view];
// 三、 frame
// frame 代表了一个view 在父坐标系中的 位置 和 大小
// frame 是一个结构体类型 CGRect 类型, 并且里面结构体成员也是结构体 origin, size
// origin 是 CGPoint x y
// size 是 CGSize width height
// 创建一个cgrect 结构体 使用 CGRectMake() 函数创建
CGRect rect1 = CGRectMake(200, 200, 50, 50);
rect1.origin.x = 0;
UIView *viewRect = [[UIView alloc] initWithFrame:rect1];
viewRect.backgroundColor = [UIColor purpleColor];
[self.window addSubview:viewRect];
// 注意: 如何 改 view 的frame
// 如果我们直接要该view 的frame 里面的x y 或者 width 或者 height 没有办法通过 view.frame.origin.x = xxx 或者 view.frame.size.width = xx 更改。
// 因为 . 语法出现了 二义性 ( 两种含义 )
// view.frame 此时点语法是 getter 操作
// origin.x 或者 size.width 为结构体访问成员变量
// 1. 我们可以先获取 view 的frame
// 2. 更改frame.origin.x
// 3. 把更改后的 frame 再赋值给 view.frame
// 1. 获取viewRect 的frame
CGRect rect2 = viewRect.frame;
// 2. 更改 rect2
rect2.origin.x = 300;
// 3. 赋值给 viewRect
viewRect.frame = rect2;
// center 属性
// center 中心点 也是view的一个重要属性,表示view的中心。通常用来 移动 或者 改变位置的时候使用
CGPoint center = viewRect.center; // 获取
center.x = viewRect.frame.size.width / 2; // 更改
center.y = viewRect.frame.size.height / 2;
viewRect.center = center; // 重新赋值
*/
/*
// bounds 边界
// bounds 也是view的一个属性,表示view 能够显示出的范围
// bounds 为 CGRect类型(x,y ,width, height)
// 与 frame 不同的是 bounds 参考点为自身坐标系,表示view的左上角距离自身坐标系的距离。
// bounds 默认值为 (0,0,width ,height)
// view 自身的坐标系,如果没有改变则都为左上角为原点,坐标值为(0,0)
// bounds 如果改变,意味着,view 视图自身的坐标系发生了变化,坐标向左移动,则 x值增大,反之减少。
UIView *boundsView = [[UIView alloc] initWithFrame:(CGRectMake(50, 50, 200, 200))];
boundsView.backgroundColor = [UIColor blueColor];
[self.window addSubview:boundsView];
NSLog(@"%@", NSStringFromCGRect(boundsView.bounds));
// 获取bounds
CGRect bounds = boundsView.bounds;
// 更改 坐标系原点
bounds = CGRectMake(50, 50, 200, 200);
// bounds 赋值
boundsView.bounds = bounds;
// 给boundsView 添加一个红色的子视图
UIView *redView = [[UIView alloc] initWithFrame:(CGRectMake(50, 50, 100, 100))];
redView.backgroundColor = [UIColor redColor];
// 添加,添加给 boundsView,作为boudsView 的子视图
// [boundsView addSubview:redView];
// bounds 和 frame 的 区别
// bounds 是 view 视图左上角,距离自身坐标系的距离。
// bounds 默认为(0,0),此时原点和视图左上角重合。
// bounds 如果发生变化,不会影响view 的位置,影响的是 view 中 子视图的 位置。
// frame 是 view 视图左上角, 距离 父视图坐标系的距离。
// frame 需要我们在给 父视图添加子视图的时候 指定。
// frame 为 子视图 在父坐标系中的位置
// frame 发生变化, 视图位置发生变化
// 注意: 如果bounds 的 宽高发生变化,是基于视图的中心点发生变化的,如果 宽度-100,结果是 左边-50,右边-50,中心位置没有发生变化。
*/
/*
// UIView 的相关方法
// (1) 添加视图方法
// addSubView: 方法
// addSubView 每次添加都是添加到了 subViews 数组的最后面
// 1. 创建view 对象
UIView *redView = [[UIView alloc] initWithFrame:(CGRectMake(100, 100, 100, 100))];
// 2. 设置属性
redView.backgroundColor = [UIColor redColor];
// 3. 添加到window 上面
[self.window addSubview:redView];
// 4. 释放
[redView release];
// self.window addSubview 是把view 添加到了 window.subViews 数组里面, 数组容器有一个特点,自动管理内部元素引用计数 add 增加引用计数 remove 减少引用计数
// 打印 window 的subViews 属性
// NSLog(@"%ld", self.window.subviews.count);
// insertSubView: atIndex: 在制定下标处添加子视图,原位置视图后移, 不会出现数组越界,如果超出下标则添加到最后。
UIView *orangeView = [[UIView alloc] initWithFrame:(CGRectMake(150, 150, 100, 100))];
orangeView.backgroundColor = [UIColor orangeColor];
[self.window insertSubview:orangeView atIndex:1];
// 释放
[orangeView release];
// insertSubView: aboveSubview:
// 把一视图添加到某视图之上
UIView *yellowView = [[UIView alloc] initWithFrame:(CGRectMake(200, 200, 100, 100))];
yellowView.backgroundColor = [UIColor yellowColor];
[self.window insertSubview:yellowView aboveSubview:orangeView];
// 释放
[yellowView release];
// insertSubview: belowSubView:
UIView *greenView = [[UIView alloc] initWithFrame:(CGRectMake(150, 250, 100, 100))];
greenView.backgroundColor = [UIColor greenColor];
[self.window insertSubview:greenView belowSubview:yellowView];
[greenView release];
// (2) UIView 管理视图层次方法
// removeFromSuperview 从父视图上面 移除子视图
// [greenView removeFromSuperview];
// [yellowView removeFromSuperview];
// [orangeView removeFromSuperview];
// [redView removeFromSuperview];
NSArray *viewArrays = self.window.subviews;
for (UIView *view in viewArrays) {
// 只移除黄色视图
if (view.backgroundColor == [UIColor yellowColor]) {
[view removeFromSuperview];
}
}
// UIView 的重要属性
// 常用的一些属性
// hidden 显隐性设置 alpha 透明度 superview 父视图
// subViews 子视图们 tag 标记值
// 1. 创建视图
UIView *view = [[UIView alloc] initWithFrame:(CGRectMake(0, 300, 200, 200))];
// 2. 设置属性
view.backgroundColor = [UIColor redColor];
view.hidden = NO; // no不隐藏,yes 隐藏视图,默认为 NO
view.alpha = 0.5; // 透明度, 0.0~1.0 数值,默认为1.0
view.tag = 100; // 设置标记值,方便 父视图 通过tag取该视图
// view 的tag 值不能为0, 因为 window 的tag 默认为0.
// 通过 0 tag 值,取出来的始终是 window
// 添加
[self.window addSubview:view];
UIWindow *window = (UIWindow *)view.superview; // 父视图
NSLog(@"%@", window);
NSArray *array = view.subviews; // 子视图数组
NSLog(@"%@", array);
// 通过tag值获取子视图
UIView *view2 = [self.window viewWithTag:100];
// 改变view2 的背景颜色
view2.backgroundColor = [UIColor yellowColor];
*/
// UILabel 标签视图
// 作用: 负责文字的展现 (小段文字展现)
// 使用步骤:
// 1. 创建
UILabel *label = [[UILabel alloc] initWithFrame:(CGRectMake(100, 100, 120, 100))];
// 2. 设置属性
label.text = @"long long ago , there was a monkey who called Monkey King"; // 文本内容
label.textColor = [UIColor blueColor]; // 文本颜色, 默认为黑色
label.font = [UIFont systemFontOfSize:16]; // 文本字体
label.lineBreakMode = NSLineBreakByCharWrapping; // 换行模式
label.numberOfLines = 2; // 行数,设置为0 默认换行,一行不足则默认换行显示
label.shadowColor = [UIColor redColor];
label.shadowOffset = CGSizeMake(4, 4);
// 3. 添加到父视图上
[self.window addSubview:label];
// 4. 释放
[label release];
// Xcode 7.0 之后要求 app必须有根视图控制器
self.window.rootViewController = [[UIViewController alloc] init];
// 一、
// iOS 事件分为三类
// 触摸事件
// 运动事件
// 远程控制事件
二、 触摸事件
凡是与用户触摸有关的操作 都是触摸事件
*/
// 创建对象
TouchView *touchView = [[TouchView alloc] initWithFrame:(CGRectMake(100, 100, 100, 100))];
touchView.backgroundColor = [UIColor redColor];
touchView.multipleTouchEnabled = YES; // 支持多点触摸, 默认为 no 不支持多点触摸
// 阻断响应者链
touchView.userInteractionEnabled = NO; // 关闭用户交互
// 阻断响应者链有三种方式:
// 1. 关闭用户交互 userInteractionEnabled 设置为 no
// 2. 隐藏控件 hidden 设置为 yes,隐藏控件
// 3. 透明图 alpha 值 小于 0.01 时候,
// UIImageView 图像视图 默认用户交互是关闭的
[self.view addSubview:touchView];
/******************** 练习3 *************************/
// 阻断响应者链
// 3. 实现 UITextFieldDelegate 协议里 回收键盘的方法 - (BOOL)textFieldShouldReturn:(UITextField *)textField;
- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
// 让键盘回收,只要让 当前输入框取消第一响应者 即可
// 当前输入框: 就是该方法textFieldShouldReturn:参数传递过来的 输入框
// 让 输入框 取消第一响应者
// [textField resignFirstResponder];
// return 按钮实现 改变第一响应者
// 1. 通过 tag 值 判断是否是最后一个输入框
if (textField.tag != 3) {
// 如果不是最后一个输入框,则取消当前第一响应者,让下一个输入框成为第一响应者
[textField resignFirstResponder];
// 取到下一个输入框 通过tag 值取
UITextField *nextTF = (UITextField *)[self.window viewWithTag:textField.tag + 1]; // 当前输入框的tag + 1 就是下一个输入框的tag值
// 下一个输入框成为第一相应者
[nextTF becomeFirstResponder];
} else{ // tag == 3 ,说明是最后一个输入框,取消第一相应者
[textField resignFirstResponder];
}
return NO;
}
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
// Override point for customization after application launch.
self.window.backgroundColor = [UIColor whiteColor];
[self.window makeKeyAndVisible];
// 7.0 设置根视图控制器
self.window.rootViewController = [[[UIViewController alloc] init] autorelease];
// // 一、 UITextField
//
// // 1. 创建并且初始化
// UITextField *textField1 = [[UITextField alloc] initWithFrame:CGRectMake(50, 50, 200, 40)];
//
// // 2. 设置属性
// textField1.placeholder = @"请输入密码"; // 占位符
//
// textField1.borderStyle = UITextBorderStyleRoundedRect; // 圆角边框
//
//
// // 3. 添加
// [self.window addSubview:textField1];
//
//
// // 4. 释放
// [textField1 release];
//
//
//
//
// // 二、 textField 常用属性
//
// // 1. 创建对象并且初始化
// UITextField *textField2 = [[UITextField alloc] initWithFrame:(CGRectMake(50, 100, 200, 40))];
//
// // 2. 设置属性
//
// // (1) 文本属性 text, textColor、 placeHolder, textAlign
//
// // 要求掌握的 placeHolder
// textField2.placeholder = @"请输入密码"; // 占位符
//
// // 了解
// textField2.text = @"123456"; // 文本内容
//
// textField2.textColor = [UIColor redColor]; // 文本颜色
//
// textField2.textAlignment = NSTextAlignmentLeft; // 对齐方式
//
//
//
// // (2) 输入控制
// // 输入开始:enabled 清除
// textField2.enabled = YES; // no为不允许输入,默认为yes 允许输入
//
textField2.clearsOnBeginEditing = YES; // 开始输入时清除原有内容
//
// // 输入时:
// textField2.secureTextEntry = YES; // 安全输入方式
//
textField2.keyboardType = UIKeyboardTypeNumberPad; // 数字键盘, 默认为全字母键盘
//
//
// // 输入后
// textField2.returnKeyType = UIReturnKeyNext; // return 类型
UIView *inputView = [[UIView alloc] initWithFrame:(CGRectMake(0, 0, 375, 100))];
inputView.backgroundColor = [UIColor redColor];
textField2.inputView = inputView;
[inputView release];
//
//
// // (3) 外观属性 边框样式、清除按钮、 左视图、右视图
//
// textField2.borderStyle = UITextBorderStyleRoundedRect; // 圆角样式
//
// textField2.clearButtonMode = UITextFieldViewModeAlways;
// // 始终显示
// // 始终不显示
// // 当编辑的时候才显示
// // 不编辑的时候显示
//
UIView *leftView = [[UIView alloc] initWithFrame:(CGRectMake(0, 0, 40, 40))];
leftView.backgroundColor = [UIColor yellowColor];
textField2.leftView = leftView;
textField2.leftViewMode = UITextFieldViewModeAlways;
[leftView release];
//
//
//
//
//
//
// // 3. 添加
// [self.window addSubview:textField2];
//
//
// // 4. 释放
// [textField2 release];
// 二、 UIButton 按钮控件
// 创建 button 的步骤
// 1. 开辟空间并且初始化,或者 使用类方法创建
// 类方法
UIButton *loginButton = [UIButton buttonWithType:(UIButtonTypeSystem)];
// buttonType 有多重,通常我们使用 系统样式或者 自定义样式,系统样式 提供了标题的默认字体 和颜色 (蓝色), 自定义样式什么都没有,需要我们自己指定
// 2. 设置属性
// frame
loginButton.frame = CGRectMake(50, 300, 145, 46);
// title
// [loginButton setTitle:@"登录" forState:(UIControlStateNormal)]; // 没有点击的状态下 标题为 登录
// 设置背景图片
[loginButton setBackgroundImage:[UIImage imageNamed:@"login_button@2x.png"] forState:(UIControlStateNormal)];
// 3. 添加点击事件
// 给button 添加一个点击事件,当我们点击 button 的时候,让 目标 target 执行相应的事件 action
//target 执行action操作的目标对象 这里是 self
// self 此时是 AppDelegate ,
// self 写在哪个类内部, 哪个类的对象就是self
// 羊毛出现