以前的iOS的笔记---纯手打(2)

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;

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,847评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,208评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,587评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,942评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,332评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,587评论 1 218
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,853评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,568评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,273评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,542评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,033评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,373评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,031评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,073评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,830评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,628评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,537评论 2 269

推荐阅读更多精彩内容