驗證郵箱
+ (BOOL)isValidUsername:(NSString *)username {
// 驗證用戶名 - 郵箱
NSString *emailRegex = @"[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}";
NSPredicate *emailTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", emailRegex];
return [emailTest evaluateWithObject:username];
}
驗證手機(jī)號
+ (BOOL)isTelephone:(NSString *)mobile
{
if (mobile.length < 11)
{
return NO;
}else{
/**
* 移動號段正則表達(dá)式
*/
NSString *CM_NUM = @"^((13[4-9])|(147)|(15[0-2,7-9])|(178)|(18[2-4,7-8]))\\d{8}|(1705)\\d{7}$";
/**
* 聯(lián)通號段正則表達(dá)式
*/
NSString *CU_NUM = @"^((13[0-2])|(145)|(15[5-6])|(176)|(18[5,6]))\\d{8}|(1709)\\d{7}$";
/**
* 電信號段正則表達(dá)式
*/
NSString *CT_NUM = @"^((133)|(153)|(177)|(18[0,1,9]))\\d{8}$";
NSPredicate *pred1 = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", CM_NUM];
BOOL isMatch1 = [pred1 evaluateWithObject:mobile];
NSPredicate *pred2 = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", CU_NUM];
BOOL isMatch2 = [pred2 evaluateWithObject:mobile];
NSPredicate *pred3 = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", CT_NUM];
BOOL isMatch3 = [pred3 evaluateWithObject:mobile];
if (isMatch1 || isMatch2 || isMatch3) {
return YES;
// if (isMatch1) {
// return @"該號碼是一個正確的移動手機(jī)號碼";
// }else if (isMatch2) {
// return @"該號碼是一個正確的聯(lián)通手機(jī)號碼";
// }else {
// return @"該號碼是一個正確的電信手機(jī)號碼";
// }
}else{
return NO;
}
}
return nil;
}
驗證身份證是否合法
+ (BOOL)validateIDCardNumber:(NSString *)valueStr{
valueStr = [valueStr stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
NSUInteger length =0;
if (!valueStr) {
return NO;
}else {
length = valueStr.length;
if (length !=15 && length !=18) {
return NO;
}
}
// 省份代碼
NSArray *areasArray =@[@"11",@"12", @"13",@"14", @"15",@"21", @"22",@"23", @"31",@"32", @"33",@"34", @"35",@"36", @"37",@"41",@"42",@"43", @"44",@"45", @"46",@"50", @"51",@"52", @"53",@"54", @"61",@"62", @"63",@"64", @"65",@"71", @"81",@"82", @"91"];
NSString *valueStart2 = [valueStr substringToIndex:2];
BOOL areaFlag =NO;
for (NSString *areaCode in areasArray) {
if ([areaCode isEqualToString:valueStart2]) {
areaFlag =YES;
break;
}
}
if (!areaFlag) {
return false;
}
NSRegularExpression *regularExpression;
NSUInteger numberofMatch;
int year =0;
switch (length) {
case15:
year = [valueStr substringWithRange:NSMakeRange(6,2)].intValue +1900;
if (year %4 ==0 || (year %100 ==0 && year %4 ==0)) {
regularExpression = [[NSRegularExpression alloc]initWithPattern:@"^[1-9][0-9]{5}[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{3}$" options:NSRegularExpressionCaseInsensitive error:nil];//測試出生日期的合法性
}else {
regularExpression = [[NSRegularExpression alloc]initWithPattern:@"^[1-9][0-9]{5}[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))[0-9]{3}$" options:NSRegularExpressionCaseInsensitive error:nil];//測試出生日期的合法性
}
numberofMatch = [regularExpression numberOfMatchesInString:valueStr options:NSMatchingReportProgress range:NSMakeRange(0, valueStr.length)];
if(numberofMatch >0) {
return YES;
}else {
return NO;
}
case18:
year = [valueStr substringWithRange:NSMakeRange(6,4)].intValue;
if (year %4 ==0 || (year %100 ==0 && year %4 ==0)) {
regularExpression = [[NSRegularExpression alloc]initWithPattern:@"^[1-9][0-9]{5}19[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{3}[0-9Xx]$"
options:NSRegularExpressionCaseInsensitive error:nil];//測試出生日期的合法性
}else {
regularExpression = [[NSRegularExpression alloc]initWithPattern:@"^[1-9][0-9]{5}19[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))[0-9]{3}[0-9Xx]$"
options:NSRegularExpressionCaseInsensitive
error:nil];//測試出生日期的合法性
}
numberofMatch = [regularExpression numberOfMatchesInString:valueStr
options:NSMatchingReportProgress
range:NSMakeRange(0, valueStr.length)];
if(numberofMatch >0) {
int S = ([valueStr substringWithRange:NSMakeRange(0,1)].intValue + [valueStr substringWithRange:NSMakeRange(10,1)].intValue) *7 + ([valueStr substringWithRange:NSMakeRange(1,1)].intValue + [valueStr substringWithRange:NSMakeRange(11,1)].intValue) *9 + ([valueStr substringWithRange:NSMakeRange(2,1)].intValue + [valueStr substringWithRange:NSMakeRange(12,1)].intValue) *10 + ([valueStr substringWithRange:NSMakeRange(3,1)].intValue + [valueStr substringWithRange:NSMakeRange(13,1)].intValue) *5 + ([valueStr substringWithRange:NSMakeRange(4,1)].intValue + [valueStr substringWithRange:NSMakeRange(14,1)].intValue) *8 + ([valueStr substringWithRange:NSMakeRange(5,1)].intValue + [valueStr substringWithRange:NSMakeRange(15,1)].intValue) *4 + ([valueStr substringWithRange:NSMakeRange(6,1)].intValue + [valueStr substringWithRange:NSMakeRange(16,1)].intValue) *2 + [valueStr substringWithRange:NSMakeRange(7,1)].intValue *1 + [valueStr substringWithRange:NSMakeRange(8,1)].intValue *6 + [valueStr substringWithRange:NSMakeRange(9,1)].intValue *3;
int Y = S %11;
NSString *M =@"F";
NSString *JYM =@"10X98765432";
M = [JYM substringWithRange:NSMakeRange(Y,1)];// 判斷校驗位
if ([M isEqualToString:[valueStr substringWithRange:NSMakeRange(17,1)]]) {
return YES;// 檢測ID的校驗位
}else {
return NO;
}
}else {
return NO;
}
default:
return false;
}
}
獲取星期
+(NSString *)dateTomorrow:(NSDate *)date
{
NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSInteger unitFlags = NSYearCalendarUnit |
NSMonthCalendarUnit |
NSDayCalendarUnit |
NSWeekdayCalendarUnit |
NSHourCalendarUnit |
NSMinuteCalendarUnit |
NSSecondCalendarUnit;
NSDateComponents *comps = [calendar components:unitFlags fromDate:date];
long month = [comps month];
long day = [comps day];
long hour = [comps hour];
long minute = [comps minute];
long weekday = [comps weekday];
NSString *weekdayString = @"";
switch (weekday) {
case 1:
weekdayString = @"周日";
break;
case 2:
weekdayString = @"周一";
break;
case 3:
weekdayString = @"周二";
break;
case 4:
weekdayString = @"周三";
break;
case 5:
weekdayString = @"周四";
break;
case 6:
weekdayString = @"周五";
break;
case 7:
weekdayString = @"周六";
break;
default:
break;
}
NSString *dayStr = nil;
if (day < 10) {
dayStr = [NSString stringWithFormat:@"0%ld",day];
}else{
dayStr = [NSString stringWithFormat:@"%ld",day];
}
NSString *hourStr = nil;
if (hour < 10) {
hourStr = [NSString stringWithFormat:@"0%ld",hour];
}else{
hourStr = [NSString stringWithFormat:@"%ld",hour];
}
NSString *minuteStr = nil;
if (minute < 10) {
minuteStr = [NSString stringWithFormat:@"0%ld",minute];
}else{
minuteStr = [NSString stringWithFormat:@"%ld",minute];
}
return [NSString stringWithFormat:@"%ld/%@ %@:%@",month,dayStr,hourStr,minuteStr];
}
禁止手機(jī)睡眠
[UIApplication sharedApplication].idleTimerDisabled = YES;
編譯的時候遇到 no such file or directory: /users/apple/XXX
答:是因為編譯的時候,在此路徑下找不到這個文件,解決這個問題,首先是是要檢查缺少的文件是不是在工程中,如果不在工程中,需要從本地拖進(jìn)去,如果發(fā)現(xiàn)已經(jīng)存在工程中了,或者拖進(jìn)去還是報錯,這時候需要去build phases中搜索這個文件,這時候很可能會搜出現(xiàn)兩個相同的文件,這時候,有一個路徑是正確的,刪除另外一個即可。如果刪除了還是不行,需要把兩個都刪掉,然后重新往工程里拖進(jìn)這個文件即可
顏色轉(zhuǎn)換成圖片
+ (UIImage *)cl_imageWithColor:(UIColor *)color {
CGRect rect = CGRectMake(0.0f, 0.0f, 1.0f, 1.0f);
UIGraphicsBeginImageContext(rect.size);
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetFillColorWithColor(context, [color CGColor]);
CGContextFillRect(context, rect);
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return image;
}
獲取app緩存大小
- (CGFloat)getCachSize {
NSUInteger imageCacheSize = [[SDImageCache sharedImageCache] getSize];
//獲取自定義緩存大小
//用枚舉器遍歷 一個文件夾的內(nèi)容
//1.獲取 文件夾枚舉器
NSString *myCachePath = [NSHomeDirectory() stringByAppendingPathComponent:@"Library/Caches"];
NSDirectoryEnumerator *enumerator = [[NSFileManager defaultManager] enumeratorAtPath:myCachePath];
__block NSUInteger count = 0;
//2.遍歷
for (NSString *fileName in enumerator) {
NSString *path = [myCachePath stringByAppendingPathComponent:fileName];
NSDictionary *fileDict = [[NSFileManager defaultManager] attributesOfItemAtPath:path error:nil];
count += fileDict.fileSize;//自定義所有緩存大小
}
// 得到是字節(jié) 轉(zhuǎn)化為M
CGFloat totalSize = ((CGFloat)imageCacheSize+count)/1024/1024;
return totalSize;
}
清理app緩存
- (void)handleClearView {
//刪除兩部分
//1.刪除 sd 圖片緩存
//先清除內(nèi)存中的圖片緩存
[[SDImageCache sharedImageCache] clearMemory];
//清除磁盤的緩存
[[SDImageCache sharedImageCache] clearDisk];
//2.刪除自己緩存
NSString *myCachePath = [NSHomeDirectory() stringByAppendingPathComponent:@"Library/Caches"];
[[NSFileManager defaultManager] removeItemAtPath:myCachePath error:nil];
}
常用權(quán)限判斷
if ([CLLocationManager authorizationStatus] ==kCLAuthorizationStatusDenied) {
NSLog(@"沒有定位權(quán)限");
}
AVAuthorizationStatus statusVideo = [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeVideo];
if (statusVideo == AVAuthorizationStatusDenied) {
NSLog(@"沒有攝像頭權(quán)限");
}
//是否有麥克風(fēng)權(quán)限
AVAuthorizationStatus statusAudio = [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeAudio];
if (statusAudio == AVAuthorizationStatusDenied) {
NSLog(@"沒有錄音權(quán)限");
}
[PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) {
if (status == PHAuthorizationStatusDenied) {
NSLog(@"沒有相冊權(quán)限");
}
}];
獲取手機(jī)和app信息
NSDictionary *infoDictionary = [[NSBundle mainBundle] infoDictionary];
CFShow(infoDictionary);
// app名稱
NSString *app_Name = [infoDictionary objectForKey:@"CFBundleDisplayName"];
// app版本
NSString *app_Version = [infoDictionary objectForKey:@"CFBundleShortVersionString"];
// app build版本
NSString *app_build = [infoDictionary objectForKey:@"CFBundleVersion"];
//手機(jī)序列號
NSString* identifierNumber = [[UIDevice currentDevice] uniqueIdentifier];
NSLog(@"手機(jī)序列號: %@",identifierNumber);
//手機(jī)別名: 用戶定義的名稱
NSString* userPhoneName = [[UIDevice currentDevice] name];
NSLog(@"手機(jī)別名: %@", userPhoneName);
//設(shè)備名稱
NSString* deviceName = [[UIDevice currentDevice] systemName];
NSLog(@"設(shè)備名稱: %@",deviceName );
//手機(jī)系統(tǒng)版本
NSString* phoneVersion = [[UIDevice currentDevice] systemVersion];
NSLog(@"手機(jī)系統(tǒng)版本: %@", phoneVersion);
//手機(jī)型號
NSString* phoneModel = [[UIDevice currentDevice] model];
NSLog(@"手機(jī)型號: %@",phoneModel );
//地方型號 (國際化區(qū)域名稱)
NSString* localPhoneModel = [[UIDevice currentDevice] localizedModel];
NSLog(@"國際化區(qū)域名稱: %@",localPhoneModel );
NSDictionary *infoDictionary = [[NSBundle mainBundle] infoDictionary];
// 當(dāng)前應(yīng)用名稱
NSString *appCurName = [infoDictionary objectForKey:@"CFBundleDisplayName"];
NSLog(@"當(dāng)前應(yīng)用名稱:%@",appCurName);
// 當(dāng)前應(yīng)用軟件版本 比如:1.0.1
NSString *appCurVersion = [infoDictionary objectForKey:@"CFBundleShortVersionString"];
NSLog(@"當(dāng)前應(yīng)用軟件版本:%@",appCurVersion);
// 當(dāng)前應(yīng)用版本號碼 int類型
NSString *appCurVersionNum = [infoDictionary objectForKey:@"CFBundleVersion"];
NSLog(@"當(dāng)前應(yīng)用版本號碼:%@",appCurVersionNum);
獲取一個類的所有屬性
id LenderClass = objc_getClass("Lender");
unsigned int outCount, i;
objc_property_t *properties = class_copyPropertyList(LenderClass, &outCount);
for (i = 0; i < outCount; i++) {
objc_property_t property = properties[i];
fprintf(stdout, "%s %s\n", property_getName(property), property_getAttributes(property));
}
身份證號驗證
- (BOOL)validateIdentityCard {
BOOL flag;
if (self.length <= 0) {
flag = NO;
return flag;
}
NSString *regex2 = @"^(\\d{14}|\\d{17})(\\d|[xX])$";
NSPredicate *identityCardPredicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",regex2];
return [identityCardPredicate evaluateWithObject:self];
}
合并兩個圖片
+ (UIImage*)mergeImage:(UIImage*)firstImage withImage:(UIImage*)secondImage {
CGImageRef firstImageRef = firstImage.CGImage;
CGFloat firstWidth = CGImageGetWidth(firstImageRef);
CGFloat firstHeight = CGImageGetHeight(firstImageRef);
CGImageRef secondImageRef = secondImage.CGImage;
CGFloat secondWidth = CGImageGetWidth(secondImageRef);
CGFloat secondHeight = CGImageGetHeight(secondImageRef);
CGSize mergedSize = CGSizeMake(MAX(firstWidth, secondWidth), MAX(firstHeight, secondHeight));
UIGraphicsBeginImageContext(mergedSize);
[firstImage drawInRect:CGRectMake(0, 0, firstWidth, firstHeight)];
[secondImage drawInRect:CGRectMake(0, 0, secondWidth, secondHeight)];
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return image;
}
畫水印
- (void) setImage:(UIImage *)image withWaterMark:(UIImage *)mark inRect:(CGRect)rect
{
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 4.0)
{
UIGraphicsBeginImageContextWithOptions(self.frame.size, NO, 0.0);
}
//原圖
[image drawInRect:self.bounds];
//水印圖
[mark drawInRect:rect];
UIImage *newPic = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
self.image = newPic;
}
獲取視頻的時長
+ (NSInteger)getVideoTimeByUrlString:(NSString *)urlString {
NSURL *videoUrl = [NSURL URLWithString:urlString];
AVURLAsset *avUrl = [AVURLAsset assetWithURL:videoUrl];
CMTime time = [avUrl duration];
int seconds = ceil(time.value/time.timescale);
return seconds;
}
-[ViewController aMethod:]: unrecognized selector sent to instance 0x7fe91e607fb0
這是一個經(jīng)典錯誤,ViewController不能響應(yīng)aMethod這個方法,錯誤原因可能viewController文件中沒有實現(xiàn)aMethod這個方法
讓手機(jī)震動一下
#import
AudioServicesPlayAlertSound(kSystemSoundID_Vibrate);
或者
AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);
將一個image保存在相冊中
UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil);
或者
#import
[[PHPhotoLibrary sharedPhotoLibrary] performChanges:^{
PHAssetChangeRequest *changeRequest = [PHAssetChangeRequest creationRequestForAssetFromImage:image];
changeRequest.creationDate = [NSDate date];
} completionHandler:^(BOOL success, NSError *error) {
if (success) {
NSLog(@"successfully saved");
}
else {
NSLog(@"error saving to photos: %@", error);
}
}];
UITextView中打開或禁用復(fù)制,剪切,選擇,全選等功能
// 繼承UITextView重寫這個方法
- (BOOL)canPerformAction:(SEL)action withSender:(id)sender
{
// 返回NO為禁用,YES為開啟
// 粘貼
if (action == @selector(paste:)) return NO;
// 剪切
if (action == @selector(cut:)) return NO;
// 復(fù)制
if (action == @selector(copy:)) return NO;
// 選擇
if (action == @selector(select:)) return NO;
// 選中全部
if (action == @selector(selectAll:)) return NO;
// 刪除
if (action == @selector(delete:)) return NO;
// 分享
if (action == @selector(share)) return NO;
return [super canPerformAction:action withSender:sender];
}
runtime為一個類動態(tài)添加屬性
// 動態(tài)添加屬性的本質(zhì)是: 讓對象的某個屬性與值產(chǎn)生關(guān)聯(lián)
objc_setAssociatedObject(self, WZBPlaceholderViewKey, placeholderView, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
KVO監(jiān)聽某個對象的屬性
// 添加監(jiān)聽者
[self addObserver:self forKeyPath:property options:NSKeyValueObservingOptionNew context:nil];
// 當(dāng)監(jiān)聽的屬性值變化的時候會來到這個方法
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
if ([keyPath isEqualToString:@"property"]) {
[self textViewTextChange];
} else {
}
}
網(wǎng)絡(luò)監(jiān)測
NetworkStatus status = [[Reachability reachabilityForInternetConnection] currentReachabilityStatus];
if (status == NotReachable) {
NSLog(@"當(dāng)前設(shè)備無網(wǎng)絡(luò)");
}
if (status == ReachableViaWiFi) {
NSLog(@"當(dāng)前wifi網(wǎng)絡(luò)");
}
if (status == NotReachable) {
NSLog(@"當(dāng)前蜂窩移動網(wǎng)絡(luò)");
}
webView中url特殊字符處理
中文的話會出現(xiàn)請求不成功的情況。
NSString *urlString = @"http://baidu?n=我們";
urlString = [urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSURL *url = [NSURL urlWithString:urlString];
特殊字符的問題。
空格 URL中的空格可以用+或者編碼%20
/ 分隔目錄和子目錄 %2F
? 分隔實際的URL和參數(shù) %3F
% 制定特殊字符 %25
# 表示書簽 %23
& URL中指定的參數(shù)間的分隔符 %26
= URL中指定參數(shù)的值 %3D
以空格為例
NSString *urlString = @"http://baidu?t=2012/9/1 20:00:30";
urlString = [urlString replaceOccurrencesOfString:@" " withString:@"%20"];