iOS--一些常用的控件集合

xiaoxiao2021-02-28  86

#include <sys/socket.h> // Per msqr

#include <sys/sysctl.h>

#include <net/if.h>

#include <net/if_dl.h>

#import <UIKit/UIKit.h>

#import <MobileCoreServices/MobileCoreServices.h>

#import <AVFoundation/AVBase.h>

#import <Foundation/Foundation.h>

#import <CoreMedia/CMTime.h>

#import <CoreMedia/CMTimeRange.h>

#import <AVFoundation/AVFoundation.h>

#import <Foundation/Foundation.h>

#import <QuartzCore/QuartzCore.h>

#import <CoreImage/CoreImage.h>

#import <AdSupport/AdSupport.h>

#import <AudioToolbox/AudioToolbox.h>

#import <CoreAudioKit/CoreAudioKit.h>

#import <AVFoundation/AVFoundation.h>

#import <AVFoundation/AVBase.h>

#import <Foundation/Foundation.h>

#import <AVFoundation/AVAudioSettings.h>

#import <AudioToolbox/AudioFile.h>

#import <Availability.h>

#import "OpenUDID.h"

#import "IPAddress.h"

#import <CommonCrypto/CommonDigest.h>

#import <CommonCrypto/CommonCryptor.h>

enum{

    ACTIONSHEET_SEX,

    ACTIONSHEET_BIRTHDAY,

    ACTIONSHHET_PHOTO

};

/**

 *  @brief 简单的方法

 */

@interface NSHelper : NSObject

+(NSHelper *)sharedInstance;

/**

 *  简单警告提示,手动消失,不在响应其他事件

 */

+(void)showAlertTitle:(NSString *)Title message:(NSString *)message cancel:(NSString *)cancel;

/**

 *  简单警告提示,自动消失

 */

+(void)showAlertTitle:(NSString *)text forView:(UIView *)view;

//+ (void)addCancelBtn:(NSString *)content Cancel:(void(^)(NSString *rr))CancelClick;

+ (void)performBlock:(void (^)(void))block afterDelay:(NSTimeInterval)delay;

/**

 *  获得当前系统时间 返回时间的字符串

 */

/**

 *  返回当前时间

 *

 *  @param Style 返回时间的格式或风格 例如:@"yyyy-MM-dd HH:mm:ss"

 *

 *  @return 当前时间的字符串

 */

+(NSString *)getCurrentTime:(NSString *)TimeStyle;

//1970以来的毫秒数

+(NSString *)getCurrentTime;

FOUNDATION_EXPORT NSString *DocumentsPath();

+ (NSString *)NSHomeDirectoryPath;

/**

 * 获得Documents路径

 */

+(NSString *)getDocumentsPath ;

/**

 * 获得Caches缓存文件路径

 */

+(NSString *)getCachesPath;

/**

 * 获得Librarys缓存文件路径

 */

+(NSString *)getLibrarysPath;

/**

 *  程序退出后此路径下的东西消失

 */

+(NSString *)getTempPath;

/**

 *  返回一个路径,如果没有的话创建这个路径

 *

 */

+ (NSString *)CreateFileAtPath:(NSString *)filePath

                       Success:(void(^)())Success

                         Error:(void(^)(int error))error;

/**

 *  @brief 获得指定目录下的,指定后缀名称的文件列表 2015.2.25

 *

 *  @param type    文件后缀名称 : png

 *  @param dirPath 指定目录

 *

 *  @return 文件名称列表

 */

+(NSArray *)getFilenamelistOfType:(NSString *)type fromDirPath:(NSString *)dirPath;

/**

 * 判断文件或者路径是否存在

 */

+ (BOOL)isFileExists:(NSString *)filepath;

/**

 *  播放提示音 传入提示声文件名称(不加后缀名) wav格式 提示声时长建议不超过30

 */

+ (void)PlayBeep:(NSString *)Soundfilename;

/**

 *  保存图片到doucment

 */

+ (void)saveImage:(UIImage *)currentImage withName:(NSString *)imageName;

+ (NSString *) getUploadFileBasePath;

/**

 *  返回Documents下指定文件名称 路径

 */

+ (NSString *) readDocumentsWithFileName:(NSString *)fileName;

/**

 *  获取文件大小,不是文件夹

 */

+ (float)fileSizeAtPath:(NSString*) filePath;

/**

 *  压缩视频,效率有点儿慢

 */

//+ (void)videoCompressQualityWithInputUrl:(NSURL *)inputUrl

//                               outputUrl:(NSURL *)outputUrl

//                            blockHandler:(void(^)(AVAssetExportSession *session))handler;

#pragma mark camera utility

+ (BOOL) isCameraAvailable;

+ (BOOL) isRearCameraAvailable;

+ (BOOL) isFrontCameraAvailable ;

+ (BOOL) doesCameraSupportTakingPhotos ;

+ (BOOL) isPhotoLibraryAvailable;

+ (BOOL) canUserPickVideosFromPhotoLibrary;

+ (BOOL) canUserPickPhotosFromPhotoLibrary;

+ (BOOL) cameraSupportsMedia:(NSString *)paramMediaType sourceType:(UIImagePickerControllerSourceType)paramSourceType;

// 应用在app store上的ID

#define kAppIDInAppStore    @"" // 发布以后才有APP ID

#define kAppStoreVersionKey @"AppStoreVersionKey"

/*!

 * @brief 通用辅助扩展类

 * @author huangyibiao

 */

// 把对象转换成JSON格式数据,如果转换失败,返回nil

+ (NSMutableData *)JSONDataWithObject:(id)object;

//! 保存应用在AppStore上版本到本地

+ (void)saveAppStoreVersionToUserDefaults;

//! 是否需要连网更新

+ (BOOL)isAppNeedToUpdate:(BOOL)needNetwork;

// 参数是要判断的应用的URLSchemes

+ (BOOL)hadInstallApp:(NSString *)urlSchemes;

// 能否打开应用

+ (BOOL)canOpenApp:(NSString *)itunesUrlString;

// 打开自己开发的应用

+ (void)openApp:(NSString *)urlSchemes;

//! 进入AppStore

+ (void)goToAppStoreWithURLString:(NSString *)itunesUrlString;

#pragma mark - [唯一标示]

/**

 *  获得的这个CFUUID值系统并没有存储。每次调用CFUUIDCreate,系统都会返回一个新的唯一标示符。如果你希望存储这个标示符,那么需要自己将其存储到NSUserDefaults, Keychain, Pasteboard或其它地方。

 */

+(NSString *)getCFUUID;

/**

 *  NSUUIDiOS 6中才出现,这跟CFUUID几乎完全一样,只不过它是Objective-C接口。+ (id)UUID 是一个类方法,调用该方法可以获得一个UUID。通过下面的代码可以获得一个UUID字符串:

 */

+(NSString *)getNSUUID;

/**

 *  广告标识符   CFUUIDNSUUID不一样,广告标示符是由系统存储着的。不过即使这是由系统存储的,但是有几种情况下,会重新生成广告标示符。如果用户完全重置系统((设置程序 -> 通用 -> 还原 -> 还原位置与隐私) ,这个广告标示符会重新生成。另外如果用户明确的还原广告(设置程序-> 通用 -> 关于本机 -> 广告 -> 还原广告标示符) ,那么广告标示符也会重新生成。关于广告标示符的还原,有一点需要注意:如果程序在后台运行,此时用户还原广告标示符,然后再回到程序中,此时获取广告标示符并不会立即获得还原后的标示符。必须要终止程序,然后再重新启动程序,才能获得还原后的广告标示符。之所以会这样,我猜测是由于ASIdentifierManager是一个单例。

 */

//导入AdSupport.framework

+(NSString *)getADID;

/**

 *  供应商标识符,当CFBundleIdentifier(反转DNS格式)的前两部分。例如,com.apple.app1 com.apple.app2 得到的identifierForVendor是相同的,因为它们的CFBundleIdentifier 前两部分是相同的.当重新安装此供应商的应用时 标识符会被重置

 */

+(NSString *)getVDID;

/**

 *  开放标识符  OpenUDID利用了一个非常巧妙的方法在不同程序间存储标示符在粘贴板中用了一个特殊的名称来存储标示符。通过这种方法,别的程序(同样使用了OpenUDID)知道去什么地方获取已经生成的标示符(而不用再生成一个新的)。

 */

+(NSString *)getOpenUDID;

#pragma mark - [获得--IP]

/**

 *  获得设备IP,如果在内网中,获得的就是内网IP.

 */

+(NSString *)getDeviceIPAdress;

#pragma mark - [获得-Mac地址]

+ (NSString *)getMacAddress;

@end

@interface NSData(AES256)

/**

 *  加密

 */

-(NSData *) aes256_encrypt:(NSString *)key;

/**

 *  解密

 */

-(NSData *) aes256_decrypt:(NSString *)key;

@end

//{"app_key":"123456","app_version":23,"crc":"9aaed55c4fb11a6fe1e8e4889cf4255d","imei":"866479025834515","os":"android","os_version":"5.0.2","time_stamp":"20150724151823","uid":"-1","ver":"0.9"}

#pragma mark - [获得设备基本信息]

@interface DeviceInformation : NSObject

/**手机的别名 : 依文*/

@property (nonatomic, copy) NSString *Name;

/**系统版本号*/

@property (nonatomic, copy) NSString *os_version;

/**系统名称 iPhone os */

@property (nonatomic, copy) NSString *os;

/**当前软件的版本号*/

@property (nonatomic, copy) NSString *app_version;

/**返回设备类型 iPhone ipad*/

@property (nonatomic, copy) NSString *DeviceModel;

/**返回系统名称 以及系统版本号 iPhone os 8.2 */

@property (nonatomic, copy) NSString *OS_Version;

+(instancetype)sharedInstance;

@end

@interface UIImage (colorful)

+ (UIImage *)imageWithColor:(UIColor *)color;

+ (UIImage *)imageWithColor:(UIColor *)color size:(CGSize)size;

+ (UIImage *)fixOrientation:(UIImage *)aImage;

@end

@interface UITextField (exc)

@end

@interface NSString (exc)

/**

 *  校验车牌号 后五位

 */

- (BOOL) isValidateCarNo;

-(BOOL)isNullOrEmpty;

/**

 *  判断字符串是否空

 */

+(BOOL)isNullOrEmpty:(NSString *)string;

//! 是否是合法有效的18位身份证号码

- (BOOL)isValidPersonID;

/**

 *  判断字符串是否有空格

 *

 *  @return 有空格返回yes,否则返回NO

 */

-(BOOL)isSpacesExists;

/**

 *  判断字符串是否含有除字母下划线数字以外的字符

 *

 *  @return 有返回yes,否则返回NO

 */

-(BOOL)isSpecialCharacters;

/**

 *  判断是否为合法的手机号

 *

 *

 *  @return 是返回YES,否则返回NO

 */

+ (BOOL)isMobileNumber:(NSString *)string;

//根据图片的大小限定在limitToSize的宽高内,进行等比例压缩返回图片

+(UIImage *)imageCompress:(UIImage *)image limitToSize:(CGSize)lsize;

+ (void) saveImage:(UIImage *)currentImage withName:(NSString *)imageName;

/**

 *  由身份证返回性别

 */

+ (NSString *)sexStrFromIdentityCard: (NSString *)numberStr;

@end

#import "NSHelper.h"

@interface NSHelper ()<UIAlertViewDelegate>

@end

@implementation NSHelper

+(NSHelper *)sharedInstance

{

    static NSHelper *instance=nil;

    static dispatch_once_t onceToken;

    dispatch_once(&onceToken, ^{

        instance =[[super allocWithZone:nil] init];

    });

    return instance;

}

//allocWithZone是创建对象分配内存的源头,alloc也会调用该接口来分配内存创建对象。

+(instancetype)allocWithZone:(struct _NSZone *)zone

{

    return [[self class] sharedInstance];

}

#pragma mark - [简单提示]

+(void)showAlertTitle:(NSString *)Title message:(NSString *)message cancel:(NSString *)cancel{

    UIAlertView *alert =[[UIAlertView alloc] initWithTitle:Title

                                                   message:message

                                                  delegate:nil

                                         cancelButtonTitle:cancel

                                         otherButtonTitles:nil];

    [alert show];

}

+(void)showAlertTitle:(NSString *)text forView:(UIView *)view

{

    

    UILabel* lab = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 230, 50)];

    lab.backgroundColor = [UIColor colorWithWhite:0.185 alpha:1.000];

    lab.numberOfLines=0;

    CGPoint point = view.center;

    lab.center = point;

    lab.layer.masksToBounds = YES;

    lab.layer.cornerRadius = 10;

    lab.alpha = 0;

    lab.text = text;

    lab.font = [UIFont systemFontOfSize:14.0f];

    lab.textColor = [UIColor whiteColor];

    lab.textAlignment = NSTextAlignmentCenter;

    [view addSubview:lab];

    

    [UIView animateWithDuration:1.5 animations:^{

        lab.alpha = 1;

    } completion:^(BOOL finished) {

        [UIView animateWithDuration:3 animations:^{

            lab.alpha = 0;

        }completion:^(BOOL finished) {

            [lab removeFromSuperview];

        }];

    }];

}

#pragma mark - [播放提示音]

+ (void)PlayBeep:(NSString *)Soundfilename

{

    //声音

    //需要导入框架#import <AudioToolbox/AudioToolbox.h>

    NSString *path = [[NSBundle mainBundle] pathForResource:Soundfilename ofType:@"wav"];

    NSURL *url = [NSURL fileURLWithPath:path];

    //加载音效文件,创建音效IDSoundID,一个ID对应一个音效文件)

    SystemSoundID soundId=0;

    OSStatus err = AudioServicesCreateSystemSoundID((__bridge CFURLRef)(url), &soundId);

    if (err) {

        NSLog(@"Error occurred assigning system sound!");

        return ;

    }

    /*添加音频结束时的回调*/

    AudioServicesAddSystemSoundCompletion(soundId, NULL, NULL, SoundFinished,(__bridge void *)(url));

//    SoundFinished(soundId, (__bridge void *)(url));

    /*开始播放,下面的两个函数都可以用来播放音效文件,第一个函数伴随有震动效果*/

    //AudioServicesPlayAlertSound(soundID);

    AudioServicesPlaySystemSound(soundId);

    CFRunLoopRun();

}

//当音频播放完毕会调用这个函数

static void SoundFinished(SystemSoundID soundID,void* sample){

    /*播放全部结束,因此释放所有资源 */

    AudioServicesDisposeSystemSoundID((UInt32)sample);

    NSLog(@"AudioServicesDisposeSystemSoundID");

    CFRelease(sample);

    CFRunLoopStop(CFRunLoopGetCurrent());

}

+(NSString *)getCurrentTime:(NSString *)TimeStyle

{

    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc]init];

    [dateFormatter setDateFormat:TimeStyle];

    NSString *strDate = [dateFormatter stringFromDate:[NSDate date]];

    return strDate;

}

+(NSString *)getCurrentTime

{

    NSTimeInterval time=[[NSDate date] timeIntervalSince1970]*1000;

    long long dTime = [[NSNumber numberWithDouble:time] longLongValue]; // double转为long long

    return [NSString stringWithFormat:@"%llu",dTime]; // 输出long long

}

NSString *DocumentsPath(){

    return [NSHelper getDocumentsPath];

}

#pragma mark - [获得--IP]

+(NSString *)getDeviceIPAdress {

    InitAddresses();

    GetIPAddresses();

    GetHWAddresses();

    return [NSString stringWithFormat:@"%s", ip_names[1]];

}

#pragma mark - [获得-Mac地址]

+ (NSString *) getMacAddress

{

    int                    mib[6];

    size_t                len;

    char                *buf;

    unsigned char        *ptr;

    struct if_msghdr    *ifm;

    struct sockaddr_dl    *sdl;

    

    mib[0] = CTL_NET;

    mib[1] = AF_ROUTE;

    mib[2] = 0;

    mib[3] = AF_LINK;

    mib[4] = NET_RT_IFLIST;

    

    if ((mib[5] = if_nametoindex("en0")) == 0) {

        printf("Error: if_nametoindex error/n");

        return NULL;

    }

    

    if (sysctl(mib, 6, NULL, &len, NULL, 0) < 0) {

        printf("Error: sysctl, take 1/n");

        return NULL;

    }

    

    if ((buf = malloc(len)) == NULL) {

        printf("Could not allocate memory. error!/n");

        return NULL;

    }

    

    if (sysctl(mib, 6, buf, &len, NULL, 0) < 0) {

        printf("Error: sysctl, take 2");

        return NULL;

    }

    

    ifm = (struct if_msghdr *)buf;

    sdl = (struct sockaddr_dl *)(ifm + 1);

    ptr = (unsigned char *)LLADDR(sdl);

    // NSString *outstring = [NSString stringWithFormat:@"x:x:x:x:x:x", *ptr, *(ptr+1), *(ptr+2), *(ptr+3), *(ptr+4), *(ptr+5)];

    NSString *outstring = [NSString stringWithFormat:@"xxxxxx", *ptr, *(ptr+1), *(ptr+2), *(ptr+3), *(ptr+4), *(ptr+5)];

    free(buf);

    return [outstring uppercaseString];

}

#pragma mark - [唯一标示]

/**

 *  获得的这个CFUUID值系统并没有存储。每次调用CFUUIDCreate,系统都会返回一个新的唯一标示符。如果你希望存储这个标示符,那么需要自己将其存储到NSUserDefaults, Keychain, Pasteboard或其它地方。

 */

+(NSString *)getCFUUID

{

    CFUUIDRef cfuuid = CFUUIDCreate(kCFAllocatorDefault);

    NSString *cfuuidString = (NSString*)CFBridgingRelease(CFUUIDCreateString(kCFAllocatorDefault, cfuuid));

    return cfuuidString;

    //    //    方法一:

    //    CFUUIDRef theUUID = CFUUIDCreate(NULL);

    //    CFStringRef string = CFUUIDCreateString(NULL, theUUID);

    //    NSString * result =(__bridge  NSString *)string;

    //    CFRelease(theUUID);

    //    CFRelease(string);

}

/**

 *  NSUUIDiOS 6中才出现,这跟CFUUID几乎完全一样,只不过它是Objective-C接口。+ (id)UUID 是一个类方法,调用该方法可以获得一个UUID。通过下面的代码可以获得一个UUID字符串:

 */

+(NSString *)getNSUUID

{

    NSString *uuid = [[NSUUID UUID] UUIDString];

    return uuid;

}

/**

 *  广告标识符   CFUUIDNSUUID不一样,广告标示符是由系统存储着的。不过即使这是由系统存储的,但是有几种情况下,会重新生成广告标示符。如果用户完全重置系统((设置程序 -> 通用 -> 还原 -> 还原位置与隐私) ,这个广告标示符会重新生成。另外如果用户明确的还原广告(设置程序-> 通用 -> 关于本机 -> 广告 -> 还原广告标示符) ,那么广告标示符也会重新生成。关于广告标示符的还原,有一点需要注意:如果程序在后台运行,此时用户还原广告标示符,然后再回到程序中,此时获取广告标示符并不会立即获得还原后的标示符。必须要终止程序,然后再重新启动程序,才能获得还原后的广告标示符。之所以会这样,我猜测是由于ASIdentifierManager是一个单例。

 */

//导入AdSupport.framework

+(NSString *)getADID

{

    NSString *adid = [[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString];

    return adid;

}

/**

 *  供应商标识符,当CFBundleIdentifier(反转DNS格式)的前两部分。例如,com.apple.app1 com.apple.app2 得到的identifierForVendor是相同的,因为它们的CFBundleIdentifier 前两部分是相同的.当重新安装此供应商的应用时 标识符会被重置

 */

+(NSString *)getVDID

{

    NSString *idfv = [[[UIDevice currentDevice] identifierForVendor] UUIDString];

    return idfv;

}

/**

 *  开放标识符  OpenUDID利用了一个非常巧妙的方法在不同程序间存储标示符在粘贴板中用了一个特殊的名称来存储标示符。通过这种方法,别的程序(同样使用了OpenUDID)知道去什么地方获取已经生成的标示符(而不用再生成一个新的)。

 */

+(NSString *)getOpenUDID

{

    return [OpenUDID value];

}

+(NSArray *)getFilenamelistOfType:(NSString *)type fromDirPath:(NSString *)dirPath

{

    

    NSArray *fileList = [[[NSFileManager defaultManager] contentsOfDirectoryAtPath:dirPath error:nil]

                         

                         pathsMatchingExtensions:[NSArray arrayWithObject:type]];

    

    

    return fileList;

    

}

/**

 *  获得此Directory下所有文件名

 */

+ (NSArray *)getAllFileAtPath:(NSString *)filePath

{

    NSFileManager *fileManage = [NSFileManager defaultManager];

    //    NSArray *file = [fileManage subpathsOfDirectoryAtPath:filePath error:nil];//作用同下

    NSArray *files = [fileManage subpathsAtPath:filePath];

    return files;

}

/**

 * 判断文件是否存在

 */

+ (BOOL)isFileExists:(NSString *)filepath{

    NSFileManager *fileManager = [NSFileManager defaultManager];

    return [fileManager fileExistsAtPath:filepath];

}

+ (NSString *)CreateFileAtPath:(NSString *)filePath Success:(void(^)())Success Error:(void(^)(int error))error{

    //查找文件,如果不存在,就创建一个文件

    NSFileManager *fileManager = [NSFileManager defaultManager];

    if (![self isFileExists:filePath]){

        if ([fileManager createDirectoryAtPath:filePath withIntermediateDirectories:YES attributes:nil error:nil]){

            Success();

            return filePath;

        }

        else{

            //失败

            error(0);

        }

    }

    return filePath;

}

#pragma mark - [获取文件大小]

+ (float) fileSizeAtPath:(NSString*) filePath{

    NSFileManager* manager = [NSFileManager defaultManager];

    if ([manager fileExistsAtPath:filePath]){

        return [[manager attributesOfItemAtPath:filePath error:nil] fileSize]/(1024.0*1024);;

    }

    return 0;

}

#pragma mark - [延时回调]

+ (void)performBlock:(void (^)(void))block afterDelay:(NSTimeInterval)delay

{

    [self performSelector:@selector(fireBlockAfterDelay:) withObject:block afterDelay:delay];

}

+ (void)fireBlockAfterDelay:(void (^)(void))block

{

    block();

}

//-(IBAction) CreateFile

//{

//    //对于错误信息

//    NSError *error;

//    // 创建文件管理器

    NSFileManager *fileMgr = [NSFileManager defaultManager];

//    NSFileManager *fileManager = [[NSFileManager alloc]init];

//

//    //指向文件目录

//

//    NSString *documentsDirectory= [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"];

//    //创建一个目录

//    [[NSFileManager defaultManager] createDirectoryAtPath: [NSString stringWithFormat:@"%@/myFolder", NSHomeDirectory()] attributes:nil];

//    // File we want to create in the documents directory我们想要创建的文件将会出现在文件目录中

//    // Result is: /Documents/file1.txt结果为:/Documents/file1.txt

//

//    NSString *filePath= [documentsDirectory stringByAppendingPathComponent:@"file2.txt"];

//    //需要写入的字符串

//    NSString *str= @"iPhoneDeveloper Tips\nhttp://iPhoneDevelopTips,com";

//    //写入文件

//    [str writeToFile:filePath atomically:YES encoding:NSUTF8StringEncoding error:&error];

//    //显示文件目录的内容

//    NSLog(@"Documentsdirectory: %@",[fileManager contentsOfDirectoryAtPath:documentsDirectory error:&error]);

//}

/**

 *  压缩视频

 *

 *  @param inputUrl  视频输入地址

 *  @param outputUrl 视频输出地址

 *  @param handler   压缩完毕回调

 */

+ (void)videoCompressQualityWithInputUrl:(NSURL *)inputUrl

                               outputUrl:(NSURL *)outputUrl

                            blockHandler:(void(^)(AVAssetExportSession *session))handler

{

    AVURLAsset *asset = [AVURLAsset URLAssetWithURL:inputUrl options:nil];

    AVAssetExportSession *session = [[AVAssetExportSession alloc]initWithAsset:asset presetName:AVAssetExportPresetMediumQuality];

    //    [[NSFileManager defaultManager] removeItemAtURL:outputUrl error:nil];

    session.outputURL = outputUrl;

    session.outputFileType = AVFileTypeMPEG4;

    

    [session exportAsynchronouslyWithCompletionHandler:^(void)

     {

         switch (session.status) {

             case AVAssetExportSessionStatusUnknown:

                 NSLog(@"AVAssetExportSessionStatusUnknown");

                 break;

             case AVAssetExportSessionStatusWaiting:

                 NSLog(@"AVAssetExportSessionStatusWaiting");

                 break;

             case AVAssetExportSessionStatusExporting:

                 NSLog(@"AVAssetExportSessionStatusExporting");

                 break;

             case AVAssetExportSessionStatusCompleted:

                 NSLog(@"AVAssetExportSessionStatusCompleted");

                 break;

             case AVAssetExportSessionStatusFailed:

                 NSLog(@"AVAssetExportSessionStatusFailed");

                 break;

             case AVAssetExportSessionStatusCancelled:

                 NSLog(@"AVAssetExportSessionStatusCancelled");

                 break;

             default:

                 break;

         }

         handler(session);

     }];

    

}

#pragma mark - [获得路径]

+ (NSString *)NSHomeDirectoryPath

{

    NSString *path = NSHomeDirectory();

    return path;

}

/**

 * 获得Documents路径

 */

+(NSString *)getDocumentsPath {

    NSString *DocumentPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];

    return DocumentPath;

}

/**

 * 获得Caches缓存文件路径

 */

+(NSString *)getCachesPath{

    NSString *path = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject];

    return path;

}

/**

 * 获得Librarys缓存文件路径

 */

+(NSString *)getLibrarysPath{

    NSArray *LibrarysPaths = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);

    NSString *path=[LibrarysPaths objectAtIndex:0];

    return path;

}

//程序退出后此路径下的东西消失

+(NSString *)getTempPath{

    NSString *path = NSTemporaryDirectory();

    return path;

}

#pragma mark - /*****************************ui******************[分割线]*****************************************************/

+(NSString *)CreateFileAtPath:(NSString *)filePath fileName:(NSString *)name

{

    

    NSString *testPath = [filePath stringByAppendingPathComponent:name];

    

    NSFileManager *fileManager = [NSFileManager defaultManager];

    NSString *string = @"写入内容,write String";

    [fileManager createFileAtPath:testPath contents:[string  dataUsingEncoding:NSUTF8StringEncoding] attributes:nil];

    return nil;

}

#pragma mark - 获取JSON数据

// 把对象转换成JSON格式数据,如果转换失败,返回nil

+ (NSMutableData *)JSONDataWithObject:(id)object {

    NSMutableData *postBodyData = nil;

    if ([NSJSONSerialization isValidJSONObject:object]) {

        NSError *error = nil;

        NSData *postData = [NSJSONSerialization dataWithJSONObject:object

                                                           options:NSJSONWritingPrettyPrinted

                                                             error:&error];

        if (error) {

            NSLog(@"error: %@", error.description);

        } else {

            postBodyData = [[NSMutableData alloc] initWithData:postData];

        }

    }

    return postBodyData;

}

#pragma mark - 获取最新版本

+ (NSString *)obtainLatestAppVersion {

    // NSString *urlPath = [NSString stringWithFormat:@"http://itunes.apple.com/lookup?id=%@", kAppIDInAppStore];

    NSString *latestVersion = nil;

    NSDictionary *jsonData = nil; // 这里需要从网络请求到,这里只是写成nil,在发布后再实现

    NSArray *infoArray = [jsonData objectForKey:@"results"];

    if([infoArray count] > 0) {

        NSDictionary *releaseInfo = [infoArray objectAtIndex:0];

        latestVersion = [releaseInfo objectForKey:@"version"];

        

        // 在以前返回的值是如下格式:"4.0",后来变成了:"V4.0",所以需要去掉非数值字符。

        latestVersion = [latestVersion stringByTrimmingCharactersInSet:[NSCharacterSet letterCharacterSet]];

    }

    

    return latestVersion;

}

#pragma mark - 保存应用在AppStore上的版本号到本地

+ (void)saveAppStoreVersionToUserDefaults {

    NSString *storeVersion = [[NSUserDefaults standardUserDefaults] stringForKey:kAppStoreVersionKey];

    NSString *bundleVersion = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"];

    

    // 应用当前的version,应该小于等于store上的version。如果不是,则说明应用升级后,

    // UserDefault中保存的store version未更新,需重新设。

    if(nil == storeVersion || [self version:bundleVersion isBiggerThan:storeVersion])

    {

        storeVersion = [self obtainLatestAppVersion]; // 获取最新的版本

        if (storeVersion) {

            [[NSUserDefaults standardUserDefaults] setObject:storeVersion forKey:kAppStoreVersionKey];

        }

    }

    return;

    

}

#pragma mark - 是否需要更新应用

+ (BOOL)isAppNeedToUpdate:(BOOL)needNetwork {

    NSString *version = nil;

    if (needNetwork) { // 获取应用在appStore上的版本

        version = [self obtainLatestAppVersion];

        if (version) { // 保存到本地

            [[NSUserDefaults standardUserDefaults] setObject:version forKey:kAppStoreVersionKey];

        }

    } else { // 直接从本地获取

        version = [[NSUserDefaults standardUserDefaults] stringForKey:kAppStoreVersionKey];

    }

    

    if (!version) {

        return NO;

    }

    

    NSString *bundleVersion = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"];

    if ([self version:version isBiggerThan:bundleVersion]) {

        return YES;

    }

    return NO;

}

+ (BOOL)version:(NSString *)versionA isBiggerThan:(NSString *)versionB {

    NSArray *a = [versionA componentsSeparatedByString:@"."];

    NSArray *b = [versionB componentsSeparatedByString:@"."];

    

    unsigned aa = [[a objectAtIndex:0] intValue];

    unsigned ab = [a count] > 1 ? [[a objectAtIndex:1] intValue] : 0;

    unsigned cc = [a count] > 2 ? [[a objectAtIndex:2] intValue] : 0;

    

    unsigned ba = [[b objectAtIndex:0] intValue];

    unsigned bb = [b count] > 1 ? [[b objectAtIndex:1] intValue] : 0;

    unsigned bc = [b count] > 2 ? [[b objectAtIndex:2] intValue] : 0;

    

    return ((aa > ba) || (aa == ba && ab > bb) || (aa == ba && ab == bb && cc > bc));

}

// 参数是要判断的应用的URLSchemes

+ (BOOL)hadInstallApp:(NSString *)urlSchemes {

    if ([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:urlSchemes]]) {

        return YES;

    }

    return NO;

}

// 能否打开应用

+ (BOOL)canOpenApp:(NSString *)itunesUrlString {

    if ([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:itunesUrlString]]) {

        return YES;

    }

    return NO;

}

+ (void)openApp:(NSString *)urlSchemes {

    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:urlSchemes]];

    return;

}

#pragma mark - 进入AppStore应用

+ (void)goToAppStoreWithURLString:(NSString *)itunesUrlString {

#if TARGET_IPHONE_SIMULATOR

    NSLog(@"虚拟机不支持APP Store.打开iTunes不会有效果。");

#else

    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:itunesUrlString]];

#endif

    return;

}

#pragma mark - - [读取文件]

//读取工程文件

+(NSString *) ProductPath:(NSString*)filename{

    NSString *path = [[NSBundle mainBundle] pathForResource:filename ofType:@""];

    return  path;

}

#pragma mark camera utility

+ (BOOL) isCameraAvailable{

    return [UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera];

}

+ (BOOL) isRearCameraAvailable{

    return [UIImagePickerController isCameraDeviceAvailable:UIImagePickerControllerCameraDeviceRear];

}

+ (BOOL) isFrontCameraAvailable {

    return [UIImagePickerController isCameraDeviceAvailable:UIImagePickerControllerCameraDeviceFront];

}

+ (BOOL) doesCameraSupportTakingPhotos {

    return [self cameraSupportsMedia:(__bridge NSString *)kUTTypeImage sourceType:UIImagePickerControllerSourceTypeCamera];

}

+ (BOOL) isPhotoLibraryAvailable{

    return [UIImagePickerController isSourceTypeAvailable:

            UIImagePickerControllerSourceTypePhotoLibrary];

}

+ (BOOL) canUserPickVideosFromPhotoLibrary{

    return [self

            cameraSupportsMedia:(__bridge NSString *)kUTTypeMovie sourceType:UIImagePickerControllerSourceTypePhotoLibrary];

}

+ (BOOL) canUserPickPhotosFromPhotoLibrary{

    return [self

            cameraSupportsMedia:(__bridge NSString *)kUTTypeImage sourceType:UIImagePickerControllerSourceTypePhotoLibrary];

}

+ (BOOL) cameraSupportsMedia:(NSString *)paramMediaType sourceType:(UIImagePickerControllerSourceType)paramSourceType{

    __block BOOL result = NO;

    if ([paramMediaType length] == 0) {

        return NO;

    }

    NSArray *availableMediaTypes = [UIImagePickerController availableMediaTypesForSourceType:paramSourceType];

    [availableMediaTypes enumerateObjectsUsingBlock: ^(id obj, NSUInteger idx, BOOL *stop) {

        NSString *mediaType = (NSString *)obj;

        if ([mediaType isEqualToString:paramMediaType]){

            result = YES;

            *stop= YES;

        }

    }];

    return result;

}

#pragma mark - [写入文件]

#pragma mark 保存图片至沙盒

+ (void) saveImage:(UIImage *)currentImage withName:(NSString *)imageName

{

    NSData *imageData = UIImageJPEGRepresentation(currentImage, 1);

    // 获取沙盒目录

    NSString *fullPath = [[NSHomeDirectory() stringByAppendingPathComponent:@"Documents"] stringByAppendingPathComponent:imageName];

    // 将图片写入文件

    [imageData writeToFile:fullPath atomically:NO];

}

+ (NSString *) getUploadFileBasePath{

    NSArray *paths=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);

    NSString *basePath=[paths objectAtIndex:0];

    basePath=[basePath stringByAppendingPathComponent:@"uploadfile"];

    if(![NSFileManager.defaultManager fileExistsAtPath:basePath])

    {

        [NSFileManager.defaultManager createDirectoryAtPath:basePath withIntermediateDirectories:YES attributes:nil error:nil];

    }

    return basePath;

}

/**

 *  返回Documents下指定文件名称 路径

 */

+ (NSString *) readDocumentsWithFileName:(NSString *)fileName

{

    // 获取沙盒目录

    NSString *fullPath = [[NSHomeDirectory() stringByAppendingPathComponent:@"Documents"] stringByAppendingPathComponent:fileName];

    return fullPath;

}

//写入文件存放到工程位置NSDictionary

+(void)saveNSDictionaryForProduct:(NSDictionary *)list  FileUrl:(NSString*) FileUrl{

    NSString *ProductPath =[[NSBundle mainBundleresourcePath];

    NSString *f=[ProductPath stringByAppendingPathComponent:FileUrl];

    [list writeToFile:f atomically:YES];

}

@end

@implementation NSData (AES256)

/**

 *  //加密

 *

 */

- (NSData *)aes256_encrypt:(NSString *)key

{

    char keyPtr[kCCKeySizeAES256+1];

    bzero(keyPtr, sizeof(keyPtr));

    [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];

    NSUInteger dataLength = [self length];

    size_t bufferSize = dataLength + kCCBlockSizeAES128;

    void *buffer = malloc(bufferSize);

    size_t numBytesEncrypted = 0;

    CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmAES128,

                                          kCCOptionPKCS7Padding | kCCOptionECBMode,

                                          keyPtr, kCCBlockSizeAES128,

                                          NULL,

                                          [self bytes], dataLength,

                                          buffer, bufferSize,

                                          &numBytesEncrypted);

    if (cryptStatus == kCCSuccess) {

        return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted];

    }

    free(buffer);

    return nil;

}

/**

 *  //解密

 *

 */

- (NSData *)aes256_decrypt:(NSString *)key

{

    char keyPtr[kCCKeySizeAES256+1];

    bzero(keyPtr, sizeof(keyPtr));

    [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];

    NSUInteger dataLength = [self length];

    size_t bufferSize = dataLength + kCCBlockSizeAES128;

    void *buffer = malloc(bufferSize);

    size_t numBytesDecrypted = 0;

    CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt, kCCAlgorithmAES128,

                                          kCCOptionPKCS7Padding | kCCOptionECBMode,

                                          keyPtr, kCCBlockSizeAES128,

                                          NULL,

                                          [self bytes], dataLength,

                                          buffer, bufferSize,

                                          &numBytesDecrypted);

    if (cryptStatus == kCCSuccess) {

        return [NSData dataWithBytesNoCopy:buffer length:numBytesDecrypted];

        

    }

    free(buffer);

    return nil;

}

@end

@implementation DeviceInformation

- (NSString *)Name

{

    return [[UIDevice currentDevice] name];

}

- (NSString *)SysVersion

{

    return [[UIDevice currentDevice] systemVersion];

}

- (NSString *)SysName

{

    return [[UIDevice currentDevice] systemName];

}

- (NSString *)OS_Version

{

    UIDevice *Device=[UIDevice currentDevice];

    return [NSString stringWithFormat:@"%@ %@",[Device systemName],[Device systemVersion]];

}

- (NSString *)DeviceModel

{

    return [[UIDevice currentDevice] model];

}

- (NSString *)ThisSoftVersion

{

    NSDictionary *infoDictionary = [[NSBundle mainBundle] infoDictionary];

    return [infoDictionary objectForKey:@"CFBundleShortVersionString"];

}

+(instancetype)sharedInstance

{

    static DeviceInformation *instance=nil;

    static dispatch_once_t onceToken;

    dispatch_once(&onceToken, ^{

        instance =[[super allocWithZone:nil] init];

    });

    return instance;

}

//allocWithZone是创建对象分配内存的源头,alloc也会调用该接口来分配内存创建对象。

+(instancetype)allocWithZone:(struct _NSZone *)zone

{

    return [[self class] sharedInstance];

}

@end

@implementation UIImage (colorful)

+ (UIImage *)imageWithColor:(UIColor *)color

{

    return [[self class] imageWithColor:color size:CGSizeMake(30.0f, 30.0f)]; ;

}

///< 根据颜色、图片大小 生成图片

+ (UIImage *)imageWithColor:(UIColor *)color size:(CGSize)size

{

    CGRect rect = CGRectMake(0, 0, size.width, size.height);

    

    // 画图开始

    UIGraphicsBeginImageContext(rect.size);

    // 获取图形设备上下文

    CGContextRef context = UIGraphicsGetCurrentContext();

    // 设置填充颜色

    CGContextSetFillColorWithColor(context, color.CGColor);

    // 用所设置的填充颜色填充

    CGContextFillRect(context, rect);

    // 得到图片

    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();

    // 画图结束,解释资源

    UIGraphicsEndImageContext();

    

    return image;

}

+ (UIImage *)fixOrientation:(UIImage *)aImage {

    

    // No-op if the orientation is already correct

    if (aImage.imageOrientation == UIImageOrientationUp)

        return aImage;

    

    // We need to calculate the proper transformation to make the image upright.

    // We do it in 2 steps: Rotate if Left/Right/Down, and then flip if Mirrored.

    CGAffineTransform transform = CGAffineTransformIdentity;

    

    switch (aImage.imageOrientation) {

        case UIImageOrientationDown:

        case UIImageOrientationDownMirrored:

            transform = CGAffineTransformTranslate(transform, aImage.size.width, aImage.size.height);

            transform = CGAffineTransformRotate(transform, M_PI);

            break;

            

        case UIImageOrientationLeft:

        case UIImageOrientationLeftMirrored:

            transform = CGAffineTransformTranslate(transform, aImage.size.width, 0);

            transform = CGAffineTransformRotate(transform, M_PI_2);

            break;

            

        case UIImageOrientationRight:

        case UIImageOrientationRightMirrored:

            transform = CGAffineTransformTranslate(transform, 0, aImage.size.height);

            transform = CGAffineTransformRotate(transform, -M_PI_2);

            break;

        default:

            break;

    }

    

    switch (aImage.imageOrientation) {

        case UIImageOrientationUpMirrored:

        case UIImageOrientationDownMirrored:

            transform = CGAffineTransformTranslate(transform, aImage.size.width, 0);

            transform = CGAffineTransformScale(transform, -1, 1);

            break;

            

        case UIImageOrientationLeftMirrored:

        case UIImageOrientationRightMirrored:

            transform = CGAffineTransformTranslate(transform, aImage.size.height, 0);

            transform = CGAffineTransformScale(transform, -1, 1);

            break;

        default:

            break;

    }

    

    // Now we draw the underlying CGImage into a new context, applying the transform

    // calculated above.

    CGContextRef ctx = CGBitmapContextCreate(NULL, aImage.size.width, aImage.size.height,

                                             CGImageGetBitsPerComponent(aImage.CGImage), 0,

                                             CGImageGetColorSpace(aImage.CGImage),

                                             CGImageGetBitmapInfo(aImage.CGImage));

    CGContextConcatCTM(ctx, transform);

    switch (aImage.imageOrientation) {

        case UIImageOrientationLeft:

        case UIImageOrientationLeftMirrored:

        case UIImageOrientationRight:

        case UIImageOrientationRightMirrored:

            // Grr...

            CGContextDrawImage(ctx, CGRectMake(0,0,aImage.size.height,aImage.size.width), aImage.CGImage);

            break;

            

        default:

            CGContextDrawImage(ctx, CGRectMake(0,0,aImage.size.width,aImage.size.height), aImage.CGImage);

            break;

    }

    

    // And now we just create a new UIImage from the drawing context

    CGImageRef cgimg = CGBitmapContextCreateImage(ctx);

    UIImage *img = [UIImage imageWithCGImage:cgimg];

    CGContextRelease(ctx);

    CGImageRelease(cgimg);

    return img;

}

@end

@implementation UITextField (exc)

-(BOOL)canPerformAction:(SEL)action withSender:(id)sender

{

    

    if ([UIMenuController sharedMenuController]) {

        

        [UIMenuController sharedMenuController].menuVisible = NO;

        

    }

    

    return YES;

    

    //    if (action == @selector(paste:))

    //        return NO;

    //    return [super canPerformAction:action withSender:sender];

    

    

}

@end

@implementation NSString (ex)

- (BOOL) isValidateCarNo

{

    NSString *carRegex = @"[a-zA-Z0-9]{5}";

    NSPredicate *carTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",carRegex];

    NSLog(@"carTest is %@",self);

    return [carTest evaluateWithObject:self];

}

-(BOOL)isNullOrEmpty

{

    NSLog(@"%@",self);

    NSLog(@"%p",self);

    return [NSString isNullOrEmpty:self];

}

/**

 *  判断字符串是否空

 */

+(BOOL)isNullOrEmpty:(NSString *)string

{

    if (string == nil)

    {

        return YES;

    }

    if (string == NULL)

    {

        return YES;

    }

    if ([string isKindOfClass:[NSNull class]])

    {

        return YES;

    }

    if ([[string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]] length]==0)

    {

        return YES;

    }

    return NO;

}

/**

 * 功能:验证身份证是否合法

 * 参数:输入的身份证号

 */

- (BOOL)isValidPersonID {

    // 判断位数

    if (self.length != 15 && self.length != 18) {

        return NO;

    }

    NSString *carid = self;

    long lSumQT = 0;

    // 加权因子

    int R[] ={7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 };

    // 校验码

    unsigned char sChecker[11]={'1','0','X', '9', '8', '7', '6', '5', '4', '3', '2'};

    

    // 15位身份证号转换成18

    NSMutableString *mString = [NSMutableString stringWithString:self];

    if (self.length == 15) {

        [mString insertString:@"19" atIndex:6];

        long p = 0;

        const char *pid = [mString UTF8String];

        

        for (int i = 0; i<= 16; i++) {

            p += (pid[i] - 48) * R[i];

        }

        

        int o = p % 11;

        NSString *string_content = [NSString stringWithFormat:@"%c", sChecker[o]];

        [mString insertString:string_content atIndex:[mString length]];

        carid = mString;

    }

    

    // 判断地区码

    NSString * sProvince = [carid substringToIndex:2];

    if (![self areaCode:sProvince]) {

        return NO;

    }

    

    // 判断年月日是否有效

    // 年份

    int strYear = [[self substringWithString:carid begin:6 end:4] intValue];

    // 月份

    int strMonth = [[self substringWithString:carid begin:10 end:2] intValue];

    //

    int strDay = [[self substringWithString:carid begin:12 end:2] intValue];

    

    NSTimeZone *localZone = [NSTimeZone localTimeZone];

    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];

    [dateFormatter setDateStyle:NSDateFormatterMediumStyle];

    [dateFormatter setTimeStyle:NSDateFormatterNoStyle];

    [dateFormatter setTimeZone:localZone];

    [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];

    NSDate *date=[dateFormatter dateFromString:[NSString stringWithFormat:@"%d-%d-%d 12:01:01",

                                                strYear, strMonth, strDay]];

    if (date == nil) {

        return NO;

    }

    

    const char *PaperId  = [carid UTF8String];

    // 检验长度

    if(18 != strlen(PaperId)) return NO;

    // 校验数字

    for (int i = 0; i < 18; i++) {

        if ( !isdigit(PaperId[i]) && !(('X' == PaperId[i] || 'x' == PaperId[i]) && 17 == i) ) {

            return NO;

        }

    }

    

    // 验证最末的校验码

    for (int i=0; i<=16; i++) {

        lSumQT += (PaperId[i]-48) * R[i];

    }

    

    if (sChecker[lSumQT%11] != PaperId[17] ) {

        return NO;

    }

    return YES;

}

/**

 * 功能:判断是否在地区码内

 * 参数:地区码

 */

- (BOOL)areaCode:(NSString *)code {

    NSMutableDictionary *dic = [[NSMutableDictionary alloc] init];

    [dic setObject:@"北京" forKey:@"11"];

    [dic setObject:@"天津" forKey:@"12"];

    [dic setObject:@"河北" forKey:@"13"];

    [dic setObject:@"山西" forKey:@"14"];

    [dic setObject:@"内蒙古" forKey:@"15"];

    [dic setObject:@"辽宁" forKey:@"21"];

    [dic setObject:@"吉林" forKey:@"22"];

    [dic setObject:@"黑龙江" forKey:@"23"];

    [dic setObject:@"上海" forKey:@"31"];

    [dic setObject:@"江苏" forKey:@"32"];

    [dic setObject:@"浙江" forKey:@"33"];

    [dic setObject:@"安徽" forKey:@"34"];

    [dic setObject:@"福建" forKey:@"35"];

    [dic setObject:@"江西" forKey:@"36"];

    [dic setObject:@"山东" forKey:@"37"];

    [dic setObject:@"河南" forKey:@"41"];

    [dic setObject:@"湖北" forKey:@"42"];

    [dic setObject:@"湖南" forKey:@"43"];

    [dic setObject:@"广东" forKey:@"44"];

    [dic setObject:@"广西" forKey:@"45"];

    [dic setObject:@"海南" forKey:@"46"];

    [dic setObject:@"重庆" forKey:@"50"];

    [dic setObject:@"四川" forKey:@"51"];

    [dic setObject:@"贵州" forKey:@"52"];

    [dic setObject:@"云南" forKey:@"53"];

    [dic setObject:@"西藏" forKey:@"54"];

    [dic setObject:@"陕西" forKey:@"61"];

    [dic setObject:@"甘肃" forKey:@"62"];

    [dic setObject:@"青海" forKey:@"63"];

    [dic setObject:@"宁夏" forKey:@"64"];

    [dic setObject:@"新疆" forKey:@"65"];

    [dic setObject:@"台湾" forKey:@"71"];

    [dic setObject:@"香港" forKey:@"81"];

    [dic setObject:@"澳门" forKey:@"82"];

    [dic setObject:@"国外" forKey:@"91"];

    

    if ([dic objectForKey:code] == nil) {

        return NO;

    }

    return YES;

}

/**

 * 功能:获取指定范围的字符串

 * 参数:字符串的开始小标

 * 参数:字符串的结束下标

 */

- (NSString *)substringWithString:(NSString *)str begin:(NSInteger)begin end:(NSInteger )end {

    return [str substringWithRange:NSMakeRange(begin, end)];

}

-(BOOL)isSpacesExists

{

    //    NSString *_string = [NSString stringWithFormat:@"123 456"];

    NSRange _range = [self rangeOfString:@" "];

    if (_range.location != NSNotFound) {

        //有空格

        return YES;

    }else

    {        //没有空格

        return NO;

    }

}

-(BOOL)isSpecialCharacters

{

    NSCharacterSet *ValidCharacters = [[NSCharacterSet characterSetWithCharactersInString:@"_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"] invertedSet];

    NSRange Range = [self rangeOfCharacterFromSet:ValidCharacters];

    if (Range.location != NSNotFound)

    {

        NSLog(@"包含特殊字符");

    }

    return Range.location!=NSNotFound;

}

//验证手机号

+ (BOOL)isMobileNumber:(NSString *)string{

    string = [string stringByReplacingOccurrencesOfString:@" " withString:@""];

    

    if (string.length != 11)

        

    {

        

        return NO;

        

    }else{

        

        /**

         

         * 移动号段正则表达式

         

         */

        

        NSString *CM_NUM = @"^((13[4-9])|(147)|(15[0-2,7-9])|(178)|(18[2-4,7-8]))\\d{8}|(1705)\\d{7}$";

        

        /**

         

         * 联通号段正则表达式

         

         */

        

        NSString *CU_NUM = @"^((13[0-2])|(145)|(15[5-6])|(176)|(18[5,6]))\\d{8}|(1709)\\d{7}$";

        

        /**

         

         * 电信号段正则表达式

         

         */

        

        NSString *CT_NUM = @"^((133)|(153)|(177)|(18[0,1,9]))\\d{8}$";

        

        NSPredicate *pred1 = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", CM_NUM];

        

        BOOL isMatch1 = [pred1 evaluateWithObject:string];

        

        NSPredicate *pred2 = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", CU_NUM];

        

        BOOL isMatch2 = [pred2 evaluateWithObject:string];

        

        NSPredicate *pred3 = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", CT_NUM];

        

        BOOL isMatch3 = [pred3 evaluateWithObject:string];

        

        

        

        if (isMatch1 || isMatch2 || isMatch3) {

            

            return YES;

            

        }else{

            

            return NO;

            

        }

    }

}

//根据图片的大小限定在limitToSize的宽高内,进行等比例压缩返回图片

+(UIImage *)imageCompress:(UIImage *)image limitToSize:(CGSize)lsize

{

    if (nil == image)

    {

        return nil;

    }

    if (image.size.width<lsize.width && image.size.height<lsize.height)

    {

        return image;

    }

    CGSize size = [self fitsize:image.size limitToSize:lsize];

    UIGraphicsBeginImageContext(size);

    CGRect rect = CGRectMake(0, 0, size.width, size.height);

    [image drawInRect:rect];

    UIImage *newing = UIGraphicsGetImageFromCurrentImageContext();

    UIGraphicsEndImageContext();

    return newing;

}

+ (CGSize)fitsize:(CGSize)thisSize limitToSize:(CGSize)lsize

{

    if(thisSize.width == 0 && thisSize.height ==0)

        return CGSizeMake(0, 0);

    CGFloat wscale = thisSize.width/lsize.width;

    CGFloat hscale = thisSize.height/lsize.height;

    CGFloat scale = (wscale>hscale)?wscale:hscale;

    CGSize newSize = CGSizeMake(thisSize.width/scale, thisSize.height/scale);

    return newSize;

}

#pragma mark 保存图片至沙盒

+ (void) saveImage:(UIImage *)currentImage withName:(NSString *)imageName

{

    NSData *imageData = UIImageJPEGRepresentation(currentImage, 1);

    // 获取沙盒目录

    NSString *fullPath = [[NSHelper getUploadFileBasePath] stringByAppendingPathComponent:imageName];

    // 将图片写入文件

    [imageData writeToFile:fullPath atomically:NO];

}

//手机号码验证

- (BOOL) isValidateMobile

{

    //手机号以13 1518开头,八个 \d 数字字符

    //    NSString *phoneRegex = @"^((13[0-9])|(15[^4,\\D])|(18[0,0-9]))\\d{8}$";

    NSString *phoneRegex = @"1[3|5|7|8|][0-9]{9}";

    NSPredicate *phoneTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",phoneRegex];

    return [phoneTest evaluateWithObject:self];

}

+ (NSString *)sexStrFromIdentityCard:(NSString *)numberStr

{

    NSString * result = nil;

    BOOL isAllNumber = YES;

    if ([numberStr length] < 17) {

        NSString * fontNumber = [numberStr substringFromIndex:numberStr.length];

        //检测是否是数字

        const char *str = [fontNumber UTF8String];

        const char *p = str;

        while (*p != '\0') {

            if(!(*p>='0'&&*p<='9'))

                isAllNumber = NO;

            p++;

        }

        if (! isAllNumber) {

            return result;

        }

        int sexNumber = [fontNumber integerValue];

        if (sexNumber%2 == 1) {

            result = @"";

        }else if (sexNumber%2 == 0) {

            result = @"";

        }

        return result;

    }else {

        NSString * fontNumber = [numberStr substringWithRange:NSMakeRange(16, 1)];

        int sexNumber = [fontNumber integerValue];

        if (sexNumber%2 == 1) {

            result = @"";

        }else if (sexNumber%2 == 0) {

            result = @"";

        }

        return result;

    }

    

}

@end

转载请注明原文地址: https://www.6miu.com/read-70544.html

最新回复(0)