Part one
***************************************************************************************************
一、定时器的使用
(1)创建定时器
NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(exchange) userInfo:nil repeats:YES];
a.第一参数:每次时间跳动的时间间隔
b.第二个参数:目标
c.第三个参数:每次时间跳动时执行的方法
(2)停止定时器
a.先判断定时器是否在工作状态
[timer isValid],采用实例方法判断定时器是否工作
b.停止定时器
[timer invalidate],采用实例方法停止定时器
c.把定时器置为nil
timer = nil;野指针的预防;
(关于animation在for循环中使用,同时执行的问题?解决方式:采用数组+递归思想)需思考
原因:animation方法在for循环中并不是执行2秒,而是将animation线程放入runLoop里面,即for与animation执行的线程是不一样的,同时for循环执行的太快导致
看上去的效果就是一起执行animation;
二、UIButton的使用
一个UIButton有由一个lable与一个image view组成,所以button可以设置文字也可设置图片
(1)概述:
UIButton直接继承于UIControl,UIControl继承于UIView,UIView继承于NSobject,UIControl类的基本作用,添加了状态和事件
(2)基本使用
a.创建
可以使用类方法,buttontype 系统提供4种基本的类型,如需要插入图片,必须设定为custom
b.button的4种状态
UIControlStateNormal 正常
UIControlStateDisabled 禁用
UIControlStateHighlighted 高亮
UIControlStateSelected 选择
c.设置标题
settitle方法(title.lable.text权限为只读状态)
d.使能开关与设置选择状态
.selected与.enabled
e.设置主题颜色、背景图片、图片
.tintcolor、backgroundimage、image
f.点击事件的添加(event!!!)(异步编程模式)
四种点击状态
UIControlEventTouchUpInside
UIControlEventTouchUpOutside
UIControlEventTouchDragInside
UIControlEventTouchDragOutside
g.关于图片
系统支持png与jpg两种格式,不支持gif动态图片,
注:UIImage与UIImageView的区别:
uiimage为图片类,不能显示图片,UIimage直接继承于NSObject,而UIImageView直接继承UIView
h.backgroundimage与image属性的区别:
1.background 伸缩图片, image只有小于图片时伸缩
2.background 文字浮于图片上方
image 文字和图片水平并列
三、UILable的使用
(1)概述:
UILable直接继承于UIView,用于文本的显示
(2)属性的使用
a.font
//设置系统的字体大小 默认大小事 17 磅 PI 一磅=1.33(4/3)像素
lable.font = [UIFont systemFontOfSize:34];
lable.font = [UIFont fontWithName:@"Times New Roman" size:34];
//设置字体为粗体
lable.font = [UIFont boldSystemFontOfSize:34];
//设置斜体
lable.font = [UIFont italicSystemFontOfSize:34];
b.折行模式(默认word)
lineBreakMode属性,可以设置为以char方式
c.自动换行属性(默认1)
numberoflines 设置为0(无穷)为自动换行
d.自适应大小
根据一个字体大小,改变lable大小 sizetofit
根据一个lable的大小,改变字体大小,adjustsfontsizetofitwidth,如大小足够 字体不会变小
e.自适应的内部实现(根据文字内容设置大小)
//根据文字内容计算大小 height上限 6个ipad的宽度 大概1024*8(sizetofit内部实现)
//第一个参数 设置上限的尺寸
//第二个参数 换行设置
//第三个参数 设置字体
//第四个参数 预留 nil
CGRect rect = [string boundingRectWithSize:CGSizeMake(350, 2000) options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:17]} context:nil];
NSLog(@"%@",NSStringFromCGRect(rect));
CGRect textLableRect = textLable.frame;
textLableRect.size.width = rect.size.width;
textLableRect.size.height = rect.size.height;
textLable.frame = textLableRect;
Part Two
***************************************************************************************************
一、tag值的注意点
(1)tag值在同一父视图中,必须唯一
(2)tag值在不同父视图当中,可以相同
(3)根据tag值选中控件的时候,需用父视图进行调用
二、图片的停靠模式
设置属性:imageView.contentMode = UIViewContentModeTop;
系统提供四种停靠模式:
UIViewContentModeScaleToFill 填满视图(默认)
UIViewContentModeScaleAspectFit 按比例伸缩
UIViewContentModeScaleAspectFill 按比例充满屏幕
UIViewContentModeTop 居顶部靠齐
三、动画播放
animation的实现注意点:
步骤:设置播放对象-》设置播放时间-》设置播放循环次数-》开启动画-》停止动画
(1)图片需加入到一个数组当中
(2)设置动画的一些属性:时间、播放循环次数(默认为0,0为正无穷大)
四、textField的基本使用
(1)设置边框样式
.borderStyle = UITextBorderStyleRoundedRect
(2)设置提示文本
.placeholder = @“请输入账号”
(3)设置清楚按钮
.clearButtonMode = UITextFieldViewModeAlways
(4)设置开头字母大小写
.autocapitalizationType = UITextAutocapitalizationTyoeNone
(5)设置键盘
.keyboardType = UIKeyboardTypeURL;
(6).设置return键
.returnKeyType = UIReturnKeySearch
(7)密文设置
.secureTextEntry = YES
(8)设置代理
遵守代理协议 -》设置代理textField.delegate = self -》实现代理方法(以下abcde)
a.是否可以开始编辑
- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField
b.开始进入编辑状态
- (void)textFieldDidBeginEditing:(UITextField *)textField
c.是否可以结束编辑
- (BOOL)textFieldShouldEndEditing:(UITextField *)textField
d.进入结束编辑的状态
- (void)textFieldDidEndEditing:(UITextField *)textField
e.点击return按钮的时候
- (BOOL)textFieldShouldReturn:(UITextField *)textField
Part three
***************************************************************************************************
一、UIViewController学习
(1)MVC(model View Controller)
视图控制器是应用程序数据和其视觉外形之间的一个至关重要的链接
model主要指前期OC部分
view指向用户展示的部分
Controller指视图控制器,对视图进行管理
(2)在appDelegate中需要对UIViewController进行子类化
即创建一个类,继承于UIViewController
(3)僵尸对象(zombie object)
提前释放内存的对象为僵尸对象
(4)iOS内置的shi'tu视图控制器类
导航控制器(UINavigationController)、标签控制器(UITabbarController)和表视图控制器(tableViewController)
(5)本身具有一个根视图(view)
(6)Screen、window、view的关系
screen-》window-》view
UIScreen是链接物理屏幕的对象
window是为UIScreen对象提供一个画布
UIview则显示对应的内容
(7)视图控制器的生命周期
alloc/init -》load view -》viewdidload -》viewwillappear -》viewdidappear -》viewwilldisappear -》viewdiddisappear ->dealloc
注意点:
a.在init的时候根view并没有被创建,后续正常情况下view地创建在load view的时候进行创建,如在init后load view前使用了view,系统此时会创建出view
b.根controller只被加载一次,原因:根controller在app当中持有,未被释放,而后续创建的controller都被释放,对此在对根controller的代码需注意生命周期
二、模态跳转
(1)应用场景:
需产生临时界面时,使用模态跳转
(2)特点:1对1 present ——dismiss
三、代理反向传值
//通过代理进行反向传值
// A -> B A被代理 B代理
/*
1. 代理:main 被代理: sub
2. 被代理:
1) 声明协议
2) 添加代理属性
3) 在必要的地方传值
3. 代理
1) 遵循协议
2) 实现协议
3) 设置代理
*/
注:在必要地地方传值的时候需注意,确认代理属性是否为空,且代理方法是否实现
四、系统单例传值
AppDelegate *dele = [UIApplication sharedApplication].delegate;
Part four
***************************************************************************************************
一、手势
离散手势状态(枚举):
离散型手势
UIGestureRecognizerStatePossible
UIGestureRecognizerStateEnded
UIGestureRecognizerStateCancelled
UIGestureRecognizerStateFailed
连续手势状态(枚举):
UIGestureRecognizerStatePossible 手势可以被识别
UIGestureRecognizerStateBegan 手势开始被识别
UIGestureRecognizerStateChanged 手势发生变化
UIGestureRecognizerStateEnded 手势识别结束
UIGestureRecognizerStateCancelled 手势取消
UIGestureRecognizerStateFailed 手势识别失败
注:先确认手势的状态,在一定的状态下编写代码(属性.state)
(1)点击手势(离散型)
UITapGestureRecognizer
设置最小点击数:.numberOfTapsRequired默认0
设置最小触摸数:.numberOfTouchesRequired默认1
(2)长按手势(连续型)
UILongPressGestureRecognizer
设置最小长按事件:.minimumPressDuration默认0.5
设置触摸可移动半径距离:.allowableMovement 默认10个点
(3)滑动手势(离散型)
UISwipeGestureRecognizer
设置滑动方向(重要属性):.direction = UISwipeGestureRecognizerDirectionLeft
(4)拖动手势(连续型)
UIPanGestureRecognizer
重要属性:.point
例子:
CGPoint point = [pan locationInView:pan.view.superview];
static CGPoint startPoint;
static CGPoint startCenter;
if (pan.state == UIGestureRecognizerStateBegan)
{
//开始状态
startPoint = point;
startCenter = pan.view.center;
}
else if (pan.state == UIGestureRecognizerStateChanged)
{
CGFloat dx = point.x - startPoint.x;
CGFloat dy = point.y - startPoint.y;
CGPoint currentCenter = CGPointMake(startCenter.x + dx, startCenter.y + dy);
pan.view.center =currentCenter;
}
(5)旋转手势(连续型)
UIRotationGestureRecognizer
重要属性:.rotation
rotate.view.transform = CGAffineTransformMakeRotation(rotate.rotation);
(6)伸缩手势(连续型)
UIPinchGestureRecognizer
重要属性.scale
pinch.view.transform = CGAffineTransformMakeScale(pinch.scale, pinch.scale);
二、其余基本控件的使用方式及重要属性
(1)单选栏
UISegmentedControl *segment = [[UISegmentedControl alloc]initWithFrame:CGRectMake(50, 50, 100, 50)];
[segment insertSegmentWithTitle:@"男" atIndex:0 animated:YES];
[segment insertSegmentWithTitle:@"女" atIndex:1 animated:YES];
//主题颜色
segment.tintColor = [UIColor lightGrayColor];
//当前下表
segment.selectedSegmentIndex = 1;
//添加事件(重要)
[segment addTarget:self action:@selector(onSegment:) forControlEvents:UIControlEventValueChanged];
//获取指定下标的标题
NSString *str = [segment titleForSegmentAtIndex:segment.selectedSegmentIndex];
(2)滑块
UISlider *slider = [[UISlider alloc]initWithFrame:CGRectMake(10, 200, 300, 30)];
//设置最大值 默认是1
slider.maximumValue = 10;
//设置最小值,默认是0
slider.minimumValue = 0;
//设置当前值
slider.value = 0.5;
//添加事件
[slider addTarget:self action:@selector(onSlider:) forControlEvents:UIControlEventValueChanged];
(3)进度条 (数值0~1.0)
UIProgressView *progressView = [[UIProgressView alloc]initWithFrame:CGRectMake(10, 250, 300, 30)];
progressView.progress = 0.35;
progressView.progressViewStyle = UIProgressViewStyleBar;
progressView.trackTintColor = [UIColor blackColor];
progressView.progressTintColor = [UIColor redColor];
[self.view addSubview:progressView];
(4)开关控件
UISwitch *sw = [[UISwitch alloc]initWithFrame:CGRectMake(50, 300, 10, 10)];
sw.tintColor = [UIColor blackColor];
sw.onTintColor = [UIColor whiteColor];
sw.thumbTintColor = [UIColor blackColor];
[sw addTarget:self action:@selector(onSwitch:) forControlEvents:UIControlEventValueChanged];
[self.view addSubview:sw];
[sw isOn];
(5)等待进度指示器
UIActivityIndicatorView *activeView = [[UIActivityIndicatorView alloc]initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];
activeView.frame = CGRectMake(50, 350, 10, 10);
//停止的时候是否隐藏,默认yes
activeView.hidesWhenStopped = NO;
[activeView startAnimating];
[self.view addSubview:activeView];
(6)计步器
UIStepper *stepper = [[UIStepper alloc]initWithFrame:CGRectMake(50, 400, 50, 50)];
//最大值
stepper.maximumValue = 10;
//最小值
stepper.minimumValue = 5;
//当前值
stepper.value = 6;
//步距
stepper.stepValue = 2;
//添加事件
[stepper addTarget:self action:@selector(onStepper:) forControlEvents:UIControlEventValueChanged];
(7)//日期选择器
UIDatePicker *datepicker = [[UIDatePicker alloc]initWithFrame:CGRectMake(0, 450, 300, 200)];
//设置样式
datepicker.datePickerMode = UIDatePickerModeDate;
[datepicker addTarget:self action:@selector(onDatePicker:) forControlEvents:UIControlEventValueChanged];
[self.view addSubview:datepicker];
#pragma mark - 日期选择器
- (void)onDatePicker:(UIDatePicker *)datePicker{
NSDate *date = datePicker.date;
//nsdate ->nsstring
NSDateFormatter *formatter = [[NSDateFormatter alloc]init];
[formatter setDateFormat:@"yyyy-MM-dd"];
NSString *string = [formatter stringFromDate:date];
NSLog(@"%@",string);
}
Part five
***************************************************************************************************
一、导航控制器(导航栏高度44)
(1)概念
有层级关系的多个视图控制器之间的推入(push)和弹出(pop),它的基类是UIViewController,
以栈的形式来管理视图控制器
基栈:第一个入栈的对象
栈顶:最后一个入栈的对象
注:栈是一种数据结构,采用hou后进先出(LIFO)的原则
(2)基本样式(UINavifationController)
导航栏(UINavigationBar)、内容控制器视图(UIViewController)、工具栏(UIToolBar)
注:
a.UINavigationBar有四部分(UIBarButtonItem与UINvigationBar同级)包括,backBarButton、title、rightBarButtonItem、 leftBarButtonItem
(3)导航控制器的容器(NSArray)属性
.viewControllers存放存入栈中的对象
注:导航控制器始终显示栈顶的对象
(4)title属性的设置
self.title 等价于 self.navigationController.navigationItem.title
(5)主题颜色
.navigationController.navigationBar.tintColor
(6)UIBarButtonItem
Part six
***************************************************************************************************
一、UIScrollerView使用
(1)概述
为什么使用UIScrollView?
当需要显示的内容在固定区域内,无法显示完,需要分屏显示
(2)设置内容大小
.contentSize 是一个CGSize
(3)支持分页
.pagingEnabled = YES
(4)弹簧效果
.bounces = NO
(5)设置偏移量
.contentoffset
(6)设置水平垂直滚动条
.showhorizontalscrollindicator = NO
(7)代理
//2.当scrollView滚动时调用,(会调用多次)
- (void)scrollViewDidScroll:(UIScrollView *)scrollView;{
NSLog(@"%@",NSStringFromCGPoint(scrollView.contentOffset));
}
//1.滑动一次有效距离,执行一次
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView{
NSLog(@"%s",__func__);
}
//3.一次有效滑动,且手指离开时
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate{
// NSLog(@"%s",__func__);
}
//4.当开始减速的时候调用
- (void)scrollViewWillBeginDecelerating:(UIScrollView *)scrollView{
NSLog(@"%s",__func__);
}
//5.当结束减速的时候调用
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView{
// NSLog(@"%s",__func__);
_pageControl.currentPage = scrollView.contentOffset.x /screenW;
}
二、UIPageControl
(1)page的页数
.munberogpages
(2)设置pageControl的主题颜色和点的颜色
pageControl.currentPageIndicatorTintColor = [UIColor purpleColor];
pageControl.pageIndicatorTintColor = [UIColor yellowColor];
Part seven
***************************************************************************************************
一、UITableView的使用
(1)概述
UItableView继承于ScrollView,只要是可滑动的控件,都继承于ScrollView,一个tableView里面基本包含有段头,段尾,行,cell
(2)两个协议
a.协议
该协议主要管理的是整个tableView当中的架构文字
加载数据方面的协议主要有两个必须实现的方法(行数,与cell)和三个可选择的方法(组数(默认是1),设置段头文字,设置段尾文字),以及几个编辑状态的方法
//设置每一段的行数
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
//设置cell
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
//设置段数(默认1段)
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
//设置段头文字
- (nullable NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
//设置段尾文字
- (NSString *)tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section
需注意的editing部分协议方法
//确认是否可编辑
- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath;
//确认是否可移动
- (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath;
//根据编辑状态确认处理方式
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
//如可以移动,移动的代理方法
- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)sourceIndexPathtoIndexPath:(NSIndexPath *)destinationIndexPath
b.协议
该协议主要实现的是对tableView进行操作的一些方法
//段头的高度
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
//段尾的高度
- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section
//设置段头的视图
- (nullable UIView *)tableView:(UITableView *)tableView viewForHeaderInSection(NSInteger)section
//设置段尾的视图
- (nullable UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section
//定制删除的文字
- (NSString *)tableView:(UITableView *)tableView titleForDeleteConfirmationButtonForRowAtIndexPath:(NSIndexPath *)indexPath
Part eight
***************************************************************************************************
一、tableView中cell的复用
原始的复用(复用方法一)
(1)通过标记查找可复用的cell
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];
(2)如复用池中没有自己需要的cell则需要自己进行创建
if (cell == nil) {
cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:identifier];
}
注:cell的复用能有效地优化内存
原始的复用(复用方法二):使用注册
//注册cell
//纯代码自定义的cell
//[tableView registerClass:<#(nullable Class)#> forCellReuseIdentifier:<#(nonnull NSString *)#>]
//xib自定义的cell(方法二)
[tableView registerNib:[UINib nibWithNibName:@"CustomCell" bundle:nil] forCellReuseIdentifier:@"MyCell"];
二、MVC模式
注意进行封装时,对象的所属情况;
三、tableviewcell的自定义方式:
(1)创建一个类继承于uitableviewcell,同时创建xib,
(2)在xib上定义自己需要的控件或视图,并对齐连线
(3)在tableview中创建cell的时候进行导入
Part nine
***************************************************************************************************
一、UITabBarController
注意问题点:
a.tabbar的循环嵌套
一般我们会采取在适当的时候隐藏其中一个UINavigationBar,但是很多人都会碰到两个问题:
1.如何隐藏最外围的那个UINavigationBar
2.点击里面的那个UINavigationController里面的UINavigationBar上面的home按钮,如何push返回到最外围的那个主视图
解决方法:
系统提供的tabbar
(1)概述
UITabBarController的管理模式为平行管理,也属于树形结构管理,属于controller的子类
(2)创建
UITabBarController *tabVc = [[UITabBarController alloc]init];
(3)tabBarController管理控制器
UIViewController *one = [[UIViewController alloc]init];
one.tabBarItem = [[UITabBarItem alloc]initWithTitle:@“xxx” image:[UIImage imageNamed:@“xxx”] tag:x];
自定义的tabbar
(4)自定义tabbar
a.隐藏原先系统的tabbar
b.设置tabbaritems
c.设置viewControllers
d//3.设置初始化选中的控制器即对应的tabBarItem
self.selectedIndex = 0;
NSInteger index = [self.viewControllers indexOfObject: self.selectedViewController];
self.myTabBar.selectedItem = self.myTabBar.items[index];
(5)代理(找到选中的那个item)
- (void)tabBar:(UITabBar *)tabBar didSelectItem:(UITabBarItem *)item
{
NSLog(@"%@", tabBar.selectedItem);
NSInteger selectedIndex = [tabBar.items indexOfObject:item];
self.selectedViewController = self.viewControllers[selectedIndex];
}
Part ten
***************************************************************************************************
一、SB的使用方式(自己实践)
二、UICollectionView的使用方式
(1)流水布局
a.定义
UICollectionViewFlowLayout *flowLayout = [[UICollectionViewFlowLayout alloc]init];
b.设置布局的最小行间距
.minimumLineSpacing = 20;
c.最小的列间距(当不满足时,CollectionView会自动调整)
flowLayout.minimumInteritemSpacing = 10;
d.cell的大小
flowLayout.itemSize = CGSizeMake(100, 100);
e.滚动方向
flowLayout.scrollDirection = UICollectionViewScrollDirectionVertical;
f.header的大小(根据滚动的方向不同,其中宽和高只有一个有效)
flowLayout.headerReferenceSize = CGSizeMake(100, 80);
flowLayout.footerReferenceSize = CGSizeMake(100, 120);
g.段边距
flowLayout.sectionInset = UIEdgeInsetsMake(10, 10, 10, 10);
(2)UICollectionView的创建
a.三个代理
参考tableView
b.自定义collectioncell
参考tableViewCell