iOS:iOS笔记

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个书本图标

猜你喜欢

转载自blog.csdn.net/a526001650a/article/details/73862817
ios
今日推荐