美文网首页
以前的iOS的笔记---纯手打(2)

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

作者: 炙冰 | 来源:发表于2016-10-19 15:39 被阅读0次

    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;

    }

    相关文章

      网友评论

          本文标题:以前的iOS的笔记---纯手打(2)

          本文链接:https://www.haomeiwen.com/subject/bkyxuttx.html