UI 即 UserInterface(用户界面
1.iOS系统版本,每年都有更新.对我们开发者而言,主要的是观察API的变化.
2.iPhone新手机发布,会产生不同尺寸的屏幕,现在市面上有4种尺寸,我们需要考虑屏幕适配问题.
3.iOS系统层级,分为4层.目前我们学习的就是最顶层Cocoa touch层(layer),我们使用的是UIKit框架
4.iOS SDK(软件开发工具包).iOS开发语言OC,Swift——都是面向对象.
5.我们最简单的创建UI项目的方法就是通过storyboard(故事版)来完成.
6.我们可以通过设置故事板上面的控件属性(右边栏,第四个按钮——属性设置)
7.
—模拟器的输入模式切换:command+shift+K
—模拟器大小的切换:command+1,2,3
—模拟器锁屏:command+L
—模拟器Home键:command+shift+H
www.stackOverFlow.com
github.com
cocoaChina.com
code4app.com
编程查资料最好用Google
3.iOS系统层级,分为4层.目前我们学习的就是最顶层Cocoa touch层(layer),我们使用的是UIKit框架
4.iOS SDK(软件开发工具包).iOS开发语言OC,Swift——都是面向对象.
5.我们最简单的创建UI项目的方法就是通过storyboard(故事版)来完成.
6.我们可以通过设置故事板上面的控件属性(右边栏,第四个按钮——属性设置)
7.
—模拟器的输入模式切换:command+shift+K
—模拟器大小的切换:command+1,2,3
—模拟器锁屏:command+L
—模拟器Home键:command+shift+H
www.stackOverFlow.com
github.com
cocoaChina.com
code4app.com
编程查资料最好用Google
一.程序的生命周期
1.程序已经完成启动。在这个方法里完成项目必要的界面加载
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
创建Xcode工程选中singleView模板,并且做好相应设置,设置好主窗口,和主窗口的根控制器。相当于该方法隐藏的设置好了上述。
2.程序将要辞去活跃状态(进入非活跃状态)
- (void)applicationWillResignActive:(UIApplication *)application
程序不再是用户可以操作的时候,进入非活跃(双击Home键)
暂停游戏(在这里暂停一些任务)
3.程序已经进入后台
- (void)applicationDidEnterBackground:(UIApplication *)application
程序完全看不见了,进入后台。程序挂起
程序由用户自己结束的时候,先进入后台
4.程序将要进入前台
- (void)applicationWillEnterForeground:(UIApplication *)application
从后台进入前台就会调用这个方法
重新开始被暂停的游戏(游戏继续)
5.程序已经变为活跃
- (void)applicationDidBecomeActive:(UIApplication *)application
1.在程序启动的时候会调用一次。
2.从后台回到前台
3.从任务管理界面回到前台
6.程序将要结束
- (void)applicationWillTerminate:(UIApplication *)application
·1. 程序结束的时候
2. 程序自己崩溃的时候
3.如果时机合适,你可以做一些数据储存类的工作
- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application
程序接受到内存警告(系统发送,如果一直占用过高,系统会直接杀掉进程)
二.登录界面
1.视图已经加载(视图控制器完成它所拥有的视图加载)
- (void)viewDidLoad { [super viewDidLoad];.......在这行代码之后,添加额外的控件}
2.改变视图的背景颜色(UIColor 颜色对象)
self.view.backgroundColor = [UIColor greenColor];
3.设置标签的文本内容 logInLabel.text = @"登录界面";
4.设置文本内容对齐方式,碰到不认识的属性(类)按住Command点进去看
logInLabel.textAlignment = NSTextAlignmentCenter;
5.将label放到屏幕上,给视图添加一个子视图(参数是要添加的视图对象)
[self.view addSubview:logInLabel];
6.计算、更新密码输入框所需要的结构体
// 不能直接更改结构体内部的值,所以我们用一个新的变量取出这个结构体
CGRect rect = passwordLabel.frame;
// 改变CGRect类型结构体的原点x值
rect.origin.x += 65.0;
// 改变CGRect类型结构体的宽度值
三.启动界面与启动图
1.启动界面:App lcons Source —>用App prepo将图片处理成2x,3x的格式,然后将图片拖入到Apploce当中,最后在运行。
2.启动图:
方法一:首先将图片直接拖入到Xcode当中,然后在LaunchScreen.storyboard当中,点击界面,然后选择size,确定屏幕的大小,在viewController中将Image
View拖入到界面当中,将图片放大到与屏幕同大小,最后在Image当中导入图片。
方法二:在Xcode中进入项目Launch Image Source —>Use Asset Catalog —>migrate,点击箭头,最后将图片导入。
四.iOS坐标系
1. 创建一个Label,放在屏幕上
UILabel * label = [[UILabel alloc] init];
2.设置label的位置信息
CGRectMake()
@param X 横轴坐标
@param Y 纵轴坐标
@param width 视图的宽度
@param height 视图的高度
3. 创建window ,设置window的大小为屏幕大小
self.myWindow1 = [[UIWindow alloc] initWithFrame:CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, 20)];
4.设置window的背景颜色
self.myWindow1.backgroundColor = [UIColor blackColor];
5.设置成app的主窗口并且可见
[self.myWindow1 makeKeyAndVisible];
6. 设置window的根控制器
self.window.rootViewController = [[UIViewController alloc] init];
self.myWindow1.rootViewController = [[ViewController alloc] init];
self.myWindow1.windowLevel = UIWindowLevelStatusBar;
7. 一个窗口创建之后,默认是normal级别
如果调整窗口的级别,会改变显示顺序
self.myWindow1.windowLevel = UIWindowLevelStatusBar;
状态栏其实是一个很小的窗口,他的级别是 UIWindowLevelStatusBar
8..视图:将子视图放到父视图上的时候,坐标系以父视图左上角为原点
.默认!子视图是可以超出父视图的范围的
9.frame, bounds和Center
frame得到的范围,是以父视图为参照(决定位置和尺寸)
bounds以自身为参照(决定视图的尺寸)
Center 以父视图为参照(决定视图的位置)
10.bounds就是frame的原点为0的值是错的,比如在旋转当中。
11.回收键盘
[self.numberTextField1 resignFirstResponder]; 单个文件输入结束之后回收键盘
[self.view endEditing:YES]; 全部输入结束之后回收键盘
12.如果需要应用到数字的时候,首先将text文本转化为整型数据,然后再计算等,最后再将结果转化为字符串的形式,并且赋值给所要结果的地方
13.Ctrl +windows+方向键 实现类的切换
14. 将视图添加到窗口上, 获取程序的包(和项目源代码文件夹不同)
NSBundle * bundle = [NSBundle mainBundle];
15. 获取包目录 bundle.bundlePath;
加载包里面的Nib文件,返回值是数组,里面存了很多个view
/*
* 加载包中的Nib文件
*
* @param NSString Nib文件的名称
* @param id 加载出来的文件所有者
* @param NSDictionary 加载的时候所需要的附加信息
*/
NSArray * viewArray = [bundle loadNibNamed:@"View" owner:self options:nil];
16. 获取数组中的视图
[viewArray firstObject]; UIView * view = viewArray[0];
17.添加上去作为子视图
[self.window addSubview:view];
五.xib加载视图
1.首先创建一个xib,iOS—>User Interface—View,
2. 将视图添加到窗口上, 获取程序的包(和项目源代码文件夹不同)
NSBundle * bundle = [NSBundle mainBundle];
3. 获取包目录 bundle.bundlePath;
4.加载包里面的Nib文件,返回值是数组,里面存了很多个view,加载包中的Nib文件
@param NSString Nib文件的名称
@param id 加载出来的文件所有者
@param NSDictionary 加载的时候所需要的附加信息
NSArray * viewArray = [bundle loadNibNamed:@"View" owner:self options:nil];
5. 获取数组中的视图
[viewArray firstObject]; UIView * view = viewArray[0];
6. 添加上去作为子视图 [self.window addSubview:view];
六 .视图树
1.视图的层次结构:一个视图可以拥有几个子视图,但一个视图只能拥有一个父视图。
2.建立层级关系:父子关系,子视图会覆盖父视图,同层级的子视图,如果发生堆叠,那么根据先后顺序来摆放(先添加的在下面,后添加的在上面)。
3. 添加一个子视图,放入指定的索引位置
[baseView insertSubview:insertSubview1 atIndex:2];
4.指定在XX视图之上
[baseView insertSubview:insertSubview1 aboveSubview:subView1];
5.如果使用insertSubview:aboveSubview: 父视图和基于的子视图为相同,那么相当于直接添加
[baseView addSubview:insertSubview1];
6.指定在XX视图之下
[baseView insertSubview:insertSubview1 belowSubview:subView2];
7.延迟调用方法
[self performSelector:@selector(test:) withObject:subView2 afterDelay:5];
@param SEL 方法签名
* @param id 附带的参数
* @param delay 延迟的时间间隔
8. 调整已有视图层次结构 Exchang : 交换
[baseView exchangeSubviewAtIndex:<#(NSInteger)#> withSubviewAtIndex:<#(NSInteger)#>]
9.拿到最前面
[baseView bringSubviewToFront:<#(nonnull UIView *)#>]
10. 送到最后面
[baseView sendSubviewToBack:<#(nonnull UIView *)#>]
11.获取一个视图的子视图数组和父视图
父视图.subviews 子视图.superview
七。UIView的常用属性
1.通过tag值在视图树中找到相应的视图
UIView * view = [self.view viewWithTag:1001];
2. red green blue alpha(透明度)
RGB 值范围0~255 但在这里范围是0~1
alpha 透明度 范围0~1
0 - 1,默认是1 表示不透明,0全透明,透明度会影响子视图
baseView.alpha = 0.5;
[UIColor colorWithRed:255/255.0 green:0/255.0 blue:0/255.0 alpha:100];
3. 透明色 [UIColor clearColor];
4.设置背景颜色
baseView.backgroundColor = [UIColor redColor];
5.视图是否隐藏(YES表示隐藏:默认为NO) default: 默认
baseView.hidden = YES;
6.给视图对象添加标记
baseView.tag = 1002;
八.坐标系统的转换
1.拿到视图的transform
CGAffineTransform transform =self.变化的属性名.transform;
定义CGAffineTransform 变量,CGAffineTransform t
2.构造一个在原有基础上平移的transform
* 具有返回值,CGAffineTransform类型
* @param transform 基于的transform
* @param tx x轴变换
* @param ty y轴变换
t = CGAffineTransformTranslate(transform, 0, 50);
3.在原有基础上旋转的transform
t=CGAffineTransformRotate(transform, 角度M_PI)
4.缩放
self.属性名.transform=CGAffineTrandformScale(self.属性名.transform,x轴缩放距离,y轴缩放距离)
5.产生效果 赋给要移动的对象transform sel.属性名.transform =t
九.属性动画
1.设置图片,附带图片名称,默认只支持.png格式,其他格式需要加上后缀,最后在添加到视图上。
self.imageView.image=[UIVmage imageNamed:@“图片名称”];
一.首尾式动画
1.标记动画的开始
[UIView beginAnimations:nil context:nil];
2.设置动画的属性
[UIView setAnimationDuration:0.8]; 时间
[UIView setAnimationRepeatCount:100]; 重复次数
[UIView setAnimationRepeatAutoreverses:YES]; 是否返回
3.动画的结束 [UIView commitAnimations];
二.block动画
1.[UIView animateWithDuration:0.8 animations:^{
block中也可以添加动画属性
[UIView setAnimationRepeatCount:100];
这里写动画的内容
self.imageView.transform = CGAffineTransformRotate(self.imageView.transform, M_PI_4);
}];
self.imageView.transform = CGAffineTransformTranslate(self.imageView.transform, 0, 50);
设置一段完成之后的回调
[UIView animateWithDuration:0.8 animations:^{
这里写动画的内容
self.imageView.transform = CGAffineTransformRotate(self.imageView.transform, M_PI_4);
} completion:^(BOOL finished) {
self.imageView.transform = CGAffineTransformTranslate(self.imageView.transform, 0, 50);
}];
UILabel
1.创建及其确定位置大小
UILabel *label=[UILabel alloc]initWithFram.CGRectMake:( 10,20, 30, 40);
2.设置标签
label.test=@“ 内容 ”;
3.行数设置,如果设置为大于0的值,那么代表最多可显示行。 0 表示没有行数限制,只要范围足够,自动换行
label.numberOfLines = 0;
4. 设置文本的字体,美工给的字号如果你觉得太大了,可以认为他给的是px单位,我们直接把字号除以2。
a. 常规
label.font = [UIFont systemFontOfSize:字体大小];
b.加粗
label.font = [UIFont boldSystemFontOfSize:字体大小];
5.根据label宽度调整字体
label.adjustsFontSizeToFitWidth = YES;
6.根据字体去适配合适的label尺寸(要先设置内容,其次设置行数没有限制。字体也要先设置好)
【label sizeToFit】;
7.对齐方式
NSTextAlignmentLeft 左对齐
NSTextAlignmentCenter 居中
NSTextAlignmentRight 右对齐
textLabel.textAlignment = NSTextAlignmentCenter;
8.label宽度不够时,对文本进行打断的方式
label.lineBreakMode = NSLineBreakByTruncatingHead;
9.设置文本的阴影
label.shadowColor = 【UIColor grayColor】; 阴影部分的颜色
label.shadowOffset = CGSizeMake(5,5); 阴影部分的大小
10.当文本变为高亮状态以后,显示的颜色-------高亮状态(设置了并没有立即变换状态)
label.highlightedTextColor = 【UIColor greenColor】;
[self performSelector:@selector(changeLabelColor:) withObject:textLabel afterDelay:5]; 延迟方法的调用
【self.view addSubview:label】; 将label添加到视图中
- (void)changeLabelColor:(UILabel *)label {
label.highlighted = !label.highlighted;
}
UIImageView
1.添加显示图片,如果是png格式 ,则不需要添加后缀。
UIImage * image = [UIImage imageNamed:@"图片名称"];
2.设置图片视图的内容模式
UIViewContentModeScaleToFill 拉伸铺满视图,不在乎图像比例
UIViewContentModeScaleAspectFit 自适应拉伸,不破坏宽高比,如果宽/高沾满视图,另外一边不再进行缩放
UIViewContentModeScaleAspectFill 不破坏宽高比,可以超出视图范围
3.裁剪圆,设置半径
//imageView.contentMode = UIViewContentModeCenter;
imageView.layer.cornerRadius = 半径;
4.与内容裁剪配置
imageView.clipsToBounds = YES;
5.设置tag值 imageView.tag = 1001;
UIButton
1.UIButton * btn = [UIButton buttonWithType:UIButtonTypeSystem];
btn.frame = CGRectMake(10, 10, 44, 44);
btn.backgroundColor = [UIColor redColor];
2.相当于IB上的方法连线
/* 给按钮添加方法
*
* id ---- 谁调用方法
* SEL ---- 调用的方法
* UIControlEvent ----- 触发时机
[btn addTarget:self action:@selector(btnAction:) forControlEvents:UIControlEventTouchUpInside];
3.按钮添加文字
[btn setTitle:@"切换" forState:UIControlStateNormal];
4. 作为子视图添加-----按钮是默认不能使用
// [self.view addSubview:btn];
[imageView addSubview:btn];
5.如果一个按钮作为一个ImageView的子视图,默认是无法点击的
UIImageView默认是不相应用户交互
设置交互后,会影响子视图(如果imageView可以交互,他所有的子视图,也可以相应交互) imageView.userInteractionEnabled = YES;
6.手动创建按钮
// UIButton * btn = [UIButton buttonWithType:UIButtonTypeSystem];
// 使用alloc方法创建的按钮默认状态为custom
UIButton * btn = [[UIButton alloc] init];
btn.frame = CGRectMake(200, 200, 200, 200);
btn.backgroundColor = [UIColor darkGrayColor];
7.绑定目标动作
[btn addTarget:self action:@selector(test:) forControlEvents:UIControlEventTouchUpInside];
8.设置按钮的标题
[btn setTitle:@"普通状态" forState:UIControlStateNormal];
UIControlStateHighlighted 高亮状态
UIControlStateSelected 选中状态
UIControlStateDisabled 禁用状态,当enable == NO的时候,按钮成为disabled状态
9.设置按钮的图片
* setImage:forState:使用的是图片的原始大小。让按钮显示的更加精致,如果frame够大,点击也方便
*setBackgroundImage:forState:把图片设置为按钮幕后的背景,会拉伸图片
UIImage * image = [UIImage imageNamed:@"playing_btn_love@2x"];
[btn setImage:image forState:UIControlStateNormal];
[btn setImage:image forState:UIControlStateNormal];
10.设置标题的颜色,自定义设置下,默认颜色为白色,系统状态下,默认颜色为蓝色
// [btn setTitleColor:[UIColor redColor] forState:UIControlStateNormal];
11.选中状态改变
sender.selected = !sender.selected;
12. 按钮是否可以使用 继承与UIControl的属性,可以改变界面效果
// sender.enabled = !sender.enabled/NO;
13.是否可以与用户交互,来自于UIView。 不影响外观
// sender.userInteractionEnabled = NO;
UIControl
1.UIControl 他是UIView的子类, 可以会用他的子类来做具体的控制, 子类可以使UIkit框架类的,我们也可以自定义控件对象
2.为控件绑定一个目标,动作,触发时机
* 可以是一个控件 绑定多个目标动作
* 可以有多个控件 绑定一个目标动作
*
* @param id 可以是任意目标相应
* @param action 一个消息
* @parm Event 事件
[control addTarget:self action:@selector(controlAction:) forControlEvents:UIControlEventTouchUpInside];
3. 触摸取消(触摸还在发生,屏幕失去焦点:锁屏,电话呼入)
UIControlEventTouchCancel
4.开始追踪
- (BOOL)beginTrackingWithTouch:(UITouch *)touch withEvent:(nullable UIEvent *)event {
UITouch 触摸对象。指代触摸。(简单的理解为触摸在屏幕上的手指)
获取触摸所在视图上的点
CGPoint touchPoint = [touch locationInView:self.superview];
NSLog(@"%@", NSStringFromCGPoint(touchPoint));
TouchEvent-----UIControlTouchUpDown
TouchDown
NSLog(@"开始追踪触摸");
return YES;
}
5.继续追踪
- (BOOL)continueTrackingWithTouch:(UITouch *)touch withEvent:(nullable UIEvent *)event {
获取触摸所在视图上的点
CGPoint touchPoint = [touch locationInView:self];
NSLog(@"%@", NSStringFromCGPoint(touchPoint));
if (touchPoint.x > self.bounds.size.width || touchPoint.y > self.bounds.size.height) {
NSLog(@"触摸点在外部");
}
//TouchDrag
// NSLog(@"继续追踪触摸");
return YES;
}
6.结束追踪
- (void)endTrackingWithTouch:(nullable UITouch *)touch withEvent:(nullable UIEvent *)event {
// 获取触摸所在视图上的点
CGPoint touchPoint = [touch locationInView:self];
NSLog(@"%@", NSStringFromCGPoint(touchPoint));
// 判断一个触摸点是否在矩形区域内
if (touchPoint.x > self.bounds.size.width || touchPoint.y > self.bounds.size.height) {
NSLog(@"UIControlEventTouchUpOutside");
// 可以在恰当的时机发送valueChange
[self sendActionsForControlEvents:UIControlEventTouchUpOutside];
}
// TouchUp
NSLog(@"结束追踪触摸");
}
7.取消追踪
- (void)cancelTrackingWithEvent:(nullable UIEvent *)event {
// TouchCancel
NSLog(@"失去焦点");
}
UITextField
1.外框风格
textField.borderStyle = UITextBorderStyleRoundedRect;
2.设置或者获取输入框内容
// textField.text = @"hello";
3.设置字体大小及其居中
textField.font = [UIFont systemFontOfSize:28];
textField.textAlignment = NSTextAlignmentCenter;
4.输入提示
textField.placeholder = @"请输入手机号";
5.是否支持清除按钮
/*
* UITextFieldViewModeNever, ------ 永远不出现
* UITextFieldViewModeWhileEditing, ------当编辑的时候出现
* UITextFieldViewModeUnlessEditing -----当结束编辑时出现
* UITextFieldViewModeAlways ----- 一直出现
*/
textField.clearButtonMode = UITextFieldViewModeUnlessEditing;
6.编辑之前清除
textField.clearsOnBeginEditing = YES;
7.安全输入
// textField.secureTextEntry = YES;
8.设置右下角return 类型
textField.returnKeyType = UIReturnKeyDone;
9.是否可用
// textField.enabled = NO;
10.给输入框添加动作
[textField addTarget:self action:@selector(textEditing:) forControlEvents:UIControlEventEditingDidBegin];
11.设置输入框的代理
textField.delegate = self;
12.代理方法
- (void)textEditing:(UITextField *)tf {
NSLog(@"开始编辑");
}
- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField {
NSLog(@"将要开始编辑");
return YES;
}
- (void)textFieldDidBeginEditing:(UITextField *)textField {
NSLog(@"已经开始编辑");
}
- (BOOL)textFieldShouldEndEditing:(UITextField *)textField {
NSLog(@"将要结束编辑");
return YES;
}
- (void)textFieldDidEndEditing:(UITextField *)textField {
NSLog(@"已经结束编辑");
}
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
// 新内容所在的位置---长度为0
NSLog(@"range :%@", NSStringFromRange(range));
// 新输入的内容
NSLog(@"string :%@", string);
if (range.location <= 10) {
return YES;
}
// 如果返回NO的话,字符内容不发生变化。依然会接受
return NO;
}
- (BOOL)textFieldShouldClear:(UITextField *)textField {
return YES;
}
- (BOOL)textFieldShouldReturn:(UITextField *)textField {
// 模拟应用效果
// 用户点击返回按钮,收起键盘/发送消息
[textField resignFirstResponder];
NSLog(@"%@", textField.text);
return YES;
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
}
UIAlertView
1.UIAlertView的创建
*
* @param Title 标题
* @param Message 文本提示信息
* @param delegate 代理----
* @param cancelTitle 取消按钮标题
* @param otherTitle 其他按钮标题
UIAlertView
* alertView = [[UIAlertView alloc] initWithTitle:@"小明要上课"
message:@"小明上课迟到了" delegate:self cancelButtonTitle:@"什么事都没有"
otherButtonTitles:@"罚站", nil];
2. UIAlertViewStyleDefault
// UIAlertViewStyleSecureTextInput,
// UIAlertViewStylePlainTextInput,
// UIAlertViewStyleLoginAndPasswordInput
alertView.alertViewStyle = UIAlertViewStylePlainTextInput;
[alertView show];
3.* UIAlertController的初始化
*
* @param Title 标题内容
* @param Message 提示文本信息
* @param UIAlertControllerStyle 弹窗显示样式
*/
UIAlertController
* alertView = [UIAlertController alertControllerWithTitle:@"定位信息"
message:@"您没有开启GPS定位,请前往设置开启"
preferredStyle:UIAlertControllerStyleAlert];
// handle --- 处理
// 弹窗按钮
UIAlertAction
* alertAction1 = [UIAlertAction actionWithTitle:@"确定"
style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull
action) {
NSLog(@"确定按钮点击");
}];
UIAlertAction
* alertAction2 = [UIAlertAction actionWithTitle:@"取消"
style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull
action) {
NSLog(@"取消按钮点击");
}];
UIAlertAction
* alertAction3 = [UIAlertAction actionWithTitle:@"用户不知道点什么"
style:UIAlertActionStyleDestructive handler:^(UIAlertAction * _Nonnull
action) {
NSLog(@"瞎点了一个按钮");
}];
// 弹窗按钮要起作用一定要添加到alertController
[alertView addAction:alertAction1];
[alertView addAction:alertAction2];
// [alertView addAction:alertAction3];
[self presentViewController:alertView animated:YES completion:nil];
UISlider
1. 添加事件----一定要手动滑动滑块
[slider addTarget:self action:@selector(sliderAction:) forControlEvents:UIControlEventValueChanged];
2. 设置最小值和最大值(歌曲 总时长:3:20 = 3 * 60 + 20)
slider.minimumValue = 0;
slider.maximumValue = 200; // 假设总时长是200
[NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(playAction:) userInfo:slider repeats:YES];
3.自定义滑块
// 左右轨迹,大头针
slider.minimumTrackTintColor = [UIColor cyanColor];
slider.maximumTrackTintColor = [UIColor blackColor];
// 设置轨迹图片
// [slider setMinimumTrackImage:<#(nullable UIImage *)#> forState:UIControlStateNormal];
// [slider setMaximumTrackImage:<#(nullable UIImage *)#> forState:<#(UIControlState)#>]
slider.thumbTintColor = [UIColor redColor];
// 设置大头针图片
[slider setThumbImage:[UIImage imageNamed:@"Star-Gold"] forState:UIControlStateNormal];
模态页面
1.调用方法模态呈现界面
* @param UIViewControll 将要呈现的视图控制器页面* @param animated 弹出效果是否有动画* @param completion 完成之后的回调*/// presentViewController:<#(nonnull UIViewController *)#> animated:<#(BOOL)#> completion:<#^(void)completion#>
2.弹出方式
UIModalTransitionStyleCoverVertical 垂直弹出UIModalTransitionStyleFlipHorizontal 水平翻转UIModalTransitionStyleCrossDissolve 渐入渐出UIModalTransitionStylePartialCurl 竖直翻页
3.模态页面的消失
[self dismissViewControllerAnimated:YES completion:nil];
导航控制器的创建
1.设置不同视图控制器页面的导航栏标题,一定要有导航控制器来管理
self.title = @"设置";
2.push使用导航控制器 弹出下一级页面
[self.navigationController pushViewController:vc animated:YES];
3.返回导航控制器上一级页面
[self.navigationController popViewControllerAnimated:YES];
UINavigationBar
1. 每一个导航控制器有一个导航栏
导航控制器可以管理N个子控制器
每一个自控制器都有一个相对于的导航项(UINavigationItem)
每一页面导航栏的内容, 由导航项决定
自定义导航栏----iOS6.0,iOS7.0高度不同
7.0之后高度是64. 20 + 44
7.0之前导航栏是不透明的,iOS7.0之后导航栏是半透明
2. 自定义视图
UIButton * leftButton = [UIButton buttonWithType:UIButtonTypeCustom];leftButton.frame = CGRectMake(0, 0, 44, 44);[leftButton setBackgroundImage:[UIImage imageNamed:@"134859qtpkqk5tgcwnzpzt.jpg"] forState:UIControlStateNormal];创建出来的button需要转化成导航栏适用UIBarButtonItemUIBarButtonItem * leftItem1 = [[UIBarButtonItem alloc] initWithCustomView:leftButton];设置导航栏左侧按钮self.navigationItem.leftBarButtonItem = leftItem;self.navigationItem.leftBarButtonItem = leftItem1;self.navigationItem.leftBarButtonItems = @[leftItem, leftItem1];
3.设置导航栏右侧按钮
实际上不是视图,是导航栏上的一块内容,可以绑定不同的视图和动作self.navigationItem.rightBarButtonItem
4.获取导航栏
UINavigationBar * bar = self.navigationController.navigationBar;使用backgroundColor设置没有效果
5.设置导航栏的背景颜色
bar.barTintColor = [UIColor magentaColor];
6. tintColor设置导航栏上子控件的默认内容颜色
bar.tintColor = [UIColor whiteColor];
7. // 设置导航栏样式,默认时:状态栏会是黑色
// black时:状态栏是白色
bar.barStyle = UIBarStyleBlack;
8. 导航栏7.0之后默认是半透明,我们可以通过设置导航栏是否透明,改变controller.view的起点
bar.translucent = NO;
标签栏
1.自定义标签栏之前,首先要将系统自带的按钮删除,然后在自己创建
for (UIView * subView in self.tabBar.subviews) {
[subView removeFromSuperview];
}
2.设置背景图片,tabBar自带的 属性,可以帮我们设置大小和和位置还有父视图
self.tabBar.backgroundImage = [UIImage imageNamed:@"navbg"];
3.自定义多个按钮需要利用for循环来循环创建
滑动视图
1.创建滑动视图
UIScrollView * scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, 414, 300)];
2.设置内容尺寸,只设置滑动方向
scrollView.contentSize = CGSizeMake(3 * 414, 0);
3.利用for循环来创建,如果视图的位置超出了scrollView.contentSize范围,视图依旧加载,但是用户不能滑到相应位置,上面需要添加显示的内容
4.设置分页效果 scrollView.pagingEnabled = YES;
5.设置水平和垂直滚动条
scrollView.showsHorizontalScrollIndicator = NO;
scrollView.showsVerticalScrollIndicator = NO;
6.获取滑动视图内容的偏移量,用 Point 表示位置,实际是内容偏移的X Y轴
scrollView.contentOffset
7.签订代理 scrollView.delegate = self;
8.已经滑动方法
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
CGPoint point = scrollView.contentOffset;
获取偏移量
NSLog(@"当前偏移量 :%@", NSStringFromCGPoint(point));
}
页码控件
1.页码控件的创建
self.pageCtrl = [[UIPageControl alloc] initWithFrame:CGRectMake(0, kScreenHeight - 20.0, kScreenWidth, 20.0)];
2.页码数
self.pageCtrl.numberOfPages = 5;
3.当前选中页面
self.pageCtrl.currentPage = 0;
4.未选中点颜色
· self.pageCtrl.pageIndicatorTintColor = [UIColor blueColor];
5.当前点的颜色
self.pageCtrl.currentPageIndicatorTintColor = [UIColor redColor];
6.将要结束滑动
-
(void)scrollViewWillEndDragging:(UIScrollView *)scrollView
withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint
*)targetContentOffset NS_AVAILABLE_IOS(5_0) {
// 目标偏移量
CGPoint point = *targetContentOffset;
// 当前页面数 = 当前偏移量 / 屏幕宽度
NSInteger pageNum = point.x / kScreenWidth;
// 将页码控件的当前页面值设为计算后的值
self.pageCtrl.currentPage = pageNum;
}
7.滑动视图已经停止减速
//- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
// NSLog(@"滑动停止,处于静止状态");
//
// // 当前偏移量
// CGPoint point = scrollView.contentOffset;
//
// // 当前页面数 = 当前偏移量 / 屏幕宽度
// NSInteger pageNum = point.x / kScreenWidth;
//
// // 将页码控件的当前页面值设为计算后的值
// self.pageCtrl.currentPage = pageNum;
}
8.如果需要无线滑动,需要在左右两边各多方一张图片,然后通过改变偏移量来改变滑动位置,内容一般写在已经滑动或者减速结束之后里面
内边距问题
1.系统自动帮我调整了scrollView中视图内容的位置,不设置的话,视图会乡下移动64个像素。将导航栏设置为不透明效果,可以解决自动向下偏移内边距的问题
self.automaticallyAdjustsScrollViewInsets = NO;
2.控制器四周延伸布局
self.edgesForExtendedLayout = UIRectEdgeNone;
3.内边距偏移量不对的问题,只会出现在UIScrollView及其子类上
问题原因:导航栏占据了64个像素,导航栏是半透明效果,并且融入了状态栏
图片的缩放
1.首先签订协议,然后创建手势
UITapGestureRecognizer * tapGes = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapGestureAction:)];
2.设置点击次数
tapGes.numberOfTapsRequired = 2;
3. 添加相对应的手势操作,设置手势的依赖视图
[self.scrollView addGestureRecognizer:tapGes];
4.手势的方法
- (void)tapGestureAction:(UITapGestureRecognizer *)tap {
// 设置缩放倍数
// self.scrollView.zoomScale = 2.0;
if (self.scrollView.zoomScale > 1.0) {
// self.scrollView.zoomScale = 1.0;
[self.scrollView setZoomScale:1.0 animated:YES];
} else if (self.scrollView.zoomScale < 1.0) {
// self.scrollView.zoomScale = 1.0;
[self.scrollView setZoomScale:1.0 animated:YES];
} else {
// self.scrollView.zoomScale = 2.0;
[self.scrollView setZoomScale:2.0 animated:YES];
}
5.指定将要缩放的视图是对应的imageView
- (nullable UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView {
return [self.view viewWithTag:101];
}
UITableView
1.创建UITableView的时候使用initWithFrame:style:
// 风格是必须要设置
// 默认状态创建出来的tableView
// 使用plain是可以显示很多格子(假格子)
// 如果使用group风格,那么视图的背景颜色会发生变化,并且默认没有格子显示
UITableView * tableView = [[UITableView alloc] initWithFrame:self.view.bounds style:UITableViewStyleGrouped];
2.想要对单元格进行操作,需要设置数据源协议
tableView.dataSource = self;
3.单元格事件都和代理相关
tableView.delegate = self;
4.指定组数,在group情况下,你有几组TableView,默认情况下,组数为1
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return 1;
}
5.指定每一组单元格的行数
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return 10;
}
6.实现每一行的单元格
// 返回单元格,返回NSIndexPath所指向位置的单元格
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
// UITableViewCell * cell = [[UITableViewCell alloc] init];
// 简单的实现,暂时不考虑复用问题
UITableViewCell * cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:nil];
cell.backgroundColor
= [UIColor colorWithRed:arc4random_uniform(255) / 255.0
green:arc4random_uniform(255) / 255.0 blue:arc4random_uniform(255) /
255.0 alpha:1];
// indexpath:每一次都会指定单元格的位置,返回单元格的方法会回调多次,使indexPath位置不同
// indexPath.section // 组索引
// indexPath.row // 行索引
// 设置第3行和第10行的单元格颜色为黑
if (indexPath.row == 2 || indexPath.row == 9) {
// cell.backgroundColor = [UIColor blackColor];
}
// 自带的textLabel就可以显示文字
cell.textLabel.text = [NSString stringWithFormat:@"这是第%ld行", indexPath.row];
// 自带的图片,效果会顶满整个cell
cell.imageView.image = [UIImage imageNamed:@"134859qtpkqk5tgcwnzpzt.jpg"];
return cell;
}
7.点击单元格触发代理方法,根据indexPath参数可以判断点击的单元格是哪一个
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
if (indexPath.row == 2) {
NSLog(@"第3行被点了");
} else {
NSLog(@"我被点了");
}
}
8.设置表视图顺序的索引,显示索引名称,比如联系人后面的字母
- (nullable NSArray<NSString *> *)sectionIndexTitlesForTableView:(UITableView *)tableView {
return self.provincesArray;
}
9.UITableView的组头和组尾标题
// 这里的字符串是表视图加载的时候回全部加载,注意:数组越界
- (nullable NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
return self.provincesArray[section];
}
- (nullable NSString *)tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section {
return section;
}
10.如果使用新的复用方法,在tableView创建的时候就要注册单元格
@param Class 将要复用的单元格类,这个类只能是UITableViewCell及其子类
@param Identifier 复用标示
11.只要需求单元格,就会调用这个方法
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
// 重复创建单元格的话,如果有100个单元格,那么需要创建100次
// [[UITableViewCell alloc] initWithStyle: reuseIdentifier:nil]
// 使用可复用的单元格,让表视图去复用池中查询 是否有可用的单元格,如果复用池中有可复用的单元格,就直接返回。如果没有,则自己创建新的单元格
// UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:@"cell-01"];
// NSLog(@"row %ld .tag : %ld",indexPath.row, cell.tag);
//
//
// if (!cell) {
// cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell-01"];
// }
// iOS新的复用单元格方法
UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:@"cell-01" forIndexPath:indexPath];
cell.tag = indexPath.row + 1;
cell.textLabel.text = [NSString stringWithFormat:@"%ld", indexPath.row];
return cell;
}
12.对于组头视图而言,一定要给TableView的组头规定高度
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
// *******没有使用复用头视图进行创建********
// if (section == 0) {
// // 在组头视图中,返回的视图不需要设置大小
// UIView * view = [[UIView alloc] init];
// view.backgroundColor = [UIColor redColor];
//
//
UIScrollView * scrollView = [[UIScrollView alloc]
initWithFrame:CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width,
150)];
// scrollView.contentSize = CGSizeMake(5 * [UIScreen mainScreen].bounds.size.width, 0);
// [view addSubview:scrollView];
//
//
// for (int i = 0; i < 5; i++) {
//
UIImageView * imageView = [[UIImageView alloc]
initWithFrame:CGRectMake(i * [UIScreen mainScreen].bounds.size.width, 0,
[UIScreen mainScreen].bounds.size.width, 150)];
// imageView.image = [UIImage imageNamed:[NSString stringWithFormat:@"%d", i]];
// [scrollView addSubview:imageView];
// }
//
//
//
// return view;
// } else if (section == 1) {
// return nil;
// } else {
// return nil;
// }
13.可以根据section参数,对不同的组头高度进行设置
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {
if (section == 0) {
return 150;
} else if (section == 1) {
return 300;
} else {
return 0;
}
}
UITableView和Cell的常用属性
1.当直接使用UITableViewController时,系统会自动帮我们添加数据源协议和代理协议,并且设置代理对象为self。同时,系统默认帮我添加了一些方法
2.对tableView进行的设置是相对全局设置,所有的都会遵循 行高
self.tableView.rowHeight = 100;
3.设置背景图片
UIImageView * imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"100.jpg"]];
self.tableView.backgroundView = imageView;
使用颜色将图片进行展示
// self.tableView.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"100.jpg"]];
4.分割线的颜色
self.tableView.separatorColor = [UIColor redColor];
5.None:没有分割线 singleLine:单行 singleLineEtched:虚线 self.tableView.separatorStyle = UITableViewCellSeparatorStyleSingleLine;
6.分割线只能够左右调整
self.tableView.separatorInset = UIEdgeInsetsMake(1, 3, 50, 10);
7.表视图的头视图
// 表头和组头不一样,必须要设置frame大小
UIView * view1 = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 0, 150)];
view1.backgroundColor = [UIColor purpleColor];
self.tableView.tableHeaderView = view1;
8.cell背景图 cell.backgroundView = imageView;
9.选中风格
cell.selectionStyle = UITableViewCellSelectionStyleNone;
10.cell选中背景图 如果设置了选中样式为none,那么选中图片也不会有显示
UIImageView * imageViewSelected = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"tableCell_common_tapped"]];
cell.selectedBackgroundView = imageViewSelected;
11.单元格的辅助视图
UITableViewCellAccessoryNone,
UITableViewCellAccessoryDisclosureIndicator--向右箭头
UITableViewCellAccessoryDetailDisclosureButton--详情按钮
UITableViewCellAccessoryCheckmark,--对勾
cell.accessoryType = UITableViewCellAccessoryDetailDisclosureButton
12.选中单元格
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
}
13.辅助视图button 方法
- (void)tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath {
NSLog(@"第%ld行的按钮", indexPath.row);
// 获取对应的cell
UITableViewCell * cell = [tableView cellForRowAtIndexPath:indexPath];
// 更改单元格上的辅助视图
// cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
}
14.想要针对不同的单元格设置不同的单元格高度
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
if (indexPath.row == 0) {
return 10;
} else if (indexPath.row == 3){
return 150;
} else {
return 100;
}
}
编辑模式
1.是否允许用户在编辑模式下进行选中单元格操作
self.tableView.allowsSelectionDuringEditing = YES;
2.多选
self.tableView.allowsMultipleSelectionDuringEditing = YES;
3.是否开启编辑模式
[self.tableView setEditing:sender.selected animated:YES];
4.改变编辑风格
- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath {
return UITableViewCellEditingStyleDelete;
}
5.单元格数目变化,在这个方法里面完成
// 自带向左轻扫手势,会弹出删除,向左滑动会弹出删除
-
(void)tableView:(UITableView *)tableView
commitEditingStyle:(UITableViewCellEditingStyle)editingStyle
forRowAtIndexPath:(NSIndexPath *)indexPath {
if (editingStyle == UITableViewCellEditingStyleDelete) {
// 开始tableView内容的更新,需要和结束方法成套的使用,有开始更新就一定要有结束更新(否则不会产生效果),在方法之间的更新,一定要更新数据源
[tableView beginUpdates];
// 1.改变数据源
[self.mutableArr removeObjectAtIndex:indexPath.row];
// 2.改变界面元素---》对表视图中的数据进行刷新
[tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
[tableView endUpdates];
} else if (editingStyle == UITableViewCellEditingStyleInsert) {
}
}
6.复写此方法,可以直接移动单元格,对单元格重新排序
-
(void)tableView:(UITableView *)tableView
moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath
toIndexPath:(NSIndexPath *)destinationIndexPath {
}
UICollectionView
1创建UICollectionView
layout:布局.
UICollectionView * collectionView = [[UICollectionView alloc]
initWithFrame:self.view.bounds collectionViewLayout:layout];
2.UICollectionViewLayout这个类只是一个基类,只提供方法和属性,但是不提供布局信息
UICollectionView Layout * layout = [[UICollectionViewLayout alloc] init];
// 流水布局 一般采用流水布局
UICollectionViewFlowLayout * layout = [[UICollectionViewFlowLayout alloc] init];
3.设置单元格大小
layout.itemSize = CGSizeMake(44, [UIScreen mainScreen].bounds.size.height);
4.每行的间距
// layout.minimumLineSpacing = 1;
// 每个单元格之间的间距
// layout.minimumInteritemSpacing = 1;
5.设置滑动方向
layout.scrollDirection = UICollectionViewScrollDirectionHorizontal;
6.集合视图 跟表视图一样都要注册
[collectionView registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:cellID];
7.collectionView同样需要数据源方法来提供单元格
collectionView.dataSource = self;
collectionView.delegate = self;
8.组数的设置
- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {
return 20;
}
9.- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
// 在collectionView中,对复用更加的强调,我们一定要使用复用单元格的方法来进行复用,并且是使用新方法来进行复用,我们一定要进行单元格的注册
// UICollectionViewCell * cell = [[UICollectionViewCell alloc] init];
UICollectionViewCell * cell = [collectionView dequeueReusableCellWithReuseIdentifier:cellID forIndexPath:indexPath];
cell.backgroundColor = [UIColor greenColor];
return cell;
}