1、登录(文本输入、按钮交互、基于网络的交互)
2、刷新界面:(表视图)
1>小部分应用程序数据来源于本地
2>更多的应用程序数据来源于网络:(下载:10Mb)
(1)通过URL访问数据
(2)获取数据(Data)—>序列化数据(JSON,XML)
3>通过数据来决定UI显示内容
3、响应相应业务逻辑(用户交互……)
————————————
多线程—>线程—>进程(一个应用程序一般情况下只有一个进程,多核情况下有多个进程)(Chrome可以模拟使用多个进程)
线程:一个线程就是一段CPU操作的指令集
主线程:进程的主要线程(一个进程有且仅有一个主线程)
作用:UI显示(只能在主线程上做)+ 用户交互
多线程技术:在一个进程中 调度多条线程
作用:开启一个子线程(不是主线程的线程)来做耗时的事情,比如网络下载
————————————————————————
iOS 的多线程技术(4种)
1.pThread 跨平台的C语言——几乎不用
2.NSThread
1> 创建线程,需要手动调用[t start];
2> 创建线程, 直接进入子线程入口方法detachNewThread……….
3> 隐式创建[self performSelectorInBackground:withObject:];
3.GCD
1> iOS4.0之后可以使用
2> 派遣队列(队列任务),FIFO:先进先出
变量类型:dispatch_queue_t
获取方式:
(1)dispatch_get_global_queue(x, 0)(并行队列,有四种优先级)
(2)dispatch_get_main_queue()(串行队列,在主线程上执行任务的队列)
(3)dispatch_queue_create(“名称”, 类型)(NULL即为串行)
(1)串行队列:任务在队列中等待执行,一次只能执行一个任务
(2)并行队列:任务在队列中等待执行,一次可以执行多个任务
额外:(3)主队列:其实是一个特殊的串行队列,所有的任务都在主线程上执行
3>任务
(1)同步执行:sync(会堵塞当前线程,直到队列中的任务完成之后再继续)
(2)异步执行:async(不会堵塞当前线程,直接执行)
4>队列使用的死锁问题
在主队列中同步添加任务
由于同步添加,堵塞了当前线程(主线程),然后将任务放到队列中去等待执行
只有等到主线程中的操作执行完成之后,添加的任务才会继续执行
由于主线程被还没有结束的任务堵塞,block中的任务执行不了。一直堵塞,主线程卡死
慎用同步添加
—————————————————————————————
1.一个应用程序有一个进程(错)一个应用程序可以有多个进程
2.一个CPU可以同一时间做多件事情(错)一个CPU同一时间只能做一件事情,来回调度
队列类型:
DISPATCH_QUEUE_SERIAL串行当类型设置空,默认是串行
DISPATCH_QUEUE_CONCURRENT并行
创建队列:(1).dispatch_queue_t myQueue = dispatch_queue_create(队列的名字,对列类型)
(2)获取全局队列:dispatch_queue_tglobalQueue= dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT(优先级),0);
*@param identifier优先级
define DISPATCH_QUEUE_PRIORITY_HIGH最高
define DISPATCH_QUEUE_PRIORITY_DEFAULT默认
define DISPATCH_QUEUE_PRIORITY_LOW较低
define DISPATCH_QUEUE_PRIORITY_BACKGROUND 后台(最低)
(3)获取主队列:dispatch_queue_tmainQueue= dispatch_get_main_queue();
同步添加:dispatch_sync(队列,Block)
异步添加:dispatch_asyne(队列,Block)
并行队列(全局队列)异步添加任务不堵塞当前队列(肯定开启线程),做多个任务\
串行队列(主队列)异步添加任务不堵塞当前队列,做单个任务(主线程进行回调)
GCD 队列组一般将多个耗时任务 在子线程中执行,在主队列中 执行汇总任务
创建组:dispatch_group_tgroup= dispatch_group_create();
dispatch_group_async(group, queue, ^{
*@param group#> 组 description#>
*@param queue#> 队列 description#>
*@param void任务
});
*不堵塞当前线程。在组的 所有任务完成之后,到指定的队列 执行汇总任务
*
*@param group组
*@param queue#> 指定的队列 description#>
*@param void汇总任务
*
*/
//dispatch_group_notify(group, dispatch_get_main_queue(), ^{
//NSLog(@"----任务 完成----- %@", [NSThread currentThread]);
[NSThread sleepForTimeInterval:3];线程睡眠
// Alert 提示用户 全部数据加载完成
//});
// 永久等待,直到组里的任务全部完成
//dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
9月2日NSOperationQueue:队列的多线程
NSOperation是苹果对GCD的封装,完全面向对象!OOP,是一个抽象类
NSoperation :
(1)创建操作对象:NSInvocationOperation *operation = [[NSInvocationOperation alloc]initWithTarget: self selector: @selector(方法) object:nil];创建后必须手动运行![operation start];
( 2 )创建Block 对象 :NSBlockOperation *blockOperation = [NSBlockOperation nlockOperationWithBlock :^{
执行的东西创建后必须手动运行![operation start];
}];
NSOperationQueue: 对列
NSOperationQueue:(1)创建:NSOperationQueue *queue = [[NSOperationQueue alloc]init];
(2).①.向队列中添加操作:NSOperation * operation = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"下载任务1 %@", [NSThread currentThread]);
}];3.添加到队列[queue addOperation:operation];
②. 向队列中添加操作:[queue addOperationWithBlock:^{
NSLog(@"下载任务1 %@", [NSThread currentThread]);
}];
(3).控制最大的可行数:queue.maxConcurrentOperationConunt = 1;可以用来限制可行的出口
(4).设置其依次出来的次序:// 添加到队列之前,设置操作的依赖关系
#warning 切记不要互相依赖,会导致互相等待
[op2 addDependency:op1];// 操作2依赖操作1
[op3 addDependency:op2];
// 创建任务队列,加入任务
NSOperationQueue * queue = [[NSOperationQueue alloc] init];
[queue addOperations:@[op1, op2, op3] waitUntilFinished:NO];
9月3日NSMautableURLRequest. NSURLSession. NSURLSessionDataTask. NSURLSessionConfiguration. NSURLSessionDownloadTask.NSURLSessionUplaodTask.抓包:
1.NSMautableURLRequest:其主要是发起请求网络{ 其属性有
-.创建:NSMutableURLRequest * request = [NSMutableURLRequest requestWithURL:url];
①.requst.HTTPMethod =@“POST 或GET”主要用于给出请求网络的方式
②.requst.HTTPBody =请求体:主要用于访问网络搜索的内容
③. request.timeoutInterval=30;:请求超时
④.[request setValue:@"value1" forHTTPHeaderField:@"key1”];请求头}
2.NSURLSession:是网络接口并且是单例,具有3个属性一个配置,并且3个属性都在冰冻中无法使用必须用resume解冻{
①.NSURLSessionDataTask:用于接收网络的内容
②.NSURLSessionDownladTask:用于下载网络文件
③.NSURLSessionUploadTask:用于上传文件
配置:NSURLSessionConfiguration:用于给上传和下载或接收内容配置网络请求
}
2.抓包:抓包是一个程序员必备技能:{
①.下载Chelas软件,并安装
②.将CHelas里Proxy选项里的Proxy Settings..里的Port的值进行修改,如果在途中遇见弹窗看清楚,如果没有All开头的一律点蓝色的,如果有All开头的点击All
③.将手机连入本机自带的WIFI中,将手机上的HTTP代理改为手动,并将代理服务器的名字改为Mac电脑的IP地址,并将代理服务器端口改为和CHelas里Proxy选项里的Proxy Settings..里的Port的值改为一样
④.打开手机的任意一样软件进行抓包
}
例:请求网络数据内容{
//1.创建接口
NSMutableURLRequest *requst = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"http://apis.juhe.cn/cook/query.php"]];
//2.设置访问方式
requst.HTTPMethod = @"POST";
//3.输入要搜索的字符
NSString *str =@"menu=西红柿炒鸡蛋&dtype=&pn=&rn=&albums=&=&key=aedc3713d18784a823120e8ace847ed9";
//4.将字符转化为NSData格式并转化为UTF8
requst.HTTPBody = [[str stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]dataUsingEncoding:NSUTF8StringEncoding];
//创建网络接口
NSURLSession *urlSession = [NSURLSession sharedSession];
//创建基于网络接口----接收的内容
NSURLSessionDataTask *dataTask = [urlSession dataTaskWithRequest:requst completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
//判断请求是否失败
if (error) {
NSLog(@"请求失败%@",error);
}else{
//接收并打印内容
NSString *string = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"%@",string);
}
}];
//请求接收内容解冻
[dataTask resume];
}
例:请求下载并监听下载进度{
// 1.URL
NSURL * url = [NSURL URLWithString:@"http://sw.bos.baidu.com/sw-search-sp/software/441142fc7c4/googlechrome_mac_50.0.2661.102.dmg"];
// 2.获取配置对象
NSURLSessionConfiguration * configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
// 3.代理回调并创建队列
NSURLSession * session = [NSURLSession sessionWithConfiguration:configuration delegate:self delegateQueue:[NSOperationQueue mainQueue]];
// 4.创建下载任务
NSURLSessionDownloadTask * downloadTask = [session downloadTaskWithURL:url];
// 5.开始下载
[downloadTask resume];
下面是代理的方法
#pragma mark - 代理
// 下载完成之后的回调
- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask
didFinishDownloadingToURL:(NSURL *)location {
// location指定的temp文件夹中的内容只是临时的
// 把文件保存到指定位置
// 1.需要保存路径
NSString * filePath = [NSHomeDirectory() stringByAppendingPathComponent:@"Library/Caches/Chrome.dmg"];
NSFileManager * fileManager = [NSFileManager defaultManager];
NSURL * fileURL = [NSURL fileURLWithPath:filePath];
// 初始化一个error
NSError * error1;
// 返回值表示,是否拷贝成功
BOOL flag = [fileManager copyItemAtURL:location toURL:fileURL error:&error1];
if (flag) {
NSLog(@"文件保存成功,保存在%@", filePath);
} else {
NSLog(@"文件保存失败 %@", error1);
}
}
// 这个协议方法也会不停的被调用,每下载一个数据包,都会回调并写入
- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask
didWriteData:(int64_t)bytesWritten
totalBytesWritten:(int64_t)totalBytesWritten
totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite {
NSLog(@"%@", [NSThread currentThread]);
// 这一次写入磁盘的数据大小
NSLog(@"bytesWritten : %lld", bytesWritten);
// 总共写入了多少
NSLog(@"totalBytesWritten %lld", totalBytesWritten);
// (期待写入)一共要写入多少,总大小
NSLog(@"totalBytesExpectedToWrite%lld", totalBytesExpectedToWrite);
NSLog(@"--------------------------");
double progress = totalBytesWritten / (double)totalBytesExpectedToWrite;
NSLog(@"%f", progress);
// 这里是在主线程刷新UI,没问题
self.progress.progress = progress;
}
}
9月5日开源框架AFNetworking(网络框架)AFHTTPSessionManager.MBProgressHUD(开源刷新框架)
1.AFHTTPSessionManager{是一个单例
〇.写出请求的地址
①.创建AFHTTPSessionManager(也是获取网络会话管理):AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
②.设置请求数据的序列化方式(常见的有Form表单【&】、JSON【字典】)
③.设置数据的序列化方式:【1】.使用&拼接的方式:manager.requstSerializer= [AFHTTPRequestSerializer serializer];【2】.使用JSON的方式:manager.requstSeralizer = [AFJSONRequestSerializer serializer];
④.设置接受相应数据的序列化方式:manager.responseSerializer = [AFHTTPResponseSerializer或AFJSONResponseSerializerserializerWithReadingOptions:有5种格式{*响应数据类型:
*JSON格式:AFJSONResponseSerializer默认是这个类型
*XML:AFXMLParserResponseSerializer
*图片数据:AFImageResponseSerializer
*属性列表:AFPropertyListResponseSerializer
*不解析:AFHTTPResponseSerializer
}];
⑤.发起网络请求:[manager GET或POST:(接口地址)pramaeters:(用于传输请求的参数)success:^{responseObject是请求的数据—请求成功后的回调} failure:^{请求失败的回调}];
}
2.MBProgressHUD{是一个用来显示刷新的开源框架
①.
}
例:请求网络数据{
//请求网络的地址
NSString * str = @"http://v.juhe.cn/weather/index?format=2&cityname=新余&key=7f86b53e22db85d5e0d2b04ba491723c";
NSString * urlString = [str stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
// 1.获取网络会话的管理者
AFHTTPSessionManager * manager = [AFHTTPSessionManager manager];
// 2.设置请求数据的序列化方式 (最常见的两种形式:Form表单,JSON)
//POST -----JSON
// Key=value&key1=value1
// userName : jack & password : 123456 & 所在地 : 新余 & 性别 : 男
// 当数据很大的时候,使用字符串保存发送到服务器并不方便,我们考虑使用JSON形式,放入请求体
/**
{
userName : @"jack"
password : @123456
location : @"新余"
sex: @"男"
}
*/
//[request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
//使用&拼接方式发送给服务器
//manager.requestSerializer = [AFHTTPRequestSerializer serializer];
// 使用JSON类型的数据传递给服务器
manager.requestSerializer = [AFJSONRequestSerializer serializer];
// 3.设置接受响应数据的序列化方式
/*
*响应数据类型:
*JSON格式:AFJSONResponseSerializer默认是这个类型
*XML:AFXMLParserResponseSerializer
*图片数据:AFImageResponseSerializer
*属性列表:AFPropertyListResponseSerializer
*不解析:AFHTTPResponseSerializer
*/
//manager.responseSerializer = [AFHTTPResponseSerializer]
manager.responseSerializer = [AFJSONResponseSerializer serializerWithReadingOptions:NSJSONReadingMutableContainers];
/*
*发起网络请求GET
*
*@param NSString 网络地址(接口地址)
*@param id参数
*@param success请求成功之后的回调
*@param failure请求失败之后的回调
*
*/
[manager GET:urlString parameters:nil success:^(NSURLSessionDataTask * _Nonnull task, id_Nullable responseObject) {
NSDictionary * dict = responseObject;
NSLog(@"---------------------------\n%@", dict[@"result"]);
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
NSLog(@"%@", error);
}];
}
例:下载东西{
//刷新图标MBProgressHUD开源刷新图标框架
MBProgressHUD * hud = [MBProgressHUD showHUDAddedTo:self.view animated:YES];
NSURLRequest * request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://dldir1.qq.com/qqfile/QQforMac/QQ_V5.0.2.dmg"]];
AFHTTPSessionManager * manager = [AFHTTPSessionManager manager];
/*
*@param NSURLRequest 请求对象
*@param progressBlock监听下载进度的block,里面有一个NSProgress对象,里面包含了下载进度的信息
*@param destinationBlock目标block,就是下载之后,想要将文件储存的URL
*@paramcompletionHandle 下载完成之后的回调
*
*注意:这个方法返回一个NSURLSessionDownloadTask,不会自动启动
*/
NSURLSessionDownloadTask * task = [manager downloadTaskWithRequest:request progress:^(NSProgress * _Nonnull downloadProgress) {
// 这里方法的回调是在子线程上
NSLog(@"%@", [NSThread currentThread]);
// downloadProgress是下载信息
//NSLog(@"%@", downloadProgress);
NSString * pro = [NSString stringWithFormat:@"%.2f%%", downloadProgress.fractionCompleted * 100];
NSLog(@"%@", pro);
dispatch_async(dispatch_get_main_queue(), ^{
self.progressLabel.text = pro;
});
} destination:^NSURL * _Nonnull(NSURL * _Nonnull targetPath, NSURLResponse * _Nonnull response) {
// targetPath 相当于session中的laction,已经下载好,并且写入到沙盒tmp文件夹中的文件地址
// reponse 响应头
// return你想要将文件储存的路径URL
NSString * path = [NSHomeDirectory() stringByAppendingPathComponent:@"Library/Caches/QQ_V5.0.2.dmg"];
return [NSURL fileURLWithPath:path];
} completionHandler:^(NSURLResponse * _Nonnull response, NSURL * _Nullable filePath, NSError * _Nullable error) {
// filePath这里的filePath即上一个block中我们储存好的位置信息
NSLog(@"filePath : %@", filePath);
//使刷新图标停止
[hud hideAnimated:YES];
}];
[task resume];
}
例:监控网络{
获取网络情况的监控管理者(创建)
①.AFNetworkReachabilityManager *reachabilityManager = [AFNetworkReachabilityManager sharedManager];
②.开启监控!:[reachabilityManager startMoitoring];
③.设置网络状态变化的回调:{
//AFNetworkReachabilityStatus的状态有
//AFNetworkReachabilityStatusUnknown————>未知
//AFNetworkReachabilityStatusNotReachable————>没有开启网络
//AFNetworkReachabilityStatusReachableViaWWAN————>开启网络处于2g3g4g网下
//AFNetworkReachabilityStatusReachableViaWiFi————>处于WIFI模式下
[reachabilityManager setReachabilityStatusChangeBlock:^(){
switch (status) {
case AFNetworkReachabilityStatusUnknown:
NSLog(@"网络未知");
break;
case AFNetworkReachabilityStatusNotReachable:
NSLog(@"网络不通");
break;
case AFNetworkReachabilityStatusReachableViaWWAN:
NSLog(@"正在2G/3G/4G网络状态下,如果继续下载,您将要消耗您的流量,此流量价格根据运营商计费为准");
break;
default:
NSLog(@"正在使用WiFi");
break;
}
}]
}
}
自己写的获取内容和下载{
//获取内容
/*
//创建一个地址
NSString *str = @"http://v.juhe.cn/weather/index?format=2&cityname=新余&key=7f86b53e22db85d5e0d2b04ba491723c";
NSString * urlString = [str stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
AFHTTPSessionManager *sessionManager =[AFHTTPSessionManager manager];
//sessionManager.requestSerializer=[AFHTTPRequestSerializer serializer];
//sessionManager.requestSerializer = [AFJSONRequestSerializer serializer];
//sessionManager.responseSerializer = [AFJSONResponseSerializer serializerWithReadingOptions:NSJSONReadingMutableContainers];
[sessionManager GET:urlString parameters:nil success:^(NSURLSessionDataTask * _Nonnull task, id_Nullable responseObject) {
NSLog(@"%@",responseObject);
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
NSLog(@"%@",error);
}];
*/
//下载
NSURLRequest *requst=[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://dldir1.qq.com/qqfile/QQforMac/QQ_V5.0.2.dmg"]];
//创建网络管理
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
//下载
NSURLSessionDownloadTask *loadTask = [manager downloadTaskWithRequest:requst progress:^(NSProgress * _Nonnull downloadProgress) {
//打印当前下载了多少
NSLog(@"%@",downloadProgress);
} destination:^NSURL * _Nonnull(NSURL * _Nonnull targetPath, NSURLResponse * _Nonnull response) {
//返回的是文件下载好的地址,必须用file返回
return[NSURL fileURLWithPath:[NSHomeDirectory() stringByAppendingPathComponent:@"Library/Caches/QQ_V5.0.2.dmg"] ];
} completionHandler:^(NSURLResponse * _Nonnull response, NSURL * _Nullable filePath, NSError * _Nullable error) {
//filePath参数是上面返回的地址
NSLog(@"%@",filePath);
}];
[loadTask resume];
}
9月7日rn[
网络:
windows:查询本机IP信息:ifconfig
1.HTTP传输协议,由客户端发起,服务器响应,连接结束,会断开。(三次握手)(OSI七层模型:TCP/IP)
2.在iOS9之后,只支持HTTPS。我们需要在info.plist文件中进行相关的设置
3.客户端发送请求包:Request通过URL构造,设置请求方式(HTTPMehod),超时时间(timeoutInterval)
1>请求头HTTPHeader
2>请求体 HTTPBody (POST才有,包含数据)[上传]
4.服务器做出响应Responder
1>状态码StatusCode : 200—OK,404—NotFound, 403—服务器拒绝响应
2>响应头响应的相关信息 (响应的数据大小,数据类型,响应时间)
3>响应体服务器发回的数据
5.NSURLSession (iOS 7.0之前使用: NSURLConnection)
使用NSURLSession会话 组件——单例
网络请求流程:
1.构造NSURL接口
2.构造NSURLRequest请求对象
3.(可选)NSURLSessionConfiguration会话配置器,设置自定义的专属会话
4.NSURLSession会话对象,默认配置的session
5.创建请求任务任务对象,创建网络任务
有三种任务类型(直接或者间接继承与NSURLSessionTask)
1>普通数据任务NSURLSessionDataTask
2>下载任务NSURLSessionDownloadTask
3>上载任务NSURLSessionUploadTask
6.通过任务发起网络请求(resume)
7.使用block或者代理回调(获取网络请求的结果)
6.发送请求的时候,必须要给用户相应的提示!!!(否则:苹果审核不通过)
//网络访问开始的时候,开启网络活动指示图标
[UIApplicationsharedApplication].networkActivityIndicatorVisible=YES;
7.第三方框架的使用,AFNetworking(AFN)(CFNetwork做的封装(Core Foundation))
优点:1>AFN是对NSURLConnection和NSOperation做的继承形式的封装2>之后直接使用block和GCD语法,让开发更加直观
3>直接帮我们解析了JSON、XML、plist…(在回调直接使用responderObject)
————————
4>2.0之后,应用iOS7推出的NSURLSession组件,做出功能的延伸
5>可以使用CocoaPods进行安装(避免项目导入过多,杂乱,笨重)
自己上github上看使用教程
8.MBProgressHUD,直接帮我们进行刷新标示展示的封装,有很多的刷新样式
9.YYModel,进行数据的解析,可以很方便的将字典内容转化为模型(Model)
yy_setModelWithContentDictionary:
10.SD_WebImage,帮助我们在UIButton、UIImageView上异步的,从网络上下载图片,会自动的回调主线程刷新UI
9月10日 项目一
在哪里就用哪里的尺寸否则会出大事的
如果哪里的集合视图出不来不走UICollectionViewCell的方法就把当前视图的自动布局设置为NO;
网易新闻的难点:
1.创建三级控制器用系统的方法给三级控制器添加按钮或用Stroyboard:{
①.系统的方法:一.创建一个继承于UITabBarCobtroller的类{
设置标签栏上的子控件的颜色:self.TabBar.tintColor = [UIColor redColor];
}
二.创建一个继承于UINavigationController的类{
设置导航栏上的背景颜色:self.navigationBar.barTintColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"top_navigation_background@2x"]];
子控件颜色:self.navigationBar.tintColor = [UIColor whiteColor];
设置状态栏的颜色的方法:-(UIStatusBarStyle)preferredStatusBarStyle{
return UIStatusBarStyleLightContent;
//return UIStatusBarStyleDefault;
}
}
②.创建一个继承于UICollectionView的父类给以后的UICollectionView使用!{
例.m
#import
typedef void(^GeneralBlock)();
@interface ZAFatherCollectionView : UICollectionView
@property(nonatomic,strong)UICollectionViewFlowLayout *flowLayout;
-(instancetype)initWithFrame:(CGRect)frame GeneraBlock:(GeneralBlock)blcok;
@end
例.h
#import "ZAFatherCollectionView.h"
@implementation ZAFatherCollectionView
-(instancetype)initWithFrame:(CGRect)frame GeneraBlock:(GeneralBlock)blcok{
//创建流水布局
self.flowLayout = [[UICollectionViewFlowLayout alloc]init];
if (self = [super initWithFrame:frame collectionViewLayout:self.flowLayout]) {
self.dataSource = self;
self.delegate = self;
blcok();
}
return self;
}
#pragmamark -需要覆写的协议方法
- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView{
return 0;
}
- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section{
return 0;
}
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{
return nil;
}
@end
}
③.接下来的集合视图可集体的继承于上面的类,想要修改时可在子类中调用父类的方法写在Block里进行修改FlowLayout的属性或覆写父类的方法!{
例.- (instancetype)initWithFrame:(CGRect)frame collectionViewLayout:(UICollectionViewLayout *)layout{
self = [super initWithFrame:frame GeneraBlock:^{
单元格与单元格之间的空隙
self.flowLayout.minimumInteritemSpacing = 0;
行与行之间的间距
self.flowLayout.minimumLineSpacing = 10;
设定是竖直滑动或水平滑动
self.flowLayout.scrollDirection = UICollectionViewScrollDirectionHorizontal;
单元的的间距
self.flowLayout.sectionInset = UIEdgeInsetsMake(0, 15.f, 0, 15.f);
取消滑动浮标
self.showsHorizontalScrollIndicator = NO;
self.showsVerticalScrollIndicator = NO;
注册
[self registerClass:[ZNewCollectionViewCell class] forCellWithReuseIdentifier:CELL];
}];
return self;
}
接下来就是覆写Cell的方法!
}
如果想要让所有的类都知道导入的框架或宏定义时需创建iOS里的other里的PCH文件,将需要导入的类添加到上面,并在类最上的蓝色的图标里找到Build Settings里搜索Prefix Header 并打开终端去寻找相对地址—》将PCH文件拖入终端,终端会打印地址截取当前的地址前面要加./
如何通过字体判断View的尺寸:
CGRect rect = [str boundingRectWithSize:CGSizeMake(999, 30.f) options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:20]} context:nil];
10月6日—tableView的单元格的高度如何返回
在table中有两个属性
// 在 autolayout 模式下, 系统给我们提供了一个自动估算单元格高度的方法
// 你自定义的单元格,autolayout 约束设置好了
self.tableView.estimatedRowHeight = 100(只要大于0就行);估算单元格的尺寸
self.tableView.rowHeight = UITabViewAutomaticDimension;返回单元格高度
2016.10.6上午And下午
1.自动布局——》①.先想好步骤,并写出
②.一步一步的实现XIB的布局效果
2.框架——》SDAutoLayout自动布局框架的使用和实现
①.创建子视图:self.view = [UIView new];
②.将子视图添加到某个视图上用SDAutoLayout框架的方法:[self.contentView(父视图) sd_addSubviews:@[_view0, _view1, _view2, _view3, _view4, _view5](数组)];
③.给子视图每一个添加约束:—》例
_view0.sd_layout——》子视图SD的方法
.widthIs(50)——》宽度50
.heightIs(50)——》高度50
.topSpaceToView(self.contentView, 10)——》顶上和某个视图的距离10
.leftSpaceToView(self.contentView, 10);——》左边和某个视图的距离10
_view1.sd_layout——》子视图SD的方法
.topEqualToView(_view0)——》和某个视图同顶
.leftSpaceToView(_view0, 10)——》左边和某个视图的距离10
.rightSpaceToView(self.contentView, 10)——》右边和某个视图的距离10
.heightRatioToView(_view0, 0.4);——》和某个视图高成比例的尺寸
_view2.sd_layout——》子视图SD的方法
.topSpaceToView(_view1, 10)——》顶部离某个视图10
.rightSpaceToView(self.contentView, 60)——》右边离某个视图60
.leftEqualToView(_view1)——》和某个视图同左
.autoHeightRatio(0);// label传入 0 自动换行 适应高度
_view3.sd_layout——》子视图SD的方法
.topEqualToView(_view2)——》和某个视图同顶
.leftSpaceToView(_view2, 10)——》左和某个视图的距离10
.heightRatioToView(_view2, 1)——》和某个视图同高比例尺寸大小
.rightEqualToView(_view1);——》和某个视图同右
_view4.sd_layout——》子视图SD的方法
.leftEqualToView(_view2)——》和某个视图同左
.topSpaceToView(_view2, 10)——》顶部和某个视图的距离10
.heightIs(30)——》固定高度
.widthRatioToView(_view1, 0.7);——》同宽尺寸大小// _view4 底部还没有设置
_view5.sd_layout——》子视图SD的方法
.leftSpaceToView(_view4, 10)——》左边距离视图10
.rightSpaceToView(self.contentView, 10)——》右边距离视图10
.bottomSpaceToView(self.contentView, 10)——》底部距离视图10
.heightRatioToView(_view4, 1);——》同高比例尺寸大小
// **************** cell 高度自适应 ******************
[self setupAutoHeightWithBottomView:_view4 bottomMargin:10];
3.自己封装的网络请求框架—》为了更加方便使用
①.创建一个网络接口:NSURLSession *urlSession = [NSURLSession sharedSession];
②.创建一个请求:
NSURLSessionDataTask *task= [session dataTaskWithRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.baidu.com"]] completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
if (error) {
NSLog(@"网络错误:%@",error);
}else{
NSLog(@"%@",[[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding]);
}
}];
③.开启:[task resume];
字体的大小封装:
- (CGRect)textModel:(NSString *)str :(CGSize)size :(CGFloat)small{
return [str boundingRectWithSize:size options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:small]} context:nil];
}
网络请求封装:
+ (instancetype)WS:(NSString *)urlString Song:(void(^)(NSData *data, NSURLResponse *response,NSError *error))Block;
+ (instancetype)WS:(NSString *)urlString Song:(void (^)(NSData *, NSURLResponse *, NSError *))Block{
NSURLSession *session = [NSURLSession sharedSession];
NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:urlString]] completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
if (error) {
NSLog(@"网络请求失败:%@",error);
}else{
Block(data,response,error);
}
}];
[dataTask resume];
return nil;
}