IBAction表示当前为事件方法:
- (IBAction)方法名{
...
}
IBAction表示当前为事件方法:
- (IBAction)方法名{
...
}
获取文本框值:
NSString *str = self.自定义名称.text
将NSString转为int:
int num = [str intValue];
或
int num = str.intValue;
将int转为NSString类型并给Label设值:
self.自定义属性名.text = [NSString stringWithFormat:@"%d", num];
文件框调出键盘:
[self.自定义名称 resignFirstResponder];
或
[self.view endEditing;YES]; //一般用这种方式
隐藏键盘,去掉输入框焦点:
[self.view endEditing:YES];
执行动画:
方式1(头尾式):
开启一个动画
[UIView beginAnimations:nil context:nil];
设置动画时间
[UIView setAnimationDuration:2];
要执行的动作
self.变量引用.center = 改变值后的center;
提交动画
[UIView commitAnimations];
方式2(block方式):
[UIView animateWithDuration:1.0 animations:^{ //1.0为1秒
//执行动画的代码
self.变量引用.frame = 改变值后的frame;
} completion:^(BOOL finished) {
//动画完成后的代码
}];
在代码中动态创建控件(按钮):
- (void)viewDidLoad { //当全局的View加载完毕后会调用这个方法
[super viewDidLoad];
UIButton *btn = [[UIButton alloc] init]; //调用UIButton控件的init方法创建一个按钮控件
[btn setTitle:@"默认显示的文字" forState:UIControlStateNormal]; //设置默认下显示的文本
[btn setTitle:@"高亮显示的文字" forState:UIControlStateHighlighted]; //设置高亮下显示的文本
[btn setTitleColor:[UIColor redColor] forState:UIControlStateNormal]; //设置默认下文字颜色
[btn setTitleColor:[UIColor blueColor] forState:UIControlStateHighlighted]; //设置高亮下文字颜色
UIImage *img = [UIImage imageNamed:@"图片名称"] //引入图片资源
[btn setBackgroundImage:img forState:UIControlStateNormal]; //设置默认下背景
[btn setBackgroundImage:img forState:UIControlStateHighlighted]; //设置高亮下背景
btn.frame = CGRectMake(1, 1, 1, 1); //设置按钮的位置与宽高
[btn addTarget:self action:@selector(方法名) forControlEvents:UIControlEventTouchUpInside]; //设置点事件时触发指定的方法
[self.view addSubview:btn]; //将按钮加入当前View中
}
UIButton内容左对齐
UIButton引用.contentHorizontalAlignment = UIControlContentHorizontalAlignmentLeft;
UIButto内容的内边距
UIButton引用.contentEdgeInsets = UIEdgeInsetsMake(left, top, right, bottom);
UIButto标题距离左边的边距
UIButton引用.titleEdgeInsets = UIEdgeInsetsMake(left, top, right, bottom);
获取按钮位置与大小信息:
CGRect rect = self.按钮变量.frame; //这个frame包含大小与xy坐标
int x = rect.origin.x; //x坐标
int y = rect.origin.y; //y坐标
int width = rect.origin.width; //宽度
int height = rect.origin.height; //高度
修改位置与大小信息(不能直接修改结构体里的变量,要先取出frame结构体赋值给另一变量,最重新赋值给原结构体)
rect.origin.x = 10; //修改x轴位置
rect.origin.y = 10; //修改y轴位置
rect.size.width = 10; //修改宽度
rect.size.height = height; //修改高度
self.按钮变量.frame = rect;
CGRect:
frame:位置和大小(origin.x、origin.y、size.width、size.height)
center:位置(origin.x、origin.y)
bounds:大小(size.width、size.height)
transform:旋转和平移
利用transform进行位移、缩放、旋转(类似android补间动画)
平移:
self.变量引用.transform = CGAffineTransformMakeTranslation(x偏移量, y偏移量); //只平移一次,平移到距离原始位置XY差值的位置
self.变量引用.transform = CGAffineTransformTranslate(self.变量引用.transform, x偏移量, y偏移量); //基于指定的值再平移XY偏移量
缩放:
self.变量引用.transform = GCAffinetransformMakeScale(x轴缩放比例,y轴缩放比例); //只缩放一次,基于开始位置缩放
self.变量引用.transform = GCAffinetransformScale(self.变量引用.transform, x轴缩放比例,y轴缩放比例); //基于指定位置缩放
旋转:
self.变量引用.transform = GCAffinetransformMakeRotation(角度); //只转一次顺的为正,逆时针为负
self.变量引用.transform = GCAffinetransformRotate(self.变量引用.transform, 角度); //基于原值旋转
回到原位置原状态:
self.变量引用.transform = GCAffinetransformIdentity;
帧动画:
(1)动态加载图片到NSArray中
NSMutableArray *imgList = [NSMutableArray array]; //创建可变数组
for(int i = 0; i < 10; i++){
NSString *imgName = [NSString stringWithFormat:@"图片名称前缀_%02d.jpg", i]; //%02d表示遇到10以下的数字时以0开头(如:01),10及以上保持原值
//UIImage *img = [UIImage imageNamed:imgName]; //根据名称加载图片,这种方式图片不会释放
NSString *path = [NSBundle mainBundle pathForResource:imgName ofType:nil]; //获取图片路径
UIImage *img = [UIImage imageWithContentsOfFile:path]; //根据路径加载图片,这种方式图片会释放
[imgList addObject:imgName]; //将图片对象加入list中
}
(2)设置图片
self.imgViewCat.animation = imgList;
(3)设置动画时间
self.imgViewCat.animationDuration = 持续秒数; //int类型的秒数值
(4)设置是否需要重复播放
self.imgViewCat.animationRepeatCount = 1;
(5)开启动画
[self.imgViewCat startAnimating];
(6)清空图片集合,在播放完后执行清空
[self.imgViewCat performSelector:@selector(setAnimationImages:) withObject:nil afterDelay:持续秒数];
图片内存释放问题
通过UIImage *img = [UIImage imageNamed:图片名称];这种方式,图片不会释放
通过UIImage *img = [UIImage imageWithContentsOfFile:图片路径];这种方式,图片会自动释放
获取当前View下所有子View
for(UIView *v in self.view.subviews){
}
获取当前View的父View
UIView *parentV = self.当前View引用.superview;
根据tag获取某个控件
UITextField *tf = (UITextField *)[self.view wiewWithTag:tag值];
删除第1个子View
[self.view.subviews.firstObject removeFormSuperview];
删除自已View
[View引用 removeFromSuperview];
利用plist文件引入图片列表
(1)在Supporting Files中创建 pic.plist文件 ,新建N个item,并设置图片名称和描述
(2)在定义代码中定义属性:
@property (nonatomic, strong) NSArray *pic;
(3)在实现代码中加载,重写pic属性的get方法,懒加载方式:
- (NSArray *)pic {
if(_pic == nil) {
NSString *path = [[NSBundle mainBundle] pathForResource:@"pic.plist" ofType:nil]; //获取pic.plist文件的路径,mainBundle表示获取手机上的此APP安装时的根目录
NSArray *arr = [NSArray arrayWithContentsOfFile:path]; //将资源获取赋值给数组
_pic = array; //赋值
}
}
(4)将图片显示到UIImageView
NSDictionary *dict = self.pic[序号];
self.图片控件引用.image = [UIImage imageNamed:dict[@"在plist中定义的图片名称"]];
设置UIImageView显示图片的模式
UIImageView引用.contentMode = UIViewContentModeCenter; //居中显示
设置UIImageView显示图片超出控件时不截掉
UIImageView引用.clipsToBounds = NO;
获取控件最大x值
CGFloat x = CGRectGetMaxX(控件引用.frame);
获取控件最大y值
CGFloat y = CGRectGetMaxY(控件引用.frame);
设置UILabel属性
UILabel *lb = [[UILabel alloc] init];
lb.font = [UIFont systemFontOfSize:字号]; //字号为整型
lb.textAlignmeent = NSTextAlignmentCenter; //居中对齐
xib使用(主要为了建立子布局,再建立子自定义View,两者通过拖动控件关联后,在主Control中直接使用自定义View)
1.使用默认的方式,xib文件继承UIView
(1)新建空的xib文件,在内部布局控件,并将Class属性改成自定义View(在作为UITableView单行View时需要右上角属性按钮 -> Identifier中输入tag值,在UITableView重用时使用)
(1)创建自定义View,继承UIView
(2)将xib中的控件拖动到自定义View.m中,定义成属性,将加载xib文件的代码封装在内部,在外部Control时直接调用此自定义View的这个方法加载xib文件
NSBundle *rootB = [NSBundle mainBundle]; //获取应用根目录
UIView *itemV = [[rootB loadNibNamed:@"xib文件名" owner:nil options:nil] lastObject]; //找到xib文件
(3)在主ViewController.m中直接import自定义View.h,并直接取出自定义View内部的子控件使用
设置Label圆角效果:
Label引用.layer.cornerRadius = 5; //设置四周圆角的半径
Label引用.layer.masksToBounds = YES; //把四角多余部分裁剪掉
改变状态栏颜色为白色
- (UIStatusBarStyle)preferredStatusBarStyle{ //重写ViewController.m文件中的preferredStatusBarStyle方法
return UIStatusBarStyleLightContent; //返回白色值
}
隐藏状态栏
- (BOOL)prefersStatusBarHidden{ //重写ViewController.m文件中的prefersStatusBarHidden方法
return YES; //返回YES为隐藏
}
UIButton设置不能被点击
右上角属性按钮- > Interaction中去掉"User Interaction Enabled"的勾选
或代码设置
self.view引用.userInteractionEnabled = NO;
UIButton设为显示图片控件时,去掉点击时变灰效果
右上角属性按钮- > Drawing中去掉"Highlighted Adjusts Image"的勾选
UIButton设置文字左边的图标
右上角属性按钮- > Image中输入图片名称
或代码方式:
[self.UIButton引用 setImage:[UIImage imageNamed:@"图片名称"] forState:UIControlStateNormal];
让在输入属性定义代码时自动补全
右下角"{}"图标 - > 点击"@property with copy" ->在弹出的编辑框中点"Edit" -> 输入"Title"的内容(随意) -> 输入"Completion Shortout"的内容(快捷键) -> 在空白编辑处输入"@property (nonatomic, copy) NSString *<#属性名#>;" //NSString可以换成其他类型
将某个View设为最顶层显示
[self.view bringSubviewToFront:self.view引用];
让view内部的每个子view调一次removeFromSuperview方法执行自删除(内部有循环调用)
[sekf.view.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)];
隐藏当前view
view引用.hidden = YES;
获取当前状态下UIButton文字
NSString *str = UIButton引用.currentTitle;
将NSString转成int类型
NSString* str = @"1";
int num = str.intValue;
截取字符串
NSString *str = [@"原串" substringToIndex:1] //截取字符串中的第1个字符
可变字符串(类似java中的StringBuff...)
NSMutableString *ms = [NSMutableString string];
[ms appendString:@"字符串"];
判断字符串内容是否相等
if([@"" isEqualToString:ms]){ //ms为上面的NSMutableString
...
}
延时指定秒数后执行指定方法
[self performSelector:@selector(方法名) withObject:nil afterDelay:秒数]; //秒数为int类型
使用UIAlertView弹出对话框
(1)创建对话框
UIAlertView *dialog = [UIAlertView alloc] initWithTitle:@"标题" message:@"内容" delegate:self cancelButtonTitle:@"第0个按钮名称" otherButtonTitles:@"第1个按钮名称", @"第2个按钮名称", nil];
(2)显示对话框
[dialog show];
(3)使用代理监听点击事件(在ViewController.m中)
@interface ViewController () <UIAlertViewDelegate> //使用代理(类似java中的implements)
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{ //重写UIAlertView中按钮点击方法,buttonIndex从0开始
//根据buttonIndex值判断哪个按钮点的,添加相关代码
...
}
资源中图片的区别
图片名:非视网膜屏幕,1点==1px像素
@2x图片名:视网膜屏幕,1点==2px像素
@3x图片名:视网膜屏幕,1点==3px像素
设置APP图标
打开Images.xcassets -> 点击中间的AppIcon -> 将图标拖动到布局中的空格中,会自动添加
设置APP启动图
方法1:
选中项目 -> 在中间处点击"App Icons and Launch Images"中的"Launch Images Source" -> 在弹出框中选择"Images"点"Migrate按钮" -> Launch Images Source中改成LaunchImage,删除下面的Launch Screen File值 -> 打开Images.xcassets,将图片拖入中间框中,会自动加载
或
选中项目 -> 在中间处点击"App Icons and Launch Images"中的"Launch Images Source" -> 在弹出框中选择"Images"点"Migrate按钮" -> Launch Images Source中改成LaunchImage,删除下面的Launch Screen File值 -> 打开Images.xcassets,点LaunchImage,可拖动图片放入。
方法2(iOS7上不支持):
点点LaunchScreen.xib,在中间点View,布局控件
UIScrollView使用
(1)拖动UIScrollView到中间,在内部再添加子View
(2)设置UIScrollView内容大小
self.UIScrollView引用.contentSize = self.UIScrollView子View引用.frame.size;
让UIScrollView滚动到指定位置
CGPoint point = self.UIScrollView引用.contentOffset;
point.x = point.x + 偏移量;
point.y = point.y + 偏移量;
self.UIScrollView引用.contentOffset = point; //无动画效果,直接移过去
//point可以用CGPointMake(x, y)创建一个新的
[self.UIScrollView引用 setContentOffset:point animated:YES]; //通过动画方式滚动过去
隐藏UIScrollView滚动条
self.UIScrollView引用.showsHorizontalScrollIndicator = NO; //水平滚动条
self.UIScrollView引用.showsVerticalScrollIndicator = NO; //垂直滚动条
设置UIScrollView内边距(类似android padding)
self.UIScrollView引用.contentInset = UIEdgeInsetsMake(left, top, right, bottom);
通过代理监听UIScrollView滚动事件
(1)self.UIScrollView引用.delegate = self;
(2)@interface ViewController () <UIScrollViewDelegate> //使用代理(类似java中的implements)
(3)在重写UIScrollView几个方法
//开始拖动时触发
- (void)scrollViewWillBeginDragging:(UIScrollView *) scrollView{
//处理开始拖动的代码
}
// 拖动和滚动时触发
- (void)scrollViewDidScroll:(UIScrollView *) scrollView{
//获取当前滚动位置,值为{x, y}
NSString *curOffset = NSStringFromCGPoint(scrollView.contentOffset);
}
//拖动结束时触发
- (void)scrollViewDidEndDragging:(UIScrollView *) scrollView willDecelerate:(BOOL) decelerate{
//处理拖动结束的代码
}
处理UIScrollView缩放事件
(1)返回用于缩放的UIScrollView子控件
- (UIView *) viewForZoomingInScrollView:(UIScrollView *scrollView {
return self.子控件引用;
}
(2)在viewDidLoad初始化时设置最大最小缩放比
-(void)viewDidLoad {
[super viewDidLoad];
self.UIScrollView引用.maximumZoomScale = 3.5;
self.UIScrollView引用.minimumZoomScale = 0.5;
}
(3)其他事件
//开始缩放触发
- (void)scrollViewWillBeginZooming:(UIScrollView *)scrollView withView:(UIView *)view{
}
//缩放中触发
- (void)scrollViewDidZoom:(UIScrollView *)scrollView{
}
//缩放完成触发
- (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)viewatScale:(CGFloat)scale{
}
UIScrollView设置分页效果(多张图片滚动时,拖动到一半时自动控制滚到下一页或上一页)
self.UIScrollView引用.pagingEnabled = YES; //内部根据contentSize大小实现分页
UIPageControl实现分页指示器(小圆点)
self.UIPageControl引用.numberOfPages = 总页数;
self.UIPageControl引用.currentPage = 0; //设为当前页为第1页
self.UIPageControl引用.hidesForSinglePage = YES; //只有一页时是否隐藏页码批示器,YES为隐藏,NO为否
self.UIPageControl引用.pageIndicatorTintColor = ; //其他页码颜色
self.UIPageControl引用.currentPageIndicatorTintColor = ; //当前页码颜色
NSTimer定时器(时间间隔大时使用,以秒为单位)
NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:时间间隔秒数 target:self selector:@selector(执行的方法名) userInfo:nil repeats:YES]; //启动计时器
[timer invalidate]; //停止计时器
timer = nil; //设为空
//修改timer的优先级和控件一样
NSRunLoop *loop = [NSRunLoop currentRunLoop];
[loop addTimer:self.timer forMode:NSRunLoopCommonModes];
CADisplayLink(时间间隔小时使用,以毫秒为单位)
获取顶层View的大小与位置
NSStringFromCGRect(self.view.frame);
UITableView的使用(类似android中ListView)
(1)拖动UITableView到布局中
(2)为UITableView设置UITableViewDataSource数据源(类似android中的Adapter),
首先:
代码方式:
self.tableView.dataSource = self; //在viewDidLoad方法中
或
拖线方式:
右击View Controller -> View -> 右击UITableView,在弹出框中将dataSource拖动到View Controller上。
然后:@interface ViewController () <UITableViewDataSource> //实现UITableViewDataSource方法
//重写此方法,控制列表显示几行
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return 总行数; //总共显示行数
}
//重写此方法,控制列表每组显示几行
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{ ////section表示当前组position
return 行数; //每组显示几行
}
//重写此方法,每组每行显示什么单元格内容
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *) indexPath {
//对每行View进行重用(类似android中convertView)
UITableViewCell *cell = [tableView dequeueReusableCellWithIndentifier:@"tag值"]; //标识当前行的唯一标识
if(cell == nil){ //为null就创建新的
//indexPath.section表示当前组position,indexPath.row表示当前行position
cell = [UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"tag值"]; //标识当前行的唯一标识,自定义item的View时用xib的tag值,用xib自定义item的布局时需要设置行高
}
cell.textLable.text = @"每行标题"; //UITableViewCell自带的靠上的UILablel,里面还有个UIImageView和UILable
cell.imageView.image = [UIImage imageNamed:@"图片名"];
cell.detailTextLabel.text = @"描述";
cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; //右边显示小箭头
cell.accessoryView = 自定义的View; //右边箭头改成想要的自定义View
cell.backgroundColor = [UIColor blueColor]; //设置当前行背景色
cell.selectedBackgroundView = UIView引用; //设置当前行选中背景色,需要创建选中效果的View进行赋值
return cell;
}
使用Main.storboard中的模版当作cell
(1)在Main.storboard中的UITableView上拖一个item的View,并设置identity属性为自定义tag值,并设置Class属性为继承了UITableViewCell的自定义类
(2)重写以下方法,当缓存中无此cell时会自动创建
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *) indexPath {
//对每行View进行重用(类似android中convertView),可以自定义UITableViewCell类
UITableViewCell *cell = [tableView dequeueReusableCellWithIndentifier:@"自定义tag值"]; //为上面指定的自定义tag值
//设置数据,可以自定义UITableViewCell,并将设置数据放在此类中
return cell;
}
//为每组设置头标题
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger) section {
if(section == 0){//判断当前组position来设置不同的头标题
return "头标题名";
}
}
为每组设置头View
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger) section {
static NSString *tag = @"tag名称";
UITableViewHeaderFooterView *headerV = [UITableView引用 dequeueReusableHeaderFooterViewWithIdentifier:tag]; //根据tag从缓存中获取item的组View
if(headerV == nil){
headerV = [[UITableViewHeaderFooterView alloc] initWithReuseIdentifier:tag]; //创建
}
headerV.contentView = 自定义View; //自定义View需要指定位置与宽高
//给各子View设置数据
return headerV;
}
当控件的frame发生改变时触发layoutSubviews方法
- (void)layoutSubviews{
[super layoutSubviews];
self.bounds; //(就是frame)可以获取当前View的宽高等值
}
设置每组头View高度
UITableView引用.sectionHeaderHeight = 高度值;
//为每组设置尾标题
- (NSString *)tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger) section {
if(section == 0){//判断当前组position来设置不同的尾标题
return "尾标题名";
}
}
//统一设置UITableView行高
self.UITableView引用.rowHeight = 高度值;
//设置不同行不同高度
首先:@interface ViewController () <UITableViewDelegate>
其次:
- (CGFloat)tableView:(UITableView *)tableVeiw heightForRowAtIndexPath:(NSIndexPath *)indexPath{
//根据条件返回不同的高度值
return 高度值;
}
(3)滚动时固定组标题在最上面,并隐藏状态栏
- (BOOL)prefersStatusBarHidden{
return YES;
}
UITableView常见属性
rowHeight:设置每行的高度
separatorColor:分隔线的颜色
separatorStyle:分隔线样式
值:
UITableViewCellSeparatorStyleNone; //无分隔线
tableHeaderView:列表头部View
tableFooterView:列表底部View
设置UITableView右侧索引,点击时跳到指定组(只要实现以下方法)
- (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView{
return @[@"A", @"B"]; //返回字符串数组
}
//监听UITableView的item选中方法
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
}
//刷新UITableView整个列表数据
[self.UITableView引用 reloadData];
//刷新UITableView某个组
NSIndexSet *pos = [NSIndexSet indexSetWithIndex:pos位置值];
[UITableView引用 reloadSections:pos withRowAnimation:UITableViewRowAnimationLeft]; //引处为左移动画,UITableViewRowAnimationFade为淡入淡出
//刷新UITableView局部数据
NSIndexPath *index = [NSIndexPath indexPathForRow:@"某一行tag名称" inSection:0]; //一个对象行
NSIndexPath *index = [NSIndexPath indexPathForRow:@某一行position inSection:0]; //一个对象行
[self.UITableView引用 reloadRowsAtIndexPaths:@[index] withRowAnimation:UITableViewRowAnimationAutomatic]; //刷新当前行数据
将plist文件中的资源赋值给实体类中同名的属性(plist中key名必须与属性名一致)
[self setValuesForKeysWithDictionary:dict]; //self为当前实体类对象
监听滚动事件
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollV{
...
}
使用UITableView静态单元格(数据不变的情况下使用,UITableView必须放在UITableViewController中使用)
(1)设置为静态单元格
Content属性设置为Static Cells,Style属性设置为Basic;
(2)设置组数
选中UITableView,Sections属性输入行数
(3)设置每组的行数
选中某一组,Rows属性输入行数
(4)设置单元格内容(选中某行)
Image属性输入资源中的图片名称 //设置最左边图标
Accessory属性设置为Disclosure Indicator //显示最右边小箭头
选中中间的文本框,输入指定文字
设置UITableView的FooterView
UITableView引用.tableFooterView = View引用;
设置UITableView的HeaderView
UITableView引用.tableHeaderView = View引用;
设置UITableView背景色
UITableView引用.backgroundColor = [UIColor colorWithRed:100/255.0 green:100/255.0 blue:100/255.0 alpha:1.0]; //alpha设置透明度
设置UITableView中的item不能被点击
UITableView引用.allowsSelection = NO;
UIActivityIndicatorView使用(转动加载控件)
(1)在Text->Plain中输入“加载中”的文字 //显示文字
(2)Behavior -> 选中Animating和Hides When Stopped 这两个属性 //执行动画,隐藏时停止动画
自定义控件(.m文件中)
@class MyView; //自定义控件名称
@protocol MyViewDelegate <NSobject, UIScrollViewDelegate> //定义代理协议实现的方法
@required //表示必须要实现此方法
- (void) setData:(MyView *) myView; //自定义一个代理方法
@end
@interface MyView: UIView //继承UIView
@property (nonatomic, weak) id<MyViewDelegate> delegate; //定义属性,UI控件的代理协议定义必须用weak
@end
判断当前是否已实现了代理中的方法
if([self.delegate respondsToSelector:@selector(代理方法名:)]){
//[self.delegate 代理方法:self];
}
延时执行
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(秒数 *NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
//要执行的代码
});
//让UITableView滚到指定行
NSIndexPath *index = [NSIndexPath indexPathForRow:@某一行position inSection:0]; //一个对象行
[self.UITableView引用 scrollToRowAtIndexPath:index atScrollPosition: UITableViewScrollPosition animated:YES];
//当自定义View加载完成后,这方法会被调用
- (void)awakeFromNib{
}
自定义UITableView(继承UITableView)
(1)重写initWithStyle方法,用于给item创建自定义布局
- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *) reuseIdentifier{
//给每行添加自定义控件,如
UILabel *tv = [[UILabel alloc] init];
[self.contentView addSubview:tv];
return self;
}
设置UILabel圆角
UILabel引用.layer.cornerRadius = 圆角值;
UILabel引用.masksToBounds = YES;
根据UILabel中文字的内容,动态计算UILabel的高和宽
UILabel引用.font = [UIFont systemFontOfSize:10]; //设置UILabel字体大小
NSDictionary *attr = @{NSFontAttributeName: [UIFont systemFontOfSize:10]}; //10为字体大小
CGSize size = [@"字符串" boundingRectWithSize:CGSizeMake(MAXFLOAT, MAXFLOAT) options: NSStringDrawingUsesLineFragmentOrigin attributes:attr context:nil].size; //获取文字实际占位大小
CGFloat w = size.width; //文字宽度
CGFloat h = size.height; //文字高度
UILabel引用.frame = CGRectMake(0, 0, w, h); //设置UILabel位置与宽高
UILabel自动换行
UILabel引用.numberOfLines = 0;
使用枚举定义字段
(1)定义枚举:
typedef enum {
type1 = 0,
type2 = 1
}Type
(2)在定义属性中使用:
@property(nonatomic, assign) Type type; //枚举要使用assign修饰
获取屏幕宽度
CGFloat screenW = [UIScreen mainScreen].bounds.size.width;
创建NSString分类(类似子类)
New File -> iOS Source -> Objective-C File -> 输入File名称,FileType选择Category,Class选择NSString - > Next到完成创建,可以定义并实现自定义的方法,在使用NSString时可直接调用自定义的方法
比较2个值,返回大的值
CGFloat max = MAX(CGFloat类型的值1, CGFloat类型的值1); //MAX是个宏
清空View的背景色
View引用.backgroundColor = [UIColor clearColor];
用平铺方式拉伸图片
UIImage *imgTar = [imgSrc stretchableImageWithLeftCapWidth:图片拉伸启始x的位置 topCapHeight:图片拉伸启始y的位置]; //开始xy的值为NSInteger类型,截取xy区的图片复制无数份进行平铺
设置UIButton内边距
UIButton引用.contentEdgeInsets = UIEdgeInsetsMake(left, top, right, bottom);
给UITextField(输入框)设置左边距
UIView *v = [[UIView alloc] init];
v.frame = CGRectMake(left, top, right, bottom);
UITextField引用.leftView = v; //设置UITextField左边距的View
UITextField引用.leftViewMode = UITextFieldViewModeAlways; //设置总是显示leftView
NSNotificationCenter(通知)的使用
(1)监听通知
NSNotificationCenter *nc = [NSNotificationCenter defaultCenter]; //获取通知管理对象
//name参数为nil时,监听方法会收到所有该通知对象的消息;object参数为nil时,所有名称为此name的通知都会触发监听;name和object参数都为nil时,所有消息都会触发监听
[nc addObserver:自定义监听对象引用 selector:@selector(自定义监听方法名) name:@"自定义通知名称" object:自定义通知对象引用]; //监听通知,其中自定义通知对象引用要与发送时为同个引用对象
监听方法定义示例(.h文件中):
- (void) 方法名:(NSNotification *) ni; //可以没有参数,有参数为了接收并处理发送过来的消息
监听方法实现示例(.m文件中):
- (void) 方法名:(NSNotification *)ni{
ni.name; //通知名称
ni.object; //通知对象
ni.userInfo; //通知内容,是个字典
}
(2)发送通知
NSNotificationCenter *nc = [NSNotificationCenter defaultCenter]; //获取通知管理对象
[nc postNotificationName:@"自定义通知名称" object:自定义通知对象引用 userInfo:@{@"title": @"标题", @"content": @"内容"}]; //发送一个通知
(3)移除监听(dealloc在当前对象销毁时触发)
- (void)dealloc{
[[NSNotificationCenter defaultCenter] removeObserver:self]; //必须移除,否则对象销毁后,还发送消息时会报错
}
键盘弹出回缩通知监听(键盘弹出时上推View,隐藏时下移View)
(1)监听键盘事件
NSNotificationCenter *nc = [NSNotificationCenter defaultCenter]; //获取通知管理对象
[nc addObserver:self selector:@selector(自定义监听方法名) name:UIKeyboardWillChangeFrameNotification object:nil]; //监听键弹出通知
(2)实现监听方法,平移View到键盘之上,在隐藏键盘时下移
- (void) 方法名:(NSNotification *) n{
//获取键盘的y值
CGRect rect = [n.userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue];
CGFloat keyY = rect.origin.y;
CGFloat tranformY = keyY - view引用.frame.size.height; //计算需要平移的值
view引用.transform = CGAffineTransformMakeTranslation(0, tranformY); //实现平移
}
修改键盘return键为"Send"
选中UITextField -> 点右上角属性按钮,修改Return Key值为"Send"
监听按下return键时的方法(监听UITextField)
- (BOOL)textFieldShouldReturn:(UITextField *)textField{
NSString *text = textField.text; //获取输入框的内容
return YES;
}
Toast实现(实际是普通View加入窗体中)
[[[UIApplication sharedApplication] keyWindow] addSubview:UILabel引用]; //UILabel中设置圆角效果,显示要toast的文字
KVC方式为对象属性赋值
User *user = [[User alloc] init]; //创建对象
[user setValue:@"名称" forKeyPath:@"name"]; //为User类的name属性赋值
[user setValuesForKeysWithDictionary:NSDictionary引用]; //User类的属性赋值, NSDictionary中的key名要和属性名相同
NSString *name = [user valueForKeyPath:@"name"]; //获取user中name属性的值
将对象转换为NSDictionary
NSDictionary *dict = [user dictionaryWithValuesForKeys:@[@"name"]]; //user中的属性名对应着key名,属性值对应着value
Autoresizing屏幕适配(只能设置当前View相对父View的位置,不能设置平级的View的位置,共6根线)
使用:
(1)选中View,点击右边第一个文件图标,去掉"Use Auto Layout"和"Use Size Classes"勾选。
(2)选中View,点击右边第5个小尺子图标,在Autoresizing项中,根据要求选中6根线中的一些线,
如:左线、右线、上线、下线,表示相对于父View的左、右、上、下四个方向的位置
内部中间横线表示子View随父View的宽度变化而变化
内部中间竖线表示子View随父View的高度变化而变化
代码方式设置选中状态:
子View引用.autoresizingMask = 值; //可以多个值组个用"|"连接,如"值1 | 值2"
值如下:
UIViewAutoresizingNone //没有效果
UIViewAutoresizingFlexibleLeftMargin //右线,距离右边固定值
UIViewAutoresizingFlexibleRightMargin //左线,距离左边固定值
UIViewAutoresizingFlexibleTopMargin //下线,距离下边固定值
UIViewAutoresizingFlexibleBottomMargin //上线,距离上边固定值
UIViewAutoresizingFlexibleWidth //内部中间横线
UIViewAutoresizingFlexibleHeight //内部中间竖线
(3)设置Show中的x、y值,这里的值会相对父View的值(不选中线的话,则为绝对位置)。
Autolayout自动布局(能实现Autoresizing所有的功能,设置平级的View的位置),图形操作方式
(1)选中子View,在底部中间位置点第1个按钮(Align),在弹出Add New Alignment Constralnts对话框中选中以下一个或多个值,并确定。ps:所有设置后能计算出x、y、width、height的值,否则报错。
Leading Edges //View左边对齐其他View
Trailing Edges //View右边对齐其他View
Top Edges //设置2个View顶部对齐(同时选中2个View)
Bottom Edges //设置2个View底部对齐(同时选中2个View)
Horizontal Centers //平级View水平对齐
Vertical Centers //平级View垂直对齐
BaseLines //对齐某根线
Horizontal Center in Container //在父View内部水平(左右)居中,确认View的X值
Vertical Center in Container //在父View内部垂直(上下)居中,确定View的Y值
(2)选中子View,在底部中间位置点第2个按钮(Pin),在弹出中设置固定值,点"Add num Constraints"完成设置,预览中没有更新,可以点黄色警告解决(不是必须的,可以不设置)
可以选中left(默认距离状态栏,可以点向下箭头换成距离屏幕顶部)、
top、right、 //默认左右有空白,去掉勾选"Constrain tomargins"项就解决了
bottom(可以选择距离底部导航栏或屏幕)四个方向的边距线,并在输入框中设置值,设置View距离四个边距的值
Width:View固定宽度
Height:View固定高度
Equal Widths:跟另一个View同样宽度
Equal Heights:跟另一个View同样高度
Aspect Ratio:比例
Align:可选择哪种对齐方式(步骤1中的几个值)
(3)选中子View,在底部中间位置点第3个按钮(Resolve Auto Layout Lssues),用于解决一些自动布局的问题(不是必须的,可以不设置,用于清楚设置等)
(4)修改上面设置的约束
在左边选中Constrains内部某条约束,点右上角属性小图标,以下为说明:
First Item表示第一个View
Relation表示约束条件,如Equal
Second Item表示第二个View
Constant默认为0,可以修改此值实现位置偏移
Priority表示优先级
Multiplier表示倍数默认1,第1个View是第2个View的几倍,如0.5则为一半,
公式:第1个View的x = (第2个View + Constant) * Multiplier
公式:第2个View的top = (self.top + Constant) * Multiplier
Autolayout自动布局(能实现Autoresizing所有的功能,设置平级的View的位置),代码方式
(1)禁用autoresizing
View引用.translatesAutoresizingMaskIntoConstraints = NO;
(2)创建约束
View1的参数1 =
NSLayoutConstraint *lc = [NSLayoutConstraint constraintWithItem:View1引用 attribute:View1的参数 relatedBy:NSLayoutRelationEqual
toItem:View2引用 attribute:View2参数
mutiplier:值 constant:值]; //mutiplier表示倍数默认1,第1个View是第2个View的几倍,如0.5则为一半,Constant默认为0,可以修改此值实现位置偏移
attribute值列表如下:
NSLayoutAttributeLeft //左侧
NSLayoutAttributeRight //右侧
NSLayoutAttributeTop //上方
NSLayoutAttributeBottom //下方
NSLayoutAttributeLeading //首部
NSLayoutAttributeTrailing //尾部
NSLayoutAttributeWidth //宽度
NSLayoutAttributeHeight //高度
NSLayoutAttributeCenterX //X轴中心
NSLayoutAttributeCenterY //Y轴中心
NSLayoutAttributeBaseLine //文本底标线
NSLayoutAttributeNotAnAttribute //没有属性
(3)给View添加约束
[View引用 addConstraint:lc]; //给View自已添加约束
[self.view addConstraint:lc] //父View添加约束(非自身约束都要添加到父View)
基于Autolayout的动画
(1)拖动Constraints中某个约束到ViewController代码编辑器中,Connection为Outlet,输入名称,Type为NSLayoutConstraint
@interface ViewController()
//拖到此处
@property (weak, nonatomic) IBOutlet NSLayoutConstraint *lc;
@end
(2)动画改变constant的值
self.lc.constant += 数值; //修改约束值,还没有重新计算
[UIView animateWithDuration:1.0 animations:^{
[UIView引用 layoutIfNeeded]; //动画执行,根据新的约束值重新计算赋值frame
}];
Size Classes对屏幕进行分类(实现在不同分辨率下不同位置,最底部中间"wAny hAny"选项点开后可以看到9类屏幕分类)
9类屏幕:
wAny和hAny:任意尺寸
wCompact和hCompact:iphone的3.5寸、4寸、4.7寸横屏
wAny和hCompact:iphone所有横屏
wReqular和hCompact:iphone的5.5寸横屏
wReqular和hAny:iPad竖屏或横屏
wCompact和hAny:iphone的3.5寸、4寸、4.7寸竖屏或横屏
wCompact和hReqular:iphone所有竖屏
wAny和hReqular:iphone所有iphone竖屏或iPad横屏或竖屏
wReqular和hReqular:iPad竖屏或横屏
使用:
(1)拖动View到布局中,选中此View。
(2)最右上角属性图标中,拉最底下,点击"installed"左边有个"+",新建一个对应屏幕类型的"installed",默认是Any屏幕下的。
(3)最底部中间"wAny hAny"选项点开后可以看到9类屏幕分类,选中某个屏幕类型,设置控件Autolayout属性。
设置UILabel在不同屏幕分辨率下不同字体大小
选中View,最右上角属性图标中,点击Font前面的"+",选中对应屏幕类型,在新建字体中设置字体大小。
设置UIImageView在不同屏幕分辨率下显示不同图片
选中Images.xcassets,选中中间图片所在的item,在Width和Height中选择其他屏幕类别,然后将新图片拖到新增的空缺处。
当控件被挤压时控制优先级:
小尺子按钮,Content Hugging Priority和Content Compression Resistance Priority中设置优先级。
调试View的层次结构:
最下面,点击第7个书本图标
- (IBAction)方法名{
...
}
IBAction表示当前为事件方法:
- (IBAction)方法名{
...
}
获取文本框值:
NSString *str = self.自定义名称.text
将NSString转为int:
int num = [str intValue];
或
int num = str.intValue;
将int转为NSString类型并给Label设值:
self.自定义属性名.text = [NSString stringWithFormat:@"%d", num];
文件框调出键盘:
[self.自定义名称 resignFirstResponder];
或
[self.view endEditing;YES]; //一般用这种方式
隐藏键盘,去掉输入框焦点:
[self.view endEditing:YES];
执行动画:
方式1(头尾式):
开启一个动画
[UIView beginAnimations:nil context:nil];
设置动画时间
[UIView setAnimationDuration:2];
要执行的动作
self.变量引用.center = 改变值后的center;
提交动画
[UIView commitAnimations];
方式2(block方式):
[UIView animateWithDuration:1.0 animations:^{ //1.0为1秒
//执行动画的代码
self.变量引用.frame = 改变值后的frame;
} completion:^(BOOL finished) {
//动画完成后的代码
}];
在代码中动态创建控件(按钮):
- (void)viewDidLoad { //当全局的View加载完毕后会调用这个方法
[super viewDidLoad];
UIButton *btn = [[UIButton alloc] init]; //调用UIButton控件的init方法创建一个按钮控件
[btn setTitle:@"默认显示的文字" forState:UIControlStateNormal]; //设置默认下显示的文本
[btn setTitle:@"高亮显示的文字" forState:UIControlStateHighlighted]; //设置高亮下显示的文本
[btn setTitleColor:[UIColor redColor] forState:UIControlStateNormal]; //设置默认下文字颜色
[btn setTitleColor:[UIColor blueColor] forState:UIControlStateHighlighted]; //设置高亮下文字颜色
UIImage *img = [UIImage imageNamed:@"图片名称"] //引入图片资源
[btn setBackgroundImage:img forState:UIControlStateNormal]; //设置默认下背景
[btn setBackgroundImage:img forState:UIControlStateHighlighted]; //设置高亮下背景
btn.frame = CGRectMake(1, 1, 1, 1); //设置按钮的位置与宽高
[btn addTarget:self action:@selector(方法名) forControlEvents:UIControlEventTouchUpInside]; //设置点事件时触发指定的方法
[self.view addSubview:btn]; //将按钮加入当前View中
}
UIButton内容左对齐
UIButton引用.contentHorizontalAlignment = UIControlContentHorizontalAlignmentLeft;
UIButto内容的内边距
UIButton引用.contentEdgeInsets = UIEdgeInsetsMake(left, top, right, bottom);
UIButto标题距离左边的边距
UIButton引用.titleEdgeInsets = UIEdgeInsetsMake(left, top, right, bottom);
获取按钮位置与大小信息:
CGRect rect = self.按钮变量.frame; //这个frame包含大小与xy坐标
int x = rect.origin.x; //x坐标
int y = rect.origin.y; //y坐标
int width = rect.origin.width; //宽度
int height = rect.origin.height; //高度
修改位置与大小信息(不能直接修改结构体里的变量,要先取出frame结构体赋值给另一变量,最重新赋值给原结构体)
rect.origin.x = 10; //修改x轴位置
rect.origin.y = 10; //修改y轴位置
rect.size.width = 10; //修改宽度
rect.size.height = height; //修改高度
self.按钮变量.frame = rect;
CGRect:
frame:位置和大小(origin.x、origin.y、size.width、size.height)
center:位置(origin.x、origin.y)
bounds:大小(size.width、size.height)
transform:旋转和平移
利用transform进行位移、缩放、旋转(类似android补间动画)
平移:
self.变量引用.transform = CGAffineTransformMakeTranslation(x偏移量, y偏移量); //只平移一次,平移到距离原始位置XY差值的位置
self.变量引用.transform = CGAffineTransformTranslate(self.变量引用.transform, x偏移量, y偏移量); //基于指定的值再平移XY偏移量
缩放:
self.变量引用.transform = GCAffinetransformMakeScale(x轴缩放比例,y轴缩放比例); //只缩放一次,基于开始位置缩放
self.变量引用.transform = GCAffinetransformScale(self.变量引用.transform, x轴缩放比例,y轴缩放比例); //基于指定位置缩放
旋转:
self.变量引用.transform = GCAffinetransformMakeRotation(角度); //只转一次顺的为正,逆时针为负
self.变量引用.transform = GCAffinetransformRotate(self.变量引用.transform, 角度); //基于原值旋转
回到原位置原状态:
self.变量引用.transform = GCAffinetransformIdentity;
帧动画:
(1)动态加载图片到NSArray中
NSMutableArray *imgList = [NSMutableArray array]; //创建可变数组
for(int i = 0; i < 10; i++){
NSString *imgName = [NSString stringWithFormat:@"图片名称前缀_%02d.jpg", i]; //%02d表示遇到10以下的数字时以0开头(如:01),10及以上保持原值
//UIImage *img = [UIImage imageNamed:imgName]; //根据名称加载图片,这种方式图片不会释放
NSString *path = [NSBundle mainBundle pathForResource:imgName ofType:nil]; //获取图片路径
UIImage *img = [UIImage imageWithContentsOfFile:path]; //根据路径加载图片,这种方式图片会释放
[imgList addObject:imgName]; //将图片对象加入list中
}
(2)设置图片
self.imgViewCat.animation = imgList;
(3)设置动画时间
self.imgViewCat.animationDuration = 持续秒数; //int类型的秒数值
(4)设置是否需要重复播放
self.imgViewCat.animationRepeatCount = 1;
(5)开启动画
[self.imgViewCat startAnimating];
(6)清空图片集合,在播放完后执行清空
[self.imgViewCat performSelector:@selector(setAnimationImages:) withObject:nil afterDelay:持续秒数];
图片内存释放问题
通过UIImage *img = [UIImage imageNamed:图片名称];这种方式,图片不会释放
通过UIImage *img = [UIImage imageWithContentsOfFile:图片路径];这种方式,图片会自动释放
获取当前View下所有子View
for(UIView *v in self.view.subviews){
}
获取当前View的父View
UIView *parentV = self.当前View引用.superview;
根据tag获取某个控件
UITextField *tf = (UITextField *)[self.view wiewWithTag:tag值];
删除第1个子View
[self.view.subviews.firstObject removeFormSuperview];
删除自已View
[View引用 removeFromSuperview];
利用plist文件引入图片列表
(1)在Supporting Files中创建 pic.plist文件 ,新建N个item,并设置图片名称和描述
(2)在定义代码中定义属性:
@property (nonatomic, strong) NSArray *pic;
(3)在实现代码中加载,重写pic属性的get方法,懒加载方式:
- (NSArray *)pic {
if(_pic == nil) {
NSString *path = [[NSBundle mainBundle] pathForResource:@"pic.plist" ofType:nil]; //获取pic.plist文件的路径,mainBundle表示获取手机上的此APP安装时的根目录
NSArray *arr = [NSArray arrayWithContentsOfFile:path]; //将资源获取赋值给数组
_pic = array; //赋值
}
}
(4)将图片显示到UIImageView
NSDictionary *dict = self.pic[序号];
self.图片控件引用.image = [UIImage imageNamed:dict[@"在plist中定义的图片名称"]];
设置UIImageView显示图片的模式
UIImageView引用.contentMode = UIViewContentModeCenter; //居中显示
设置UIImageView显示图片超出控件时不截掉
UIImageView引用.clipsToBounds = NO;
获取控件最大x值
CGFloat x = CGRectGetMaxX(控件引用.frame);
获取控件最大y值
CGFloat y = CGRectGetMaxY(控件引用.frame);
设置UILabel属性
UILabel *lb = [[UILabel alloc] init];
lb.font = [UIFont systemFontOfSize:字号]; //字号为整型
lb.textAlignmeent = NSTextAlignmentCenter; //居中对齐
xib使用(主要为了建立子布局,再建立子自定义View,两者通过拖动控件关联后,在主Control中直接使用自定义View)
1.使用默认的方式,xib文件继承UIView
(1)新建空的xib文件,在内部布局控件,并将Class属性改成自定义View(在作为UITableView单行View时需要右上角属性按钮 -> Identifier中输入tag值,在UITableView重用时使用)
(1)创建自定义View,继承UIView
(2)将xib中的控件拖动到自定义View.m中,定义成属性,将加载xib文件的代码封装在内部,在外部Control时直接调用此自定义View的这个方法加载xib文件
NSBundle *rootB = [NSBundle mainBundle]; //获取应用根目录
UIView *itemV = [[rootB loadNibNamed:@"xib文件名" owner:nil options:nil] lastObject]; //找到xib文件
(3)在主ViewController.m中直接import自定义View.h,并直接取出自定义View内部的子控件使用
设置Label圆角效果:
Label引用.layer.cornerRadius = 5; //设置四周圆角的半径
Label引用.layer.masksToBounds = YES; //把四角多余部分裁剪掉
改变状态栏颜色为白色
- (UIStatusBarStyle)preferredStatusBarStyle{ //重写ViewController.m文件中的preferredStatusBarStyle方法
return UIStatusBarStyleLightContent; //返回白色值
}
隐藏状态栏
- (BOOL)prefersStatusBarHidden{ //重写ViewController.m文件中的prefersStatusBarHidden方法
return YES; //返回YES为隐藏
}
UIButton设置不能被点击
右上角属性按钮- > Interaction中去掉"User Interaction Enabled"的勾选
或代码设置
self.view引用.userInteractionEnabled = NO;
UIButton设为显示图片控件时,去掉点击时变灰效果
右上角属性按钮- > Drawing中去掉"Highlighted Adjusts Image"的勾选
UIButton设置文字左边的图标
右上角属性按钮- > Image中输入图片名称
或代码方式:
[self.UIButton引用 setImage:[UIImage imageNamed:@"图片名称"] forState:UIControlStateNormal];
让在输入属性定义代码时自动补全
右下角"{}"图标 - > 点击"@property with copy" ->在弹出的编辑框中点"Edit" -> 输入"Title"的内容(随意) -> 输入"Completion Shortout"的内容(快捷键) -> 在空白编辑处输入"@property (nonatomic, copy) NSString *<#属性名#>;" //NSString可以换成其他类型
将某个View设为最顶层显示
[self.view bringSubviewToFront:self.view引用];
让view内部的每个子view调一次removeFromSuperview方法执行自删除(内部有循环调用)
[sekf.view.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)];
隐藏当前view
view引用.hidden = YES;
获取当前状态下UIButton文字
NSString *str = UIButton引用.currentTitle;
将NSString转成int类型
NSString* str = @"1";
int num = str.intValue;
截取字符串
NSString *str = [@"原串" substringToIndex:1] //截取字符串中的第1个字符
可变字符串(类似java中的StringBuff...)
NSMutableString *ms = [NSMutableString string];
[ms appendString:@"字符串"];
判断字符串内容是否相等
if([@"" isEqualToString:ms]){ //ms为上面的NSMutableString
...
}
延时指定秒数后执行指定方法
[self performSelector:@selector(方法名) withObject:nil afterDelay:秒数]; //秒数为int类型
使用UIAlertView弹出对话框
(1)创建对话框
UIAlertView *dialog = [UIAlertView alloc] initWithTitle:@"标题" message:@"内容" delegate:self cancelButtonTitle:@"第0个按钮名称" otherButtonTitles:@"第1个按钮名称", @"第2个按钮名称", nil];
(2)显示对话框
[dialog show];
(3)使用代理监听点击事件(在ViewController.m中)
@interface ViewController () <UIAlertViewDelegate> //使用代理(类似java中的implements)
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex{ //重写UIAlertView中按钮点击方法,buttonIndex从0开始
//根据buttonIndex值判断哪个按钮点的,添加相关代码
...
}
资源中图片的区别
图片名:非视网膜屏幕,1点==1px像素
@2x图片名:视网膜屏幕,1点==2px像素
@3x图片名:视网膜屏幕,1点==3px像素
设置APP图标
打开Images.xcassets -> 点击中间的AppIcon -> 将图标拖动到布局中的空格中,会自动添加
设置APP启动图
方法1:
选中项目 -> 在中间处点击"App Icons and Launch Images"中的"Launch Images Source" -> 在弹出框中选择"Images"点"Migrate按钮" -> Launch Images Source中改成LaunchImage,删除下面的Launch Screen File值 -> 打开Images.xcassets,将图片拖入中间框中,会自动加载
或
选中项目 -> 在中间处点击"App Icons and Launch Images"中的"Launch Images Source" -> 在弹出框中选择"Images"点"Migrate按钮" -> Launch Images Source中改成LaunchImage,删除下面的Launch Screen File值 -> 打开Images.xcassets,点LaunchImage,可拖动图片放入。
方法2(iOS7上不支持):
点点LaunchScreen.xib,在中间点View,布局控件
UIScrollView使用
(1)拖动UIScrollView到中间,在内部再添加子View
(2)设置UIScrollView内容大小
self.UIScrollView引用.contentSize = self.UIScrollView子View引用.frame.size;
让UIScrollView滚动到指定位置
CGPoint point = self.UIScrollView引用.contentOffset;
point.x = point.x + 偏移量;
point.y = point.y + 偏移量;
self.UIScrollView引用.contentOffset = point; //无动画效果,直接移过去
//point可以用CGPointMake(x, y)创建一个新的
[self.UIScrollView引用 setContentOffset:point animated:YES]; //通过动画方式滚动过去
隐藏UIScrollView滚动条
self.UIScrollView引用.showsHorizontalScrollIndicator = NO; //水平滚动条
self.UIScrollView引用.showsVerticalScrollIndicator = NO; //垂直滚动条
设置UIScrollView内边距(类似android padding)
self.UIScrollView引用.contentInset = UIEdgeInsetsMake(left, top, right, bottom);
通过代理监听UIScrollView滚动事件
(1)self.UIScrollView引用.delegate = self;
(2)@interface ViewController () <UIScrollViewDelegate> //使用代理(类似java中的implements)
(3)在重写UIScrollView几个方法
//开始拖动时触发
- (void)scrollViewWillBeginDragging:(UIScrollView *) scrollView{
//处理开始拖动的代码
}
// 拖动和滚动时触发
- (void)scrollViewDidScroll:(UIScrollView *) scrollView{
//获取当前滚动位置,值为{x, y}
NSString *curOffset = NSStringFromCGPoint(scrollView.contentOffset);
}
//拖动结束时触发
- (void)scrollViewDidEndDragging:(UIScrollView *) scrollView willDecelerate:(BOOL) decelerate{
//处理拖动结束的代码
}
处理UIScrollView缩放事件
(1)返回用于缩放的UIScrollView子控件
- (UIView *) viewForZoomingInScrollView:(UIScrollView *scrollView {
return self.子控件引用;
}
(2)在viewDidLoad初始化时设置最大最小缩放比
-(void)viewDidLoad {
[super viewDidLoad];
self.UIScrollView引用.maximumZoomScale = 3.5;
self.UIScrollView引用.minimumZoomScale = 0.5;
}
(3)其他事件
//开始缩放触发
- (void)scrollViewWillBeginZooming:(UIScrollView *)scrollView withView:(UIView *)view{
}
//缩放中触发
- (void)scrollViewDidZoom:(UIScrollView *)scrollView{
}
//缩放完成触发
- (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)viewatScale:(CGFloat)scale{
}
UIScrollView设置分页效果(多张图片滚动时,拖动到一半时自动控制滚到下一页或上一页)
self.UIScrollView引用.pagingEnabled = YES; //内部根据contentSize大小实现分页
UIPageControl实现分页指示器(小圆点)
self.UIPageControl引用.numberOfPages = 总页数;
self.UIPageControl引用.currentPage = 0; //设为当前页为第1页
self.UIPageControl引用.hidesForSinglePage = YES; //只有一页时是否隐藏页码批示器,YES为隐藏,NO为否
self.UIPageControl引用.pageIndicatorTintColor = ; //其他页码颜色
self.UIPageControl引用.currentPageIndicatorTintColor = ; //当前页码颜色
NSTimer定时器(时间间隔大时使用,以秒为单位)
NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:时间间隔秒数 target:self selector:@selector(执行的方法名) userInfo:nil repeats:YES]; //启动计时器
[timer invalidate]; //停止计时器
timer = nil; //设为空
//修改timer的优先级和控件一样
NSRunLoop *loop = [NSRunLoop currentRunLoop];
[loop addTimer:self.timer forMode:NSRunLoopCommonModes];
CADisplayLink(时间间隔小时使用,以毫秒为单位)
获取顶层View的大小与位置
NSStringFromCGRect(self.view.frame);
UITableView的使用(类似android中ListView)
(1)拖动UITableView到布局中
(2)为UITableView设置UITableViewDataSource数据源(类似android中的Adapter),
首先:
代码方式:
self.tableView.dataSource = self; //在viewDidLoad方法中
或
拖线方式:
右击View Controller -> View -> 右击UITableView,在弹出框中将dataSource拖动到View Controller上。
然后:@interface ViewController () <UITableViewDataSource> //实现UITableViewDataSource方法
//重写此方法,控制列表显示几行
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return 总行数; //总共显示行数
}
//重写此方法,控制列表每组显示几行
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{ ////section表示当前组position
return 行数; //每组显示几行
}
//重写此方法,每组每行显示什么单元格内容
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *) indexPath {
//对每行View进行重用(类似android中convertView)
UITableViewCell *cell = [tableView dequeueReusableCellWithIndentifier:@"tag值"]; //标识当前行的唯一标识
if(cell == nil){ //为null就创建新的
//indexPath.section表示当前组position,indexPath.row表示当前行position
cell = [UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"tag值"]; //标识当前行的唯一标识,自定义item的View时用xib的tag值,用xib自定义item的布局时需要设置行高
}
cell.textLable.text = @"每行标题"; //UITableViewCell自带的靠上的UILablel,里面还有个UIImageView和UILable
cell.imageView.image = [UIImage imageNamed:@"图片名"];
cell.detailTextLabel.text = @"描述";
cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; //右边显示小箭头
cell.accessoryView = 自定义的View; //右边箭头改成想要的自定义View
cell.backgroundColor = [UIColor blueColor]; //设置当前行背景色
cell.selectedBackgroundView = UIView引用; //设置当前行选中背景色,需要创建选中效果的View进行赋值
return cell;
}
使用Main.storboard中的模版当作cell
(1)在Main.storboard中的UITableView上拖一个item的View,并设置identity属性为自定义tag值,并设置Class属性为继承了UITableViewCell的自定义类
(2)重写以下方法,当缓存中无此cell时会自动创建
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *) indexPath {
//对每行View进行重用(类似android中convertView),可以自定义UITableViewCell类
UITableViewCell *cell = [tableView dequeueReusableCellWithIndentifier:@"自定义tag值"]; //为上面指定的自定义tag值
//设置数据,可以自定义UITableViewCell,并将设置数据放在此类中
return cell;
}
//为每组设置头标题
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger) section {
if(section == 0){//判断当前组position来设置不同的头标题
return "头标题名";
}
}
为每组设置头View
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger) section {
static NSString *tag = @"tag名称";
UITableViewHeaderFooterView *headerV = [UITableView引用 dequeueReusableHeaderFooterViewWithIdentifier:tag]; //根据tag从缓存中获取item的组View
if(headerV == nil){
headerV = [[UITableViewHeaderFooterView alloc] initWithReuseIdentifier:tag]; //创建
}
headerV.contentView = 自定义View; //自定义View需要指定位置与宽高
//给各子View设置数据
return headerV;
}
当控件的frame发生改变时触发layoutSubviews方法
- (void)layoutSubviews{
[super layoutSubviews];
self.bounds; //(就是frame)可以获取当前View的宽高等值
}
设置每组头View高度
UITableView引用.sectionHeaderHeight = 高度值;
//为每组设置尾标题
- (NSString *)tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger) section {
if(section == 0){//判断当前组position来设置不同的尾标题
return "尾标题名";
}
}
//统一设置UITableView行高
self.UITableView引用.rowHeight = 高度值;
//设置不同行不同高度
首先:@interface ViewController () <UITableViewDelegate>
其次:
- (CGFloat)tableView:(UITableView *)tableVeiw heightForRowAtIndexPath:(NSIndexPath *)indexPath{
//根据条件返回不同的高度值
return 高度值;
}
(3)滚动时固定组标题在最上面,并隐藏状态栏
- (BOOL)prefersStatusBarHidden{
return YES;
}
UITableView常见属性
rowHeight:设置每行的高度
separatorColor:分隔线的颜色
separatorStyle:分隔线样式
值:
UITableViewCellSeparatorStyleNone; //无分隔线
tableHeaderView:列表头部View
tableFooterView:列表底部View
设置UITableView右侧索引,点击时跳到指定组(只要实现以下方法)
- (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView{
return @[@"A", @"B"]; //返回字符串数组
}
//监听UITableView的item选中方法
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
}
//刷新UITableView整个列表数据
[self.UITableView引用 reloadData];
//刷新UITableView某个组
NSIndexSet *pos = [NSIndexSet indexSetWithIndex:pos位置值];
[UITableView引用 reloadSections:pos withRowAnimation:UITableViewRowAnimationLeft]; //引处为左移动画,UITableViewRowAnimationFade为淡入淡出
//刷新UITableView局部数据
NSIndexPath *index = [NSIndexPath indexPathForRow:@"某一行tag名称" inSection:0]; //一个对象行
NSIndexPath *index = [NSIndexPath indexPathForRow:@某一行position inSection:0]; //一个对象行
[self.UITableView引用 reloadRowsAtIndexPaths:@[index] withRowAnimation:UITableViewRowAnimationAutomatic]; //刷新当前行数据
将plist文件中的资源赋值给实体类中同名的属性(plist中key名必须与属性名一致)
[self setValuesForKeysWithDictionary:dict]; //self为当前实体类对象
监听滚动事件
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollV{
...
}
使用UITableView静态单元格(数据不变的情况下使用,UITableView必须放在UITableViewController中使用)
(1)设置为静态单元格
Content属性设置为Static Cells,Style属性设置为Basic;
(2)设置组数
选中UITableView,Sections属性输入行数
(3)设置每组的行数
选中某一组,Rows属性输入行数
(4)设置单元格内容(选中某行)
Image属性输入资源中的图片名称 //设置最左边图标
Accessory属性设置为Disclosure Indicator //显示最右边小箭头
选中中间的文本框,输入指定文字
设置UITableView的FooterView
UITableView引用.tableFooterView = View引用;
设置UITableView的HeaderView
UITableView引用.tableHeaderView = View引用;
设置UITableView背景色
UITableView引用.backgroundColor = [UIColor colorWithRed:100/255.0 green:100/255.0 blue:100/255.0 alpha:1.0]; //alpha设置透明度
设置UITableView中的item不能被点击
UITableView引用.allowsSelection = NO;
UIActivityIndicatorView使用(转动加载控件)
(1)在Text->Plain中输入“加载中”的文字 //显示文字
(2)Behavior -> 选中Animating和Hides When Stopped 这两个属性 //执行动画,隐藏时停止动画
自定义控件(.m文件中)
@class MyView; //自定义控件名称
@protocol MyViewDelegate <NSobject, UIScrollViewDelegate> //定义代理协议实现的方法
@required //表示必须要实现此方法
- (void) setData:(MyView *) myView; //自定义一个代理方法
@end
@interface MyView: UIView //继承UIView
@property (nonatomic, weak) id<MyViewDelegate> delegate; //定义属性,UI控件的代理协议定义必须用weak
@end
判断当前是否已实现了代理中的方法
if([self.delegate respondsToSelector:@selector(代理方法名:)]){
//[self.delegate 代理方法:self];
}
延时执行
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(秒数 *NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
//要执行的代码
});
//让UITableView滚到指定行
NSIndexPath *index = [NSIndexPath indexPathForRow:@某一行position inSection:0]; //一个对象行
[self.UITableView引用 scrollToRowAtIndexPath:index atScrollPosition: UITableViewScrollPosition animated:YES];
//当自定义View加载完成后,这方法会被调用
- (void)awakeFromNib{
}
自定义UITableView(继承UITableView)
(1)重写initWithStyle方法,用于给item创建自定义布局
- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *) reuseIdentifier{
//给每行添加自定义控件,如
UILabel *tv = [[UILabel alloc] init];
[self.contentView addSubview:tv];
return self;
}
设置UILabel圆角
UILabel引用.layer.cornerRadius = 圆角值;
UILabel引用.masksToBounds = YES;
根据UILabel中文字的内容,动态计算UILabel的高和宽
UILabel引用.font = [UIFont systemFontOfSize:10]; //设置UILabel字体大小
NSDictionary *attr = @{NSFontAttributeName: [UIFont systemFontOfSize:10]}; //10为字体大小
CGSize size = [@"字符串" boundingRectWithSize:CGSizeMake(MAXFLOAT, MAXFLOAT) options: NSStringDrawingUsesLineFragmentOrigin attributes:attr context:nil].size; //获取文字实际占位大小
CGFloat w = size.width; //文字宽度
CGFloat h = size.height; //文字高度
UILabel引用.frame = CGRectMake(0, 0, w, h); //设置UILabel位置与宽高
UILabel自动换行
UILabel引用.numberOfLines = 0;
使用枚举定义字段
(1)定义枚举:
typedef enum {
type1 = 0,
type2 = 1
}Type
(2)在定义属性中使用:
@property(nonatomic, assign) Type type; //枚举要使用assign修饰
获取屏幕宽度
CGFloat screenW = [UIScreen mainScreen].bounds.size.width;
创建NSString分类(类似子类)
New File -> iOS Source -> Objective-C File -> 输入File名称,FileType选择Category,Class选择NSString - > Next到完成创建,可以定义并实现自定义的方法,在使用NSString时可直接调用自定义的方法
比较2个值,返回大的值
CGFloat max = MAX(CGFloat类型的值1, CGFloat类型的值1); //MAX是个宏
清空View的背景色
View引用.backgroundColor = [UIColor clearColor];
用平铺方式拉伸图片
UIImage *imgTar = [imgSrc stretchableImageWithLeftCapWidth:图片拉伸启始x的位置 topCapHeight:图片拉伸启始y的位置]; //开始xy的值为NSInteger类型,截取xy区的图片复制无数份进行平铺
设置UIButton内边距
UIButton引用.contentEdgeInsets = UIEdgeInsetsMake(left, top, right, bottom);
给UITextField(输入框)设置左边距
UIView *v = [[UIView alloc] init];
v.frame = CGRectMake(left, top, right, bottom);
UITextField引用.leftView = v; //设置UITextField左边距的View
UITextField引用.leftViewMode = UITextFieldViewModeAlways; //设置总是显示leftView
NSNotificationCenter(通知)的使用
(1)监听通知
NSNotificationCenter *nc = [NSNotificationCenter defaultCenter]; //获取通知管理对象
//name参数为nil时,监听方法会收到所有该通知对象的消息;object参数为nil时,所有名称为此name的通知都会触发监听;name和object参数都为nil时,所有消息都会触发监听
[nc addObserver:自定义监听对象引用 selector:@selector(自定义监听方法名) name:@"自定义通知名称" object:自定义通知对象引用]; //监听通知,其中自定义通知对象引用要与发送时为同个引用对象
监听方法定义示例(.h文件中):
- (void) 方法名:(NSNotification *) ni; //可以没有参数,有参数为了接收并处理发送过来的消息
监听方法实现示例(.m文件中):
- (void) 方法名:(NSNotification *)ni{
ni.name; //通知名称
ni.object; //通知对象
ni.userInfo; //通知内容,是个字典
}
(2)发送通知
NSNotificationCenter *nc = [NSNotificationCenter defaultCenter]; //获取通知管理对象
[nc postNotificationName:@"自定义通知名称" object:自定义通知对象引用 userInfo:@{@"title": @"标题", @"content": @"内容"}]; //发送一个通知
(3)移除监听(dealloc在当前对象销毁时触发)
- (void)dealloc{
[[NSNotificationCenter defaultCenter] removeObserver:self]; //必须移除,否则对象销毁后,还发送消息时会报错
}
键盘弹出回缩通知监听(键盘弹出时上推View,隐藏时下移View)
(1)监听键盘事件
NSNotificationCenter *nc = [NSNotificationCenter defaultCenter]; //获取通知管理对象
[nc addObserver:self selector:@selector(自定义监听方法名) name:UIKeyboardWillChangeFrameNotification object:nil]; //监听键弹出通知
(2)实现监听方法,平移View到键盘之上,在隐藏键盘时下移
- (void) 方法名:(NSNotification *) n{
//获取键盘的y值
CGRect rect = [n.userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue];
CGFloat keyY = rect.origin.y;
CGFloat tranformY = keyY - view引用.frame.size.height; //计算需要平移的值
view引用.transform = CGAffineTransformMakeTranslation(0, tranformY); //实现平移
}
修改键盘return键为"Send"
选中UITextField -> 点右上角属性按钮,修改Return Key值为"Send"
监听按下return键时的方法(监听UITextField)
- (BOOL)textFieldShouldReturn:(UITextField *)textField{
NSString *text = textField.text; //获取输入框的内容
return YES;
}
Toast实现(实际是普通View加入窗体中)
[[[UIApplication sharedApplication] keyWindow] addSubview:UILabel引用]; //UILabel中设置圆角效果,显示要toast的文字
KVC方式为对象属性赋值
User *user = [[User alloc] init]; //创建对象
[user setValue:@"名称" forKeyPath:@"name"]; //为User类的name属性赋值
[user setValuesForKeysWithDictionary:NSDictionary引用]; //User类的属性赋值, NSDictionary中的key名要和属性名相同
NSString *name = [user valueForKeyPath:@"name"]; //获取user中name属性的值
将对象转换为NSDictionary
NSDictionary *dict = [user dictionaryWithValuesForKeys:@[@"name"]]; //user中的属性名对应着key名,属性值对应着value
Autoresizing屏幕适配(只能设置当前View相对父View的位置,不能设置平级的View的位置,共6根线)
使用:
(1)选中View,点击右边第一个文件图标,去掉"Use Auto Layout"和"Use Size Classes"勾选。
(2)选中View,点击右边第5个小尺子图标,在Autoresizing项中,根据要求选中6根线中的一些线,
如:左线、右线、上线、下线,表示相对于父View的左、右、上、下四个方向的位置
内部中间横线表示子View随父View的宽度变化而变化
内部中间竖线表示子View随父View的高度变化而变化
代码方式设置选中状态:
子View引用.autoresizingMask = 值; //可以多个值组个用"|"连接,如"值1 | 值2"
值如下:
UIViewAutoresizingNone //没有效果
UIViewAutoresizingFlexibleLeftMargin //右线,距离右边固定值
UIViewAutoresizingFlexibleRightMargin //左线,距离左边固定值
UIViewAutoresizingFlexibleTopMargin //下线,距离下边固定值
UIViewAutoresizingFlexibleBottomMargin //上线,距离上边固定值
UIViewAutoresizingFlexibleWidth //内部中间横线
UIViewAutoresizingFlexibleHeight //内部中间竖线
(3)设置Show中的x、y值,这里的值会相对父View的值(不选中线的话,则为绝对位置)。
Autolayout自动布局(能实现Autoresizing所有的功能,设置平级的View的位置),图形操作方式
(1)选中子View,在底部中间位置点第1个按钮(Align),在弹出Add New Alignment Constralnts对话框中选中以下一个或多个值,并确定。ps:所有设置后能计算出x、y、width、height的值,否则报错。
Leading Edges //View左边对齐其他View
Trailing Edges //View右边对齐其他View
Top Edges //设置2个View顶部对齐(同时选中2个View)
Bottom Edges //设置2个View底部对齐(同时选中2个View)
Horizontal Centers //平级View水平对齐
Vertical Centers //平级View垂直对齐
BaseLines //对齐某根线
Horizontal Center in Container //在父View内部水平(左右)居中,确认View的X值
Vertical Center in Container //在父View内部垂直(上下)居中,确定View的Y值
(2)选中子View,在底部中间位置点第2个按钮(Pin),在弹出中设置固定值,点"Add num Constraints"完成设置,预览中没有更新,可以点黄色警告解决(不是必须的,可以不设置)
可以选中left(默认距离状态栏,可以点向下箭头换成距离屏幕顶部)、
top、right、 //默认左右有空白,去掉勾选"Constrain tomargins"项就解决了
bottom(可以选择距离底部导航栏或屏幕)四个方向的边距线,并在输入框中设置值,设置View距离四个边距的值
Width:View固定宽度
Height:View固定高度
Equal Widths:跟另一个View同样宽度
Equal Heights:跟另一个View同样高度
Aspect Ratio:比例
Align:可选择哪种对齐方式(步骤1中的几个值)
(3)选中子View,在底部中间位置点第3个按钮(Resolve Auto Layout Lssues),用于解决一些自动布局的问题(不是必须的,可以不设置,用于清楚设置等)
(4)修改上面设置的约束
在左边选中Constrains内部某条约束,点右上角属性小图标,以下为说明:
First Item表示第一个View
Relation表示约束条件,如Equal
Second Item表示第二个View
Constant默认为0,可以修改此值实现位置偏移
Priority表示优先级
Multiplier表示倍数默认1,第1个View是第2个View的几倍,如0.5则为一半,
公式:第1个View的x = (第2个View + Constant) * Multiplier
公式:第2个View的top = (self.top + Constant) * Multiplier
Autolayout自动布局(能实现Autoresizing所有的功能,设置平级的View的位置),代码方式
(1)禁用autoresizing
View引用.translatesAutoresizingMaskIntoConstraints = NO;
(2)创建约束
View1的参数1 =
NSLayoutConstraint *lc = [NSLayoutConstraint constraintWithItem:View1引用 attribute:View1的参数 relatedBy:NSLayoutRelationEqual
toItem:View2引用 attribute:View2参数
mutiplier:值 constant:值]; //mutiplier表示倍数默认1,第1个View是第2个View的几倍,如0.5则为一半,Constant默认为0,可以修改此值实现位置偏移
attribute值列表如下:
NSLayoutAttributeLeft //左侧
NSLayoutAttributeRight //右侧
NSLayoutAttributeTop //上方
NSLayoutAttributeBottom //下方
NSLayoutAttributeLeading //首部
NSLayoutAttributeTrailing //尾部
NSLayoutAttributeWidth //宽度
NSLayoutAttributeHeight //高度
NSLayoutAttributeCenterX //X轴中心
NSLayoutAttributeCenterY //Y轴中心
NSLayoutAttributeBaseLine //文本底标线
NSLayoutAttributeNotAnAttribute //没有属性
(3)给View添加约束
[View引用 addConstraint:lc]; //给View自已添加约束
[self.view addConstraint:lc] //父View添加约束(非自身约束都要添加到父View)
基于Autolayout的动画
(1)拖动Constraints中某个约束到ViewController代码编辑器中,Connection为Outlet,输入名称,Type为NSLayoutConstraint
@interface ViewController()
//拖到此处
@property (weak, nonatomic) IBOutlet NSLayoutConstraint *lc;
@end
(2)动画改变constant的值
self.lc.constant += 数值; //修改约束值,还没有重新计算
[UIView animateWithDuration:1.0 animations:^{
[UIView引用 layoutIfNeeded]; //动画执行,根据新的约束值重新计算赋值frame
}];
Size Classes对屏幕进行分类(实现在不同分辨率下不同位置,最底部中间"wAny hAny"选项点开后可以看到9类屏幕分类)
9类屏幕:
wAny和hAny:任意尺寸
wCompact和hCompact:iphone的3.5寸、4寸、4.7寸横屏
wAny和hCompact:iphone所有横屏
wReqular和hCompact:iphone的5.5寸横屏
wReqular和hAny:iPad竖屏或横屏
wCompact和hAny:iphone的3.5寸、4寸、4.7寸竖屏或横屏
wCompact和hReqular:iphone所有竖屏
wAny和hReqular:iphone所有iphone竖屏或iPad横屏或竖屏
wReqular和hReqular:iPad竖屏或横屏
使用:
(1)拖动View到布局中,选中此View。
(2)最右上角属性图标中,拉最底下,点击"installed"左边有个"+",新建一个对应屏幕类型的"installed",默认是Any屏幕下的。
(3)最底部中间"wAny hAny"选项点开后可以看到9类屏幕分类,选中某个屏幕类型,设置控件Autolayout属性。
设置UILabel在不同屏幕分辨率下不同字体大小
选中View,最右上角属性图标中,点击Font前面的"+",选中对应屏幕类型,在新建字体中设置字体大小。
设置UIImageView在不同屏幕分辨率下显示不同图片
选中Images.xcassets,选中中间图片所在的item,在Width和Height中选择其他屏幕类别,然后将新图片拖到新增的空缺处。
当控件被挤压时控制优先级:
小尺子按钮,Content Hugging Priority和Content Compression Resistance Priority中设置优先级。
调试View的层次结构:
最下面,点击第7个书本图标