cell的几种style

cell.accessoryType = UITableViewCellAccessoryNone;//cell没有任何的样式
cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;//cell的右边有一个小箭头,距离右边有十几像素;
cell.accessoryType = UITableViewCellAccessoryDetailDisclosureButton;//cell右边有一个蓝色的圆形button;
cell.accessoryType = UITableViewCellAccessoryCheckmark;//cell右边的形状是对号;

double 型转换成 金额

`objc

  • (NSString )priceString:(double)input {
    DDLogDebug(@”input %f”,input);
    NSNumber
    price = [NSNumber numberWithDouble:input];
    DDLogDebug(@”price %@”,price);
    NSNumberFormatter *nf = [NSNumberFormatter new];
    [nf setNumberStyle:NSNumberFormatterCurrencyStyle];
    nf.locale = [NSLocale localeWithLocaleIdentifier:@”zh_CN”];
    DDLogDebug(@”nf %@”,[nf stringFromNumber:price]);
    return [nf stringFromNumber:price];
    }

这里写图片描述

iOS 使用纯代码或xib创建圆角视图

####尊重原创 转自:http://www.jianshu.com/p/80f1fd3f63a0

####

####引言:

在我们日常开发中, 很多中情况下我们需要设置UIView或者UIImageView的圆角以及边框等,例如个人中心的用户头像等等。

例如 简书:

简书-我的界面#####我们通常的做法是:

  1. 使用纯代码。
  2. 在xib下设置属性。

####纯代码创建圆角视图:
代码如下:
UIView *view = [[UIView alloc] initWithFrame:(CGRectMake(50, 100, 200, 200))];
view.backgroundColor = [UIColor brownColor];

// 设置圆角的角度(当view的宽和高相等, 且 圆角角度为宽的一半时 为圆形)
view.layer.cornerRadius = 20;

// 设置允许裁剪
view.layer.masksToBounds = YES;

// 设置边框
view.layer.borderWidth = 5;

// 设置边框颜色
view.layer.borderColor = [[UIColor redColor] CGColor];

[self.view addSubview:view];

创建imageView 和 view 的方式是一样的, 在这里只演示view的创建。


####xib下创建圆角视图:
正常情况下, 我们在xib中使用 keyPath 来设置圆角。如图:

xib.png
这里虽然设置了, 但是我们并不能立即在xib中看到设置后圆角效果的, 只有在程序运行后才会看到效果。 所以我们要使用IB_DESIGNABLEIBInspectable来实现实时查看圆角效果。

######IB_DESIGNABLE:
这是一个宏定义, 功能就是让XCode动态渲染出该类图形化界面。
使用方法: 在自定义的view的.h文件中 添加该 宏定义。

######IBInspectable:
IBInspectable 宏定义的功能是可以可视化显示自定义view中相关的属性。


####如何实现实时查看圆角效果:
1.自定义view , CornerView.h:

#import <UIKit/UIKit.h>
IB_DESIGNABLE  // 动态刷新
@interfaceCornerView : UIView
// 注意: 加上IBInspectable就可以可视化显示相关的属性
/** 可视化设置边框宽度 */
@property (nonatomic, assign)IBInspectable CGFloat borderWidth;
/** 可视化设置边框颜色 */
@property (nonatomic, strong)IBInspectable UIColor *borderColor;
/** 可视化设置圆角 */
@property (nonatomic, assign)IBInspectable CGFloat cornerRadius;
@end

CornerView.m:
@implementationCornerView.m

#pragma mark - 设置边框宽度
- (void)setBorderWidth:(CGFloat)borderWidth {

    if (borderWidth < 0) return;

    self.layer.borderWidth = borderWidth;
}

#pragma mark - 设置边框颜色
- (void)setBorderColor:(UIColor *)borderColor {

    self.layer.borderColor = borderColor.CGColor;
}

#pragma mark - 设置圆角
- (void)setCornerRadius:(CGFloat)cornerRadius {

    self.layer.cornerRadius = cornerRadius;
    self.layer.masksToBounds = cornerRadius > 0;
}

2.在xib中拖一个view, 将view设定为 自定义view: CornerView 如图:

自定义view
注意:Designable如果没有这行字,说明没有正确添加添加IB_DESIGNABLE,如果它的状态显示up to date,说明设置成功, 如果是updating,说明视图在更新,案如果是build failed的话,请检查布局代码,可能有哪里出错了。
3.如图, 我们就可以看到自定义view中设置的属性了:

自定义属性4.设置好 属性后 , 右边的view就会立即 更新了!

效果图.jpg该方法同样适用于UIIamgeView ! ! ! !


####效果图:

效果图

本篇文章对应的源代码下载地址:CornerViewDemo
该 demo 中封装了 自定义view 和 自定义imageView , 可以将CornerTool文件夹拖入到项目中直接使用, xib下 view 继承 CornerView类, imageView 继承 CornerImageView即可设置属性。

文/Li_Cheng(简书作者)
原文链接:http://www.jianshu.com/p/80f1fd3f63a0
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。

iOS 打电话

1
2
3
4
5
6
7
8
9
10
- (void)telePhoneAction:(NSString *)teleNum {

NSString *number = teleNum;// 此处读入电话号码

//NSString *num = [[NSString alloc] initWithFormat:@"tel://%@",number]; //number为号码字符串 如果使用这个方法 结束电话之后会进入联系人列表

NSString *num = [[NSString alloc] initWithFormat:@"telprompt://%@",number]; //而这个方法则打电话前先弹框 是否打电话 然后打完电话之后回到程序中 网上说这个方法可能不合法 无法通过审核

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:num]]; //拨号
}

iOS 网络编程模式总结

转自: http://blog.csdn.net/goohong/article/details/40505291
IOS 可以采用三类api 接口进行网络编程,根据抽象层次从低到高分别为socket方式、stream方式、url 方式。
一 、socket 方式
IOS 提供的socket 方式的网络编程接口为CFSocket。CFSocket是BSD sockets的抽象和封装,CFSocket提供BSD sockets几乎所有的功能,并与run loop集成,用来实现多线程网络编程和网络事件监听。基于 CFSocket可以实现各种类型的 socket编程,包括stream-based 的sockets(如tcp)和packet-based 的sockets(如udp)。需要注意的是在iOS中CFSocket接口在需要时不自动激活设备的
cellular modem或on-demand VPN。
CFSocket包括以下编程接口,包括Socket的 创建、配置,以及根据创建和配置好的Socket 进行 远程通讯等接口。
1 Socket的 创建

1 .1、CFSocketCreate
创建一个特定协议和类型的 CFSocket对象
1.2、CFSocketCreateWithSocketSignature
该接口根据一个包含通讯协议和地址的CFSocketSignature结构来创建一个CFSocket对象

1.3、 CFSocketCreateConnectedToSocketSignature
该接口在创建一个CFSocket对象的同时还与一个远端主机进行连接。

1.4、CFSocketCreateWithNative
该接口通过封装一个存在的 BSD socket来创建一个CFSocket对象。

2 Socket的配置

2.1 CFSocketCopyAddress
功能: 返回一个 CFSocket对象的本地地址。
语法:
SWIFT
func CFSocketCopyAddress(_ s: CFSocket!) -> CFData!
2.2、CFSocketCopyPeerAddress
功能:返回与一个 CFSocket对象连接的远端地址。
语法:
SWIFT
func CFSocketCopyPeerAddress(_ s: CFSocket!) -> CFData!
2.3 CFSocketDisableCallBacks
功能:临时取消一个CFSocket对象创建时指定的某种类型的事件回调。
语法:
SWIFT
func CFSocketDisableCallBacks(_ s: CFSocket!,
_ callBackTypes: CFOptionFlags)
2.4 CFSocketEnableCallBacks
功能:重新允许先前CFSocketDisableCallBacks函数取消的某种类型的事件回调。
语法:
SWIFT
func CFSocketEnableCallBacks(_ s: CFSocket!,
_ callBackTypes: CFOptionFlags)
2.5 CFSocketGetContext
功能:返回一个CFSocket对象的上下文信息。
语法:
SWIFT
func CFSocketGetContext(_ s: CFSocket!,
_ context: UnsafeMutablePointer)
2.6 CFSocketGetNative
返回与一个CFSocket对象相关的本地 BSD socket。
语法:
SWIFT
func CFSocketGetNative(_ s: CFSocket!) -> CFSocketNativeHandle
2.7 CFSocketGetSocketFlags
功能:返回控制一个CFSocket对象的确定行为的 标志。
语法:
SWIFT
func CFSocketGetSocketFlags(_ s: CFSocket!) -> CFOptionFlags

2.8 CFSocketSetSocketFlags
功能:设置控制一个CFSocket对象的确定行为的 标志。
语法:
SWIFT
func CFSocketSetSocketFlags(_ s: CFSocket!,
_ flags: CFOptionFlags)
2.9 CFSocketSetAddress
语法:
SWIFT
func CFSocketSetAddress(_ s: CFSocket!,
_ address: CFData!) -> CFSocketError
功能:为一个CFSocket对象绑定一个本地地址并在本地socket支持的情况下对socket进行配置使其处于监听状态。该函数对应本地socket的 bind以及listen功能。一旦CFSocket对象绑定地址,依赖于socket的协议,其它进程和主机能连接到该CFSocket对象。

3、Sockets的使用

3.1 CFSocketConnectToAddress
功能:打开与一个远程socket的一个连接。
语法:
SWIFT
func CFSocketConnectToAddress(_ s: CFSocket!,
_ address: CFData!,
_ timeout: CFTimeInterval) -> CFSocketError
3.2 CFSocketCreateRunLoopSource
语法:
SWIFT
func CFSocketCreateRunLoopSource(_ allocator: CFAllocator!,
_ s: CFSocket!,
_ order: CFIndex) -> CFRunLoopSource!
功能:为一个CFSocket对象创建一个CFRunLoopSource对象。该创建的 CFRunLoopSource对象不自动添加到一个run loop。为了增加该run loop source到某个run loop,需要调用CFRunLoop对象 的CFRunLoopAddSource函数来为该CFRunLoop对象添加run loop source。
3.3 CFSocketGetTypeID
功能:返回CFSocket对象的 opaque类型对应的类型标示符。
语法:
SWIFT
func CFSocketGetTypeID() -> CFTypeID
3.4 CFSocketInvalidate
功能:使一个CFSocket对象无效,使其停止接收和发送任何消息。
语法:
SWIFT
func CFSocketInvalidate(_ s: CFSocket!)
3.5 CFSocketIsValid
功能:返回一个指示一个CFSocket对象是否有效及是否能够发送和接收消息的布尔值。
语法:
SWIFT
func CFSocketIsValid(_ s: CFSocket!) -> Boolean
3.6 CFSocketSendData
功能:该函数用来通过一个CFSocket对象发送数据。
语法:
SWIFT
func CFSocketSendData(_ s: CFSocket!,
_ address: CFData!,
_ data: CFData!,
_ timeout: CFTimeInterval) -> CFSocketError

二、stream编程模式
stream编程模式提供了与 unix 的文件操作类似的模式。首先创建和设置流,接着打开流,然后读写流,在流存在时还可以通过查询流的相关属性来读取流的相关信息,在流使用完毕后关闭流。
iOS 为stream编程模式提供的api编程接口包括两大类,一类是Core Foundation框架层用C语言实现的CFStream API(包括CFStream、 CFReadStream 、CFWriteStream等),一类是基于其上的在Foundation框架层用Objective-C语言实现的NSStream API(包括NSStream、NSInputStream NSOutputStream等),两者提供相似的接口和行为,其中某些对象是toll-free
bridged类型的,如CFStream 与NSStream,CFReadStream与NSInputStream,CFWriteStream与NSOutputStream之间,因此可以混合使用。
开发人员可以根据自己的语言偏好选择使用。
CFStream API的主要接口:
1、CFStream 创建接口

1.1 CFStreamCreatePairWithPeerSocketSignature
功能:创建一对到一个socket的可读和可写流。
1.2 CFStreamCreatePairWithSocketToHost
功能:创建连接到一个特定主机的特定端口的一对可读写流。
1.3 CFStreamCreatePairWithSocket
功能:创建一对连接到一个socket的可读写流
1.4 CFStreamCreateBoundPair
功能:创建一对读写流。
其它可读写流创建接口:
1.5 CFReadStreamCreateForHTTPRequest
功能:为一个CFHTTP请求创建一个可读流。
1.6 CFReadStreamCreateForStreamedHTTPRequest
功能:为一个HTTP请求的body保持在内存的CFHTTP请求创建一个可读流。
1.7 CFReadStreamCreateWithFTPURL
功能:创建一个FTP可读流
1.8 CFWriteStreamCreateWithFTPURL
功能:创建一个FTP可读流

  1. CFReadStream接口
    2.1 流的打开和关闭
    CFReadStreamOpen
    CFReadStreamClose
    
    2.2 读取数据
    CFReadStreamRead
    2.3. 调度一个可读流
    CFReadStreamScheduleWithRunLoop(_:_:_:)
    CFReadStreamUnscheduleFromRunLoop(_:_:_:) 
    
    2.4 检查可读流的属性
    CFReadStreamCopyProperty(_::)
    CFReadStreamGetBuffer(
    :_::)
    CFReadStreamCopyError(
    :)
    CFReadStreamGetError(:)
    CFReadStreamGetStatus(
    :)
    CFReadStreamHasBytesAvailable(:)
    2.5 设置可读流的属性
    CFReadStreamSetClient(
    :_:_::)
    CFReadStreamSetProperty(
    :_:_:)
    2.6 得到 CFReadStream的 Type ID
    CFReadStreamGetTypeID()
    

3.CFWriteStream 相关接口

3.1 CFWriteStreamClose(_:) 
3.2 CFWriteStreamOpen(_:) 
3.3 CFWriteStreamWrite(_:_:_:)
   3.4 CFWriteStreamScheduleWithRunLoop(_:_:_:)

3.5 CFWriteStreamUnscheduleFromRunLoop(_:_::)
3.6 CFWriteStreamCanAcceptBytes(
:)
3.7 CFWriteStreamCopyProperty(_::)
3.8 CFWriteStreamCopyError(
:)
3.9 CFWriteStreamGetError(:)
3.10 CFWriteStreamGetStatus(
:)
3.11 CFWriteStreamSetClient(_:_:_::)
3.12 CFWriteStreamSetProperty(
:_:_:)
3.13 CFWriteStreamGetTypeID()
CFStream API的使用步骤:
1) 利用流创建接口创建相关流;
2)、调用CFReadStreamSetClient (可读流)或CFWriteStreamSetClient (可写流)来登记要接收的流相关的事件;
3)、调用CFReadStreamScheduleWithRunLoop(可读流)或CFWriteStreamScheduleWithRunLoop(可写流)来使在流在一个run loop上进行调度以便接收相关事件;
4)、调用CFReadStreamOpen 或CFWriteStreamOpen 来打开已创建的流;
5)、在读取流的创建时登记的回调中,在接收到kCFStreamEventHasBytesAvailable事件时来读取数据, 在可写流已登记的回调中,在接收到kCFStreamEventCanAcceptBytes 事件时开始发送数据或请求;
6) 数据传输完成,关闭和释放打开和创建的相关流;
2、NSStream API的使用> 在ios 中由于NSStream类不支持 与一个远程主机连接,而CFStream支持,因此为了使用 NSStream,你需要使用流创建函数CFStreamCreatePairWithSocketToHost或CFStreamCreatePairWithSocketToCFHost来打开一个与远程主机连接的socket并分配一对CFStream 对象(CFReadStream和CFWriteStream),并cast这些对象到NSStream
对象(对应NSInputStream 和 NSOutputStream)。从而可以使用NSStream类的相关接口进行相关网络编程。如设置接收网络事件的代理对象,调度到当前的run loop,然后打开它们进行相应处理。
代码片段如下:
[objc] view
plain
copy在CODE上查看代码片派生到我的代码片1. {

  1. NSURL *website = [NSURL URLWithString:urlStr];
  2. if (!website) {
  3. NSLog(@”%@ is not a valid URL”);
  4. return;
  5. }
  6. CFReadStreamRef readStream;
  7. CFWriteStreamRef writeStream;
  8. CFStreamCreatePairWithSocketToHost(NULL, (CFStringRef)[website host], 80, &readStream, &writeStream);
  9. NSInputStream inputStream = (__bridge_transfer NSInputStream )readStream;
  10. NSOutputStream outputStream = (__bridge_transfer NSOutputStream )writeStream;
  11. [inputStream setDelegate:self];
  12. [outputStream setDelegate:self];
  13. [inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
  14. [outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
  15. [inputStream open];
  16. [outputStream open];
  17. /* Store a reference to the input and output streams so that
  18. they don’t go away…. */
  19. }
在NSStream对象打开后,当接收到相关的stream-event网络消息,其代理对象中的handleEvent: 函数被调用,从而进行流相关的网络消息处理,  如发送相关协议的请求或接收应答等。以下为handleEvent: 函数进行事件处理的代码片段:

[objc] view
plain
copy在CODE上查看代码片派生到我的代码片1. - (void)stream:(NSStream *)stream handleEvent:(NSStreamEvent)eventCode {

  1. NSLog(@”stream:handleEvent: is invoked…”);
  2. switch(eventCode) {
  3. case NSStreamEventHasSpaceAvailable:
  4. {
  5. if (stream == oStream) {
  6. NSString * str = [NSString stringWithFormat:
  7. @”GET / HTTP/1.0\r\n\r\n”];
  8. const uint8_t * rawstring =
  9. (const uint8_t *)[str UTF8String];
  10. [oStream write:rawstring maxLength:strlen(rawstring)];
  11. [oStream close];
  12. }
  13. break;
  14. }
  15. // continued …
  16. }
  17. }

三、url 编程模式
url 编程模式通过URL 的方式来实现网络编程,任何要存取的网络资源(包括局域网和广域网)都可以用一个URL来表示和存取,并支持设备间的资源共享。url 编程模式系统提供http, https, file, ftp, data等五种协议支持,并允许用户自己开发和登记相关类来支持另外的应用层网络协议,进行协议的扩展。
url 编程模式在IOS系统可以使用两种编程接口:NSURLSession 和NSURLConnection。
对于iOS 7 以后的最新系统推荐使用NSURLSession API,对于老版本由于不支持NSURLSession,因此必须使用NSURLConnection API。
NSURLSession编程模式是对相关的连接请求通过一个会话来完成,应用通过创建一系列sessions来实现网络通讯,每一个session协调一组相关数据的传输任务。在每一个session内,应用添加一系列任务,每一个任务表现一个特定URL 请求。
NSURLSession相比NSURLConnection的优点是支持在应用挂起、停止或crashed时能够在后台继续下载数据,即支持任务的取消、重启(恢复)、挂起,以及支持从已挂起、取消或失败的下载中重新恢复下载的能力。
对于简单的请求,还可以直接通过一个简单的NSURL对象来发出请求,并使用一个NSData内存对象或者一个文件的方式来引出NSURL指向的内容。而NSURLConnection API只能通过构造一个NSURLRequest对象或其子类来发出URL请求来请求下载或上传URL数据。 使用一个NSURLRequest请求对象封装一个URL请求,例如HTTP协议方法,除了可以封装一些协议特定的属性外,还可以规定任意本地cached数据的使用策略。
对于NSURLRequest请求对象的应答包括两部分:描述内容的元数据metadata及内容数据本身。两种API对于使用NSURLRequest请求接收的元数据metadata都由NSURLResponse类来封装,其中包含MIME类型、内容长度、编码及提供应答的URL等内容。NSURLResponse协议特定的子类还能提供额外的元数据,如NSHTTPURLResponse提供协议头和WEB服务器返回的状态码
等信息。
NSURLSession API的使用:

NSURLSession类支持三种会话类型(默认会话类型、临时会话、后台会话)以及三种类型的任务(数据任务、下载任务、上传任务)。
数据任务使用NSData 对象来发送和接收内存数据,不存储数据到一个文件,因此不支持后台会话。
下载任务以一个文件的形式引出数据,并支持在应用没有运行时的后台下载。
上传任务用来上传数据(文件),也能够支持应用没有运行时的后台上传。
 默认会话和后台会话的区别是后台会话使用一个分离的进程处理所有的数据传输任务,并带有一些限制:后台会话必须使用特定应用代理来提供事件提交,并仅支持HTTP和HTTPS 协议,不支持其它定制协议,并仅支持上传和下载任务,不支持数据任务。
临时会话不存储任何数据到磁盘,所有接收的内容都保存到与会话关联的RAM中,当会话无效时,RAM中接收的内容自动被清除。

NSURLSession API的使用步骤:
1 、创建一个NSURLSessionConfiguration配置对象

NSURLSessionConfiguration配置对象提供广泛的配置选项,包括:
1)、特定于单个会话的私有数据存储,包括caches, cookies, credentials, 和protocols;
2)、与一个特定请求或一个会话关联的Authentication;
3)、与一个主机的最大连接数;
4)、与一个资源关联的超时;
5)、最小和最大TLS版本支持;
6)、定制的代理词典;
7)、cookie策略的控制;
8)、HTTP pipelining行为的控制
2、根据配置创建相应的NSURLSession;
如下代码片段展示了根据不同的配置对象创建不同类型的NSURLSession会话对象。

[objc] view
plain
copy在CODE上查看代码片派生到我的代码片1. / Create a session for each configurations. /

  1. self.defaultSession = [NSURLSession sessionWithConfiguration: defaultConfigObject delegate: self delegateQueue: [NSOperationQueue mainQueue]];
  2. self.backgroundSession = [NSURLSession sessionWithConfiguration: backgroundConfigObject delegate: self delegateQueue: [NSOperationQueue mainQueue]];
  3. self.ephemeralSession = [NSURLSession sessionWithConfiguration: ephemeralConfigObject delegate: self delegateQueue: [NSOperationQueue mainQueue]];
  NSURLSession API通过代理来实现异步URL内容存取,代理可以是系统提供的代理,还可以是应用提供的特定代理对象。任务对象当从服务器接收到数据或传输完成时调用这些代理对象的方法。
在创建会话指定相应的代理对象。

3、为会话添加任务;
使用如下方法来添加数据任务到一个会话。

dataTaskWithURL(:)
dataTaskWithURL(
:completionHandler:)
dataTaskWithRequest(:)
dataTaskWithRequest(
:completionHandler:)

使用如下方法来添加下载任务到一个会话。

downloadTaskWithURL(:)
downloadTaskWithURL(
:completionHandler:)
downloadTaskWithRequest(:)
downloadTaskWithRequest(
:completionHandler:)
downloadTaskWithResumeData(:)
downloadTaskWithResumeData(
:completionHandler:)

使用如下方法来添加上传任务到一个会话

uploadTaskWithRequest(:fromData:)
uploadTaskWithRequest(
:fromData:completionHandler:)
uploadTaskWithRequest(:fromFile:)
uploadTaskWithRequest(
:fromFile:completionHandler:)
uploadTaskWithStreamedRequest(_:)
如下是数据任务创建代码片段:
[objc] view
plain
copy在CODE上查看代码片派生到我的代码片1. NSURL *url = [NSURL URLWithString: @”http://www.example.com/"];

  1. NSURLSessionDataTask *dataTask = [self.defaultSession dataTaskWithURL: url];
  2. [dataTask resume];
下面是下载任务创建代码片段:         

[objc] view
plain
copy在CODE上查看代码片派生到我的代码片1. NSURL *url = [NSURL URLWithString: @”https://developer.apple.com/library/ios/documentation/Cocoa/Reference/"

  1. “Foundation/ObjC_classic/FoundationObjC.pdf”];
  2. NSURLSessionDownloadTask *downloadTask = [self.backgroundSession downloadTaskWithURL: url];
  3. [downloadTask resume];

4、使用代理方法接收数据及状态信息

会话的数据任务在使用应用特定代理接收数据时必须实现如下两个代理方法:
URLSession:dataTask:didReceiveData:
一次一片的提供请求的数据给会话任务。
URLSession:task:didCompleteWithError:
指示请求数据已经全部接收。

会话的下载任务在下载文件时应该实现如下代理方法:
URLSession:downloadTask:didFinishDownloadingToURL:
下载内容存储到一个URL指定的一个临时文件,在该方法返回之前,必须把临时文件的内容移到一个永久位置,而临时文件被删除。
URLSession:downloadTask:didWriteData:totalBytesWritten:totalBytesExpectedToWrite:
为应用提供关于当前下载进度的状态信息
URLSession:downloadTask:didResumeAtOffset:expectedTotalBytes:
告诉应用已经从从先前的失败下载中恢复。
URLSession:task:didCompleteWithError:
告诉应用下载已经失败。

下载失败恢复处理:
在应用使用cancelByProducingResumeData: 方法取消下载任务时,可以使用downloadTaskWithResumeData: 或 downloadTaskWithResumeData:completionHandler:方法重新创建一个新下载任务并传送cancelByProducingResumeData:产生的恢复数据从而接着继续下载。
在传输失败时,如果任务可恢复,则调用URLSession:task:didCompleteWithError: 方法。在传送给URLSession:task:didCompleteWithError: 方法的参数NSError中的 userInfo 词典中包含键值为NSURLSessionDownloadTaskResumeData的恢复数据,因此可以使用downloadTaskWithResumeData:
或 downloadTaskWithResumeData:completionHandler:方法重新创建一个新下载任务来接着恢复数据继续下载。

系统代理仅能支持基本的URL资源存取任务,不支持认证和后台下载,并且还必须提供一个completion handler block来把返回的URL数据提交到应用。如下是一个使用系统代理的代码例子:
[objc] view
plain
copy在CODE上查看代码片派生到我的代码片1. NSURLSession *delegateFreeSession = [NSURLSession sessionWithConfiguration: defaultConfigObject delegate: nil delegateQueue: [NSOperationQueue mainQueue]];

  1. [delegateFreeSession dataTaskWithURL: [NSURL URLWithString: @”http://www.example.com/"]
  2. completionHandler:^(NSData data, NSURLResponse response,
  3. NSError *error) {
  4. NSLog(@”Got response %@ with error %@.\n”, response, error);
  5. NSLog(@”DATA:\n%@\nEND DATA\n”,
  6. [[NSString alloc] initWithData: data
  7. encoding: NSUTF8StringEncoding]);
  8. }] resume];
会话的上传任务的任务创建和相关代理方法:
会话的上传任务使用HTTP  POST方法来上传数据。可以以一个NSData对象、一个文件或使用一个流为HTTP POST请求的body提供内容。
在以NSData对象提供上传数据时,应用调用uploadTaskWithRequest:fromData: 或uploadTaskWithRequest:fromData:completionHandler: 方法来创建上传任务。

在以文件形式提供上传数据时,应用调用uploadTaskWithRequest:fromFile: 或 uploadTaskWithRequest:fromFile:completionHandler:方法来创建上传任务
在以流方式提供上传数据时,应用调用uploadTaskWithStreamedRequest:方法来创建上传任务。
应用特定代理可以通过实现URLSession:task:didSendBodyData:totalBytesSent:totalBytesExpectedToSend:方法来获得上传进度信息。

iOS-使用AudioServices相关接口的连续震动

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
转自:http://www.jianshu.com/p/dded314dd920
话不多说,先上代码!!!喜欢就点赞

主要功能函数
/*!
@function AudioServicesAddSystemSoundCompletion
@abstract Call the provided Completion Routine when provided SystemSoundID
finishes playing.
@discussion Once set, the System Sound server will send a message to the System Sound client
indicating which SystemSoundID has finished playing.
@param inSystemSoundID
systemSoundID 自定义的sound(1007系统默认提示音)或者kSystemSoundID_Vibrate(震动)
@param inRunLoop
没有研究 一般写NULL 有兴趣可以自己研究一下跟大家共享
@param inRunLoopMode
同上个属性
@param inCompletionRoutine
这个是指某次震动播放完成后的回调 注意是C的函数 一般我们会在回调中写播放震动的函数 来实现连续震动
@param inClientData
没有研究啦!!!NULL就行啦
*/
extern OSStatus
AudioServicesAddSystemSoundCompletion( SystemSoundID inSystemSoundID,
CFRunLoopRef inRunLoop,
CFStringRef inRunLoopMode,
AudioServicesSystemSoundCompletionProc inCompletionRoutine,
void* inClientData)
首先实现上述函数中的回调函数(注意是C)
void soundCompleteCallback(SystemSoundID sound,void * clientData) {
AudioServicesPlaySystemSound(kSystemSoundID_Vibrate); //震动
AudioServicesPlaySystemSound(sound); // 播放系统声音 这里的sound是我自定义的,不要copy哈,没有的
}
实现播放声音或震动的代码
SystemSoundID sound;
NSString *path = [[NSBundle mainBundle] pathForResource:soundName ofType:nil];
AudioServicesCreateSystemSoundID((__bridge CFURLRef)[NSURL fileURLWithPath:path], &_sound);

AudioServicesAddSystemSoundCompletion(_soundID, NULL, NULL, soundCompleteCallback, NULL);
AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);
AudioServicesPlaySystemSound(_sound);
至此,就可以顺利的播放声音和震动了,而且是连续的哦!!!
别忘了! 怎么让他停下来
为了方便 我就写了而一个OC的方法来做了
-(void)stopAlertSoundWithSoundID:(SystemSoundID)sound {
AudioServicesDisposeSystemSoundID(kSystemSoundID_Vibrate);
AudioServicesDisposeSystemSoundID(sound);
AudioServicesRemoveSystemSoundCompletion(sound);
}
这里要详细解说一下需要注意的事项:
AudioServicesAddSystemSoundCompletion(kSystemSoundID_Vibrate, NULL, NULL, systemAudioCallback, NULL);
AudioServicesRemoveSystemSoundCompletion(kSystemSoundID_Vibrate);
这两个接口的用途是绑定和取消指定soundID对应的回调方法;kSystemSoundID_Vibrate为soundID类型,其回调方法认准的也是这个soundID,在任何地方使用这个id去执行AudioServicesPlaySystemSound(xxxSoundID)都会调用到该回调方法。而一旦调用remove方法取消回调,同样的在任何地方使用这个id去执行AudioServicesPlaySystemSound(xxxSoundID)都不会调用到这个回调。说的这么绕,其实就是说这俩接口的影响是全局的,威力很大。
我们只要在回调方法里面再调用AudioServicesPlaySystemSound接口,就可以实现连续震动了;当我们想要停止震动时,调用remove接口,ok,回调方法就歇火了。

优化:(参考某大神的博客,名字太长,直接附链接)
http://blog.csdn.net/openglnewbee/article/details/8494598
经过测试发现震动之间太连续,体验不符合要求;所以我们在c回调里面通过单例(全局变量性质的指针)调用到oc的方法进行[self performSelector:@selector(triggerShake) withObject:nil afterDelay:1](triggerShake是震动接口);在停止震动时候我们需要调用

[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(triggerShake) object:nil];
停止之前可能的回调;这两个方法的成对使用既好用又简便,对于需要定时调用的场景很适合,也免去维护定时器的麻烦。

这个时候屏幕要是常亮就更好了,不用费脑子了,用这个!!!
[[UIApplication sharedApplication] setIdleTimerDisabled:YES]; // 设置播放时屏幕常亮

iOS实现一个颜色渐变的弧形进度条

转自:https://www.ganlvji.com/gradient_circle_progress/###1、先来一个结果
80%的状态:
80percent
99%的状态:
99percent

###2、需要用到的宏:

#define degreesToRadians(x) (M_PI*(x)/180.0) //把角度转换成PI的方式
#define  PROGREESS_WIDTH 80 //圆直径 
#define PROGRESS_LINE_WIDTH 4 //弧线的宽度

###3、CAShapeLayer
首先,你得要引入Core Animation框架。为了实现环形效果,需要使用到CAShapeLayer,原理是CAShapeLayer可以通过指定Path的方式实现生成一个图形,非常方便。

###4、UIBezierPath

由于需要画一个圆形,UIBeziperPath是非常好用的画圆形的工具。实现下面的代码可以画出上面所示的整个轨道。这个圆形是从-210度的角度到30度。

UIBezierPath *path = [UIBezierPath bezierPathWithArcCenter:CGPointMake(40, 40) radius:(PROGREESS_WIDTH-PROGRESS_LINE_WIDTH)/2 startAngle:degreesToRadians(-210) endAngle:degreesToRadians(30) clockwise:YES];

###5、画出一个完成的进度的背景轨道

这里原理很简单,就是使用CAShapeLayer和UIBezierPath结合起来就能够达成目标,这一步的结果如下所示:
0percent

_trackLayer = [CAShapeLayer layer];//创建一个track shape layer
_trackLayer.frame = self.bounds;
[self.layer addSublayer:_trackLayer];
_trackLayer.fillColor = [[UIColor clearColor] CGColor];
 _trackLayer.strokeColor = [_strokeColor CGColor];//指定path的渲染颜色
_trackLayer.opacity = 0.25; //背景同学你就甘心做背景吧,不要太明显了,透明度小一点
_trackLayer.lineCap = kCALineCapRound;//指定线的边缘是圆的
_trackLayer.lineWidth = PROGRESS_LINE_WIDTH;//线的宽度
UIBezierPath *path = [UIBezierPath bezierPathWithArcCenter:CGPointMake(40, 40) radius:(PROGREESS_WIDTH-PROGRESS_LINE_WIDTH)/2 startAngle:degreesToRadians(-210) endAngle:degreesToRadians(30) clockwise:YES];//上面说明过了用来构建圆形
_trackLayer.path =[path CGPath]; //把path传递給layer,然后layer会处理相应的渲染,整个逻辑和CoreGraph是一致的。

###6、渐变进度条:
首先要明确的需求是,我们需要颜色根据百分比从红色渐变到黄色然后再到蓝色。
怎么实现这个颜色的渐变效果。这里我们需要使用到CAGradientLayer,CAGradientLayer是一个用来画颜色渐变的层(如果使用透明的颜色,也就可以做到透明渐变)。我们先用CAGradientLayer做出渐变效果,然后把ShapeLayer作为GradientLayer的Mask来截取出需要的部分,以此达到渐变的进度条效果。

首先,需要构建出顺着弧形的颜色渐变。上面的需求我们可以分解成两部分。
①左半部分,颜色从红色渐变到黄色。
②右半部分,颜色从黄色渐变到蓝色。
由此可以了解到是我们需要两个CAShapeLayer。
为什么要这么折腾?CAShapeLayer不能顺着弧线进行渐变只能指定两个点之间进行渐变。所以只能曲线救国了。
先看看这个部分的效果:
gradient
然后,创建一个新的CAShapeLayer来截取这个颜色渐变的层。
这部分代码如下所示:
_progressLayer = [CAShapeLayer layer];
_progressLayer.frame = self.bounds;
_progressLayer.fillColor = [[UIColor clearColor] CGColor];
_progressLayer.strokeColor = [PROCESS_COLOR CGColor];
_progressLayer.lineCap = kCALineCapRound;
_progressLayer.lineWidth = PROGRESS_LINE_WIDTH;
_progressLayer.path = [path CGPath];
_progressLayer.strokeEnd = 0;

CALayer *gradientLayer = [CALayer layer];
CAGradientLayer *gradientLayer1 =  [CAGradientLayer layer];
gradientLayer1.frame = CGRectMake(0, 0, self.width/2, self.height);
[gradientLayer1 setColors:[NSArray arrayWithObjects:(id)[[UIColor redColor] CGColor],(id)[UIColorFromRGB(0xfde802) CGColor], nil]];
[gradientLayer1 setLocations:@[@0.5,@0.9,@1 ]];
[gradientLayer1 setStartPoint:CGPointMake(0.5, 1)];
[gradientLayer1 setEndPoint:CGPointMake(0.5, 0)];
[gradientLayer addSublayer:gradientLayer1];

CAGradientLayer *gradientLayer2 =  [CAGradientLayer layer];
[gradientLayer2 setLocations:@[@0.1,@0.5,@1]];
gradientLayer2.frame = CGRectMake(self.width/2, 0, self.width/2, self.height);
[gradientLayer2 setColors:[NSArray arrayWithObjects:(id)[UIColorFromRGB(0xfde802) CGColor],(id)[MAIN_BLUE CGColor], nil]];
[gradientLayer2 setStartPoint:CGPointMake(0.5, 0)];
[gradientLayer2 setEndPoint:CGPointMake(0.5, 1)];
[gradientLayer addSublayer:gradientLayer2];

[gradientLayer setMask:_progressLayer]; //用progressLayer来截取渐变层
[self.layer addSublayer:gradientLayer];

###7、进度条效果
走到上面一步我们得到的效果是一个进度为100%的效果,_progressLayer的长度和_trackLayer的长度是一样的。那么怎么解决百分比的问题呢?
CAShapeLayer有一个strokeEnd的属性,这个属性是从0到1的浮点类型,正好可以用表达百分比,而且这个属性是animatable,可以动态的表示进度的变化。
如下代码所示:
-(void)setPercent:(NSInteger)percent animated:(BOOL)animated
{
[CATransaction begin];
[CATransaction setDisableActions:!animated];
[CATransaction setAnimationTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn]];
[CATransaction setAnimationDuration:MAIN_SCREEN_ANIMATION_TIME];
_progressLayer.strokeEnd = percent/100.0;
[CATransaction commit];

    _percent = percent;
}

iOS开发拓展篇—CoreLocation简单介绍

一、简介
1.在移动互联网时代,移动app能解决用户的很多生活琐事,比如
(1)导航:去任意陌生的地方
(2)周边:找餐馆、找酒店、找银行、找电影院

2.在上述应用中,都用到了地图和定位功能,在iOS开发中,要想加入这2大功能,必须基于2个框架进行开发
(1)Map Kit :用于地图展示
(2)Core Location :用于地理定位

3.两个热门专业术语
(1)LBS :Location Based Service(基于定位的服务)
(2)SoLoMo :Social Local Mobile(索罗门)

二、CoreLocation框架的使用
1.CoreLocation框架使用前提
(1)导入框架
  
说明:在Xcode5以后,不再需要我们手动导入
(2)导入主头文件
  #import <CoreLocation/CoreLocation.h>

2.CoreLocation框架使用须知
CoreLocation框架中所有数据类型的前缀都是CL
CoreLocation中使用CLLocationManager对象来做用户定位

三、经纬度等地理信息扫盲
1.示意图
  
2.本初子午线:穿过英国伦敦格林文治天文台
往东边(右边)走,是东经(E)
往西边(左边)走,是西经(W)
东西经各180°,总共360°

3.赤道:零度维度
往北边(上边)走,是北纬(N)
往南边(下边)走,是南纬(S)
南北纬各90°,总共180°

提示:横跨经度\纬度越大(1° ≈ 111km),表示的范围就越大,在地图上看到的东西就越小
4.我国的经纬度:
(1)中国的经纬度范围
纬度范围:N 3°51′ ~ N 53°33′
经度范围:E 73°33′ ~ E 135°05′
(2)部分城市的经纬度
  

四、模拟位置
说明:在对程序进行测试的时候,设置手机模拟器的模拟位置(经纬度)

|