书写帮助类,有助于代码的复用和提高开发速度,也能使代码更加简洁。
��目前该帮助类已支持CocoaPods,
'pod MZLibrary'
��
注:代码具体的作用都有标注,可直接复制使用。
HLHelper.h
//
// MZHelper.h
// MZLibrary
//
// Created by MJCheung on 2017/10/11.
// Copyright © 2017年 HHL. All rights reserved.
//
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
@interface MZHelper : NSObject
/**1、 MD5加密 */
+ (NSString *)MD5:(NSString *)input;
/** 先MD5加密,再加盐,再MD5加密 */
+ (NSString *)MD5WithSalt:(NSString *)input;
/**2、 是否是空字符串 */
+ (BOOL)isEmpty:(NSString *)input;
/**3、 判断有效email */
+ (BOOL)validateEmail:(NSString *)email;
/**4、 是否为有效手机号码 */
+ (BOOL)isValidPhoneNumber:(NSString *)phoneNumber;
/**5、 判断是不是纯数字 */
+ (BOOL)isPureString:(NSString *)input;
/**6、 判断是否为有效身份证号码 */
+ (BOOL)isValidIDCard:(NSString *)IDCard;
/**7、 判断是否为汉字 */
+ (BOOL)isChineseCharacters:(NSString *)text;
/**8、 SHA256加密 */
+ (NSString*)SHA256:(NSString*)sha;
/**9、对较大金额进行逗号分隔 */
+ (NSString *)getMoneyStringWithMoneyNumber:(double)money;
/*10、 对一个字符串进行base64编码,并且返回 */
+ (NSString *)base64EncodeString:(NSString *)string;
/*11、 对base64编码之后的字符串解码,并且返回 **/
+ (NSString *)base64DecodeString:(NSString *)string;
/*12、 数字,字符或符号至少两种 **/
+ (BOOL)isSafePassword:(NSString *)strPwd;
/*13、 隐藏手机号的中间四位,如:13800138000 -> 138****8000 **/
+ (NSString *)encryptPhoneNumber:(NSString *)phoneStr;
/*14、 获取随机颜色**/
+ (UIColor *)getRandomColorWithAlpha:(CGFloat)alpha;
/*15、
* 判断用户输入的密码是否符合规范,符合规范的密码要求:·
1. 长度大于8位
2. 密码中必须同时包含数字和字母
*/
+ (BOOL)judgePassWordLegal:(NSString *)pass;
/**16、 不区分大小写,比较两个字符串是否相同 */
+ (BOOL)compareString:(NSString *)string CaseInsensitiveWithStr:(NSString *)string2;
//、 隐藏手机号的中间四位,如:13800138000 -> 13*******00
+ (NSString *)encryptAccount:(NSString *)phoneStr;
/** 17、
* 计算文字高度,可以处理计算带行间距的
*/
+ (CGSize)boundingRectWithText:(NSString *)textStr Size:(CGSize)size font:(UIFont*)font lineSpacing:(CGFloat)lineSpacing;
/**18、 隐藏名字的中间的字 */
+ (NSString *)hideMiddleString:(NSString *)input;
/** 187******81 */
+ (NSString *)hideAccountId:(NSString *)input;
/** 身份证号码:5130***********876 */
+ (NSString *)hideIDCard:(NSString *)input;
/** 只保留姓氏:张** */
+ (NSString *)hideName:(NSString *)input;
/** 隐藏公司名称:深圳************有限公司 */
+ (NSString *)hideCompany:(NSString *)input;
/** 后面的大为1、后面的小为-1, 相等为0 */
+ (int)compareDate:(NSString*)date01 withDate:(NSString*)date02;
/** 添加导航栏的返回按钮 */
+ (UIBarButtonItem *)leftBarButtonItemWithImage:(UIImage *)image action:(SEL)action;
/** 抖动动画 */
+ (void)shakeAnimationForView:(UIView *)view;
@end
.m
//
// MZHelper.m
// MZLibrary
//
// Created by MJCheung on 2017/10/11.
// Copyright © 2017年 HHL. All rights reserved.
//
#import "MZHelper.h"
//Libs
#import <CommonCrypto/CommonDigest.h>
@implementation MZHelper
// 1、MD5加密
+ (NSString *)MD5:(NSString *)input {
const char *cStr = [input UTF8String];
unsigned char digest[16];
CC_MD5(cStr, (unsigned int)strlen(cStr), digest ); // This is the md5 call
NSMutableString *output = [NSMutableString stringWithCapacity:CC_MD5_DIGEST_LENGTH * 2];
for(int i = 0; i < CC_MD5_DIGEST_LENGTH; i++) {
[output appendFormat:@"%02x", digest[i]];
}
NSString *encryptStr = [output uppercaseString];
return encryptStr;
}
//先MD5加密,再加盐,再MD5加密
+ (NSString *)MD5WithSalt:(NSString *)input {
NSMutableString *string = [NSMutableString stringWithString:[self MD5:input]];
[string appendString:@"HXWcjvQWVG1wI4FQBLZpQ3pWj48AV63d"];
NSString *encryptStr = [self MD5:[NSString stringWithString:string]];
return encryptStr;
}
// 2、判断是否为空字符串
+ (BOOL)isEmpty:(NSString *)input {
return [input isKindOfClass:[NSNull class]] || input == nil || [input length] <= 0;
}
// 3、判断有效email
+ (BOOL)validateEmail:(NSString *)email {
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:email];
}
// 4、判断是否为有效手机号码
+ (BOOL)isValidPhoneNumber:(NSString *)phoneNumber {
//增加173号段
NSString *regex =@"^((1[3-8][0-9])|(147)|(173)|(15[^4,\\D])|(18[0,5-9])|(199)|(198)|(166))\\d{8}$";
NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex];
return [pred evaluateWithObject:phoneNumber];
}
// 5、判断是不是纯数字
+ (BOOL)isPureString:(NSString *)input {
if([self isEmpty:input]){
return NO;
}
int len = (int)input.length;
for(int i = 0; i < len; i++){
unichar c = [input characterAtIndex:i];
if(!isnumber(c)){
return NO;
}
}
return YES;
}
// 6、判断是否为有效身份证号码
+ (BOOL)isValidIDCard:(NSString *)IDCard {
NSString *cardNumber = @"^\\d{15}(\\d\\d[0-9xX])?$";
NSPredicate *numberPre = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",cardNumber];
return [numberPre evaluateWithObject:IDCard];
}
// 7、判断输入的文字是否为汉字
+ (BOOL)isChineseCharacters:(NSString *)text {
NSString *textNumber = @"^[\u4E00-\u9FA5]*$";
NSPredicate *numberPre = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", textNumber];
return [numberPre evaluateWithObject:text];
}
// 8、对字符串进行SHA256加密
+ (NSString *)SHA256:(NSString *)sha {
const char *cstr = [sha cStringUsingEncoding:NSUTF8StringEncoding];
NSData *data = [NSData dataWithBytes:cstr length:sha.length];
// //使用对应的CC_SHA1,CC_SHA256,CC_SHA384,CC_SHA512的长度分别是20,32,48,64
uint8_t digest[CC_SHA256_DIGEST_LENGTH];
// //使用对应的CC_SHA256,CC_SHA384,CC_SHA512
CC_SHA256(data.bytes, (CC_LONG)data.length, digest);
NSMutableString* result = [NSMutableString stringWithCapacity:CC_SHA256_DIGEST_LENGTH];
for(int i = 0; i < CC_SHA256_DIGEST_LENGTH; i++) {
[result appendFormat:@"%02x", digest[i]];
}
return result;
}
// 9、对较大金额进行逗号分隔
+ (NSString *)getMoneyStringWithMoneyNumber:(double)money {
NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init];
// 设置格式
[numberFormatter setPositiveFormat:@"###,##0.00;"];
NSString *formattedNumberString = [numberFormatter stringFromNumber:[NSNumber numberWithDouble:money]];
return formattedNumberString;
}
// 10、对一个字符串进行base64编码,并且返回
+ (NSString *)base64EncodeString:(NSString *)string {
//1.先转换为二进制数据
NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding];
//2.对二进制数据进行base64编码,完成之后返回字符串
return [data base64EncodedStringWithOptions:0];
}
// 11、对base64编码之后的字符串解码,并且返回
+ (NSString *)base64DecodeString:(NSString *)string {
//注意:该字符串是base64编码后的字符串
//1.转换为二进制数据(完成了解码的过程)
NSData *data = [[NSData alloc] initWithBase64EncodedString:string options:0];
//2.把二进制数据在转换为字符串
return [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
}
// 12、 数字,字符或符号至少两种
+ (BOOL)isSafePassword:(NSString *)strPwd {
NSString *passWordRegex = @"^((?![0-9]+$)(?![a-zA-Z]+$)(?![~!@#$^&|*-_+=.?,]+$))[0-9A-Za-z~!@#$^&|*-_+=.?,]{6,20}$";
NSPredicate *regextestcm = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", passWordRegex];
if ([regextestcm evaluateWithObject:strPwd]) {
return YES;
} else {
return NO;
}
}
// 13、 隐藏手机号的中间四位,如:13800138000 -> 138****8000
+ (NSString *)encryptPhoneNumber:(NSString *)phoneStr {
if (phoneStr.length == 11) {
NSString *headStr = [phoneStr substringToIndex:3];
NSString *tailStr = [phoneStr substringFromIndex:7];
return [NSString stringWithFormat:@"%@****%@", headStr, tailStr];
}
return phoneStr;
}
// 14、获取随机颜色
+ (UIColor *)getRandomColorWithAlpha:(CGFloat)alpha {
float red = arc4random() % 100 / 100.0;
float green = arc4random() % 100 / 100.0;
float blue = arc4random() % 100 / 100.0;
UIColor *color = [UIColor colorWithRed:red green:green blue:blue alpha:alpha];
return color;
}
/*
* 判断用户输入的密码是否符合规范,符合规范的密码要求:
1. 长度大于8位
2. 密码中必须同时包含数字和字母
*/
+ (BOOL)judgePassWordLegal:(NSString *)pass {
BOOL result = NO;
if ([pass length] >= 8) {
// 判断长度大于8位后再接着判断是否同时包含数字和字符
NSString * regex = @"^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{8,16}$";
NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex];
result = [pred evaluateWithObject:pass];
}
return result;
}
/** 不区分大小写,比较两个字符串是否相同 */
+ (BOOL)compareString:(NSString *)string CaseInsensitiveWithStr:(NSString *)string2 {
BOOL isSame = [string compare:string2 options:NSCaseInsensitiveSearch] == NSOrderedSame;
return isSame;
}
//、 隐藏手机号的中间四位,如:13800138000 -> 13*******00
+ (NSString *)encryptAccount:(NSString *)phoneStr {
if (phoneStr.length == 11) {
NSString *headStr = [phoneStr substringToIndex:2];
NSString *tailStr = [phoneStr substringFromIndex:9];
return [NSString stringWithFormat:@"%@****%@", headStr, tailStr];
}
return phoneStr;
}
/** 17、
* 计算文字高度,可以处理计算带行间距的
*/
+ (CGSize)boundingRectWithText:(NSString *)textStr Size:(CGSize)size font:(UIFont*)font lineSpacing:(CGFloat)lineSpacing {
NSMutableAttributedString *attributeString = [[NSMutableAttributedString alloc] initWithString:textStr];
NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
paragraphStyle.lineSpacing = lineSpacing;
[attributeString addAttribute:NSParagraphStyleAttributeName value:paragraphStyle range:NSMakeRange(0, textStr.length)];
[attributeString addAttribute:NSFontAttributeName value:font range:NSMakeRange(0, textStr.length)];
NSStringDrawingOptions options = NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading;
CGRect rect = [attributeString boundingRectWithSize:size options:options context:nil];
//文本的高度减去字体高度小于等于行间距,判断为当前只有1行
if ((rect.size.height - font.lineHeight) <= paragraphStyle.lineSpacing) {
if ([self containChinese:textStr]) { //如果包含中文
rect = CGRectMake(rect.origin.x, rect.origin.y, rect.size.width, rect.size.height-paragraphStyle.lineSpacing);
}
}
return rect.size;
}
/**18、判断如果包含中文 */
+ (BOOL)containChinese:(NSString *)str {
for(int i=0; i< [str length];i++){ int a = [str characterAtIndex:i];
if( a > 0x4e00 && a < 0x9fff){
return YES;
}
}
return NO;
}
/**18、 隐藏名字的中间的字 */
+ (NSString *)hideMiddleString:(NSString *)input {
if (input.length <= 2) {
return [NSString stringWithFormat:@"%@ *", [input substringToIndex:1]];
}
return [NSString stringWithFormat:@"%@ * %@", [input substringToIndex:1], [input substringFromIndex:input.length - 1]];
}
/** 187******81 */
+ (NSString *)hideAccountId:(NSString *)input {
if (input.length > 3) {
return [NSString stringWithFormat:@"%@******%@", [input substringToIndex:3], [input substringFromIndex:input.length - 2]];
}
return input;
}
/** 身份证号码:5130***********876 */
+ (NSString *)hideIDCard:(NSString *)input {
if (input.length > 3) {
return [NSString stringWithFormat:@"%@***********%@", [input substringToIndex:4], [input substringFromIndex:input.length - 3]];
}
return input;
}
/** 只保留姓氏:张** */
+ (NSString *)hideName:(NSString *)input {
if (input.length > 1) {
return [NSString stringWithFormat:@"%@**", [input substringToIndex:1]];
}
return input;
}
/** 隐藏公司名称:深圳************有限公司 */
+ (NSString *)hideCompany:(NSString *)input {
if (input.length > 3) {
return [NSString stringWithFormat:@"%@***********%@", [input substringToIndex:3], [input substringFromIndex:input.length - 4]];
}
return input;
}
/** 后面的大为1、后面的小为-1, 相等为0 */
+ (int)compareDate:(NSString*)date01 withDate:(NSString*)date02 {
int ci;
NSDateFormatter *df = [[NSDateFormatter alloc]init];
[df setDateFormat:@"yyyy-MM-dd"];
NSDate *dt1 = [[NSDate alloc] init];
NSDate *dt2 = [[NSDate alloc] init];
dt1 = [df dateFromString:date01];
dt2 = [df dateFromString:date02];
NSComparisonResult result = [dt1 compare:dt2];
switch (result) {
//date02比date01大
caseNSOrderedAscending: ci=1;break;
//date02比date01小
caseNSOrderedDescending: ci=-1;break;
//date02=date01
case NSOrderedSame: ci=0;break;
default: NSLog(@"erorr dates %@, %@", dt2, dt1);break;
}
return ci;
}
/** 添加导航栏的返回按钮 */
+ (UIBarButtonItem *)leftBarButtonItemWithImage:(UIImage *)image action:(SEL)action {
UIButton *backBtn = [UIButton buttonWithType:UIButtonTypeCustom];
backBtn.frame = CGRectMake(0, 0, 30, 30);
[backBtn setImage:image forState:UIControlStateNormal];
[backBtn addTarget:self action:action forControlEvents:UIControlEventTouchUpInside];
[backBtn setImageEdgeInsets:UIEdgeInsetsMake(0, -5, 0, 5)];
UIBarButtonItem *leftItem = [[UIBarButtonItem alloc] initWithCustomView:backBtn];
return leftItem;
}
/** 抖动动画 */
+ (void)shakeAnimationForView:(UIView *)view {
CALayer *viewLayer = view.layer;
CGPoint position = viewLayer.position;
CGPoint left = CGPointMake(position.x - 10, position.y);
CGPoint right = CGPointMake(position.x + 10, position.y);
CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"position"];
[animation setTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]];
[animation setFromValue:[NSValue valueWithCGPoint:left]];
[animation setToValue:[NSValue valueWithCGPoint:right]];
[animation setAutoreverses:YES]; // 平滑结束
[animation setDuration:0.08];
[animation setRepeatCount:3];
[viewLayer addAnimation:animation forKey:nil];
}
@end