IOS工具方法小节

本文汇总了一系列iOS开发中常用的工具方法,包括日期处理、电话号码验证、数字格式化、邮箱验证、3DES加密解密、字符串操作及图片处理等实用功能。

IOS工具方法

时间方法

/**
 *  获得日期对象
 *
 *  @return 日期
 */
+ (NSDateComponents *)getComponents
{
    //1.获取当前月
    return [[NSCalendar currentCalendar] components:
                                  NSYearCalendarUnit|
                                  NSMonthCalendarUnit|
                                  NSDayCalendarUnit|
                                  NSWeekdayCalendarUnit|
                                  NSWeekOfMonthCalendarUnit fromDate:[NSDate date]];
}

#pragma mark - 根据月份的数字获得中文的月份

+ (NSString *)getMonthByMonthDigtal:(NSInteger)month
{
    NSString *monthStr = nil;
    switch (month) {
        case 1:
            monthStr = @"一月";
            break;
        case 2:
            monthStr = @"二月";
            break;
        case 3:
            monthStr = @"三月";
            break;
        case 4:
            monthStr = @"四月";
            break;
        case 5:
            monthStr = @"五月";
            break;
        case 6:
            monthStr = @"六月";
            break;
        case 7:
            monthStr = @"七月";
            break;
        case 8:
            monthStr = @"八月";
            break;
        case 9:
            monthStr = @"九月";
            break;
        case 10:
            monthStr = @"十月";
            break;
        case 11:
            monthStr = @"十一月";
            break;
        case 12:
            monthStr = @"十二月";
            break;
        default:
            break;
    }
    return monthStr;
}
/**
 *  获取每月的最后一天
 *
 *  @param month 月
 *
 *  @return 最后一天
 */
+ (NSInteger)getMonthLastDay:(NSInteger)month
{
    NSInteger lastDay = 0;
    switch (month) {
        case 1:
        case 3:
        case 5:
        case 7:
        case 8:
        case 10:
        case 12:
            lastDay = 31;
            break;
        case 2:
            lastDay = 28;
            break;
        case 4:
        case 6:
        case 9:
        case 11:
            lastDay = 30;
            break;

        default:
            break;
    }
    return lastDay;
}

/**
 *  获得当前月的结束时间
 *
 *  @return 结束时间
 */
+ (long long)getCurrentMonthEndTime
{
    NSDateComponents *compnents = [self getComponents];
    NSString *timeStr = [NSString stringWithFormat:@"%zd-%zd-%zd 23:59:59",compnents.year,compnents.month,[ETool getMonthLastDay:compnents.month]];

    NSDate *timeDate = [EKBTimeFormatter getDateTimeFromDateStr:timeStr];
    long long currentTime = [EKBTimeFormatter getDateTimeTOMilliSeconds:timeDate];

    return currentTime;
}
/**
 *  获得当年的开始时间
 *
 *  @return 当前年的开始时间
 */
+ (long long)getCurrentYearStartTime
{
    NSDateComponents *compnents = [self getComponents];

    NSString *startStr = [NSString stringWithFormat:@"%zd-01-01 00:00:00",compnents.year];
    NSDate *startTime = [EKBTimeFormatter getDateTimeFromDateStr:startStr];

    return [EKBTimeFormatter getDateTimeTOMilliSeconds:startTime];
}

电话号码判断

+ (BOOL)isMobileNumber:(NSString *)mobileNum
{
    /**
     * 手机号码
     * 移动:134[0-8],135,136,137,138,139,150,151,157,158,159,182,187,188
     * 联通:130,131,132,152,155,156,185,186
     * 电信:133,1349,153,180,189
     */
    NSString * MOBILE = @"^1(3[0-9]|5[0-35-9]|7[06-8]|8[025-9])\\d{8}$";
    /**
     * 中国移动:China Mobile
     * 134[0-8],135,136,137,138,139,150,151,157,158,159,182,187,188
     */
    NSString * CM = @"^1(34[0-8]|(3[5-9]|5[017-9]|8[278])\\d)\\d{7}$";
    /**
     * 中国联通:China Unicom
     * 130,131,132,152,155,156,185,186
     */
    NSString * CU = @"^1(3[0-2]|5[256]|8[56])\\d{8}$";
    /**
     * 中国电信:China Telecom
     * 133,1349,153,180,189
     */
    NSString * CT = @"^1((33|53|8[019])[0-9]|349)\\d{7}$";
    /**
     * 虚拟运营商
     * 中国电信:1700
     * 中国联通:1709
     * 中国移动:1705
     */
    NSString * VNO = @"^1(700|705|709)\\d{7}$";
    /**
     *  测试用:199开头
     */
    NSString *testNu = @"^1(99)\\d{8}$";

    NSPredicate *regextestmobile = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", MOBILE];
    NSPredicate *regextestcm = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", CM];
    NSPredicate *regextestcu = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", CU];
    NSPredicate *regextestct = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", CT];
    NSPredicate *regextestvno = [NSPredicate predicateWithFormat:@"SELF MATCHES%@", VNO];
    NSPredicate *regextestTestNu = [NSPredicate predicateWithFormat:@"SELF MATCHES%@", testNu];

    if (([regextestmobile evaluateWithObject:mobileNum] == YES)
        || ([regextestcm evaluateWithObject:mobileNum] == YES)
        || ([regextestct evaluateWithObject:mobileNum] == YES)
        || ([regextestcu evaluateWithObject:mobileNum] == YES)
        || ([regextestvno evaluateWithObject:mobileNum] == YES)
        || ([regextestTestNu evaluateWithObject:mobileNum] == YES))
    {
        return YES;
    }
    else
    {
        return NO;
    }
}

数字格式化

 *  格式化数字为千位分隔符数字
 *
 *  @param number 要格式化的数字
 *
 *  @return 格式化之后的字符串
 */
+ (NSString *)formatThousandSeparatorFromDigital:(NSNumber *)number
{
    NSNumberFormatter *formatter = [[NSNumberFormatter alloc]init];
    [formatter setPositiveFormat:@"###,##0.00;"];
    return [formatter stringFromNumber:number];
}

/**
 *  从千位分隔符字符串中获取数字
 *
 *  @param number 千位分隔符字符串
 *
 *  @return 数字
 */
+ (NSNumber *)formatThousandSeparatorFromString:(NSString *)numberString
{
    NSNumberFormatter *formatter = [[NSNumberFormatter alloc]init];
    [formatter setPositiveFormat:@"###,##0.00;"];
    return [formatter numberFromString:numberString];
}

邮箱合法性

/**
 *  验证邮箱的合法性
 *
 *  @param email 要验证的邮箱
 *
 *  @return 是否是邮箱
 */
+ (BOOL)isValidateEmail:(NSString *)email
{
    NSString *emailRegex = @"[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}";
    NSPredicate *emailPredicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", emailRegex];
    return [emailPredicate evaluateWithObject:email];
}

3DES加密解密算法

// 加密方法
- (NSString*)encrypt{
    NSData* data = [self dataUsingEncoding:NSUTF8StringEncoding];
    size_t plainTextBufferSize = [data length];
    const void *vplainText = (const void *)[data bytes];

    CCCryptorStatus ccStatus;
    uint8_t *bufferPtr = NULL;
    size_t bufferPtrSize = 0;
    size_t movedBytes = 0;

    bufferPtrSize = (plainTextBufferSize + kCCBlockSize3DES) & ~(kCCBlockSize3DES - 1);
    bufferPtr = malloc( bufferPtrSize * sizeof(uint8_t));
    memset((void *)bufferPtr, 0x0, bufferPtrSize);

    const void *vkey = (const void *) [EKBThirdAccountInfo12306PasswordKey UTF8String];
    const void *vinitVec = (const void *) [gIv UTF8String];

    ccStatus = CCCrypt(kCCEncrypt,
                       kCCAlgorithm3DES,
                       kCCOptionPKCS7Padding,
                       vkey,
                       kCCKeySize3DES,
                       vinitVec,
                       vplainText,
                       plainTextBufferSize,
                       (void *)bufferPtr,
                       bufferPtrSize,
                       &movedBytes);

    NSData *myData = [NSData dataWithBytes:(const void *)bufferPtr length:(NSUInteger)movedBytes];
    NSString *result = [GTMBase64 stringByEncodingData:myData];
    return result;
}

// 解密方法
- (NSString*)decrypt
{
    NSData *encryptData = [GTMBase64 decodeData:[self dataUsingEncoding:NSUTF8StringEncoding]];
    size_t plainTextBufferSize = [encryptData length];
    const void *vplainText = [encryptData bytes];

    CCCryptorStatus ccStatus;
    uint8_t *bufferPtr = NULL;
    size_t bufferPtrSize = 0;
    size_t movedBytes = 0;

    bufferPtrSize = (plainTextBufferSize + kCCBlockSize3DES) & ~(kCCBlockSize3DES - 1);
    bufferPtr = malloc( bufferPtrSize * sizeof(uint8_t));
    memset((void *)bufferPtr, 0x0, bufferPtrSize);

    const void *vkey = (const void *) [EKBThirdAccountInfo12306PasswordKey UTF8String];
    const void *vinitVec = (const void *) [gIv UTF8String];

    ccStatus = CCCrypt(kCCDecrypt,
                       kCCAlgorithm3DES,
                       kCCOptionPKCS7Padding,
                       vkey,
                       kCCKeySize3DES,
                       vinitVec,
                       vplainText,
                       plainTextBufferSize,
                       (void *)bufferPtr,
                       bufferPtrSize,
                       &movedBytes);

    NSString *result = [[NSString alloc] initWithData:[NSData dataWithBytes:(const void *)bufferPtr
                                                                     length:(NSUInteger)movedBytes] encoding:NSUTF8StringEncoding];
    return result;
}

字符串宽高算法

- (CGSize)sizeWithFont:(UIFont *)font maxRectSize:(CGSize)maxSize
{
    NSDictionary *attributes = @{NSFontAttributeName:font};
    return [self boundingRectWithSize:maxSize options:NSStringDrawingUsesLineFragmentOrigin attributes:attributes context:nil].size;
}

字符串匹配(谓词)传入正则字符串

//获得第一个匹配项
- (NSString *)firstMatchWithPattern:(NSString *)pattern
{
    NSError *error;
    //1.指定匹配方案
    NSRegularExpression *regular = [[NSRegularExpression alloc] initWithPattern:pattern options:NSRegularExpressionCaseInsensitive | NSRegularExpressionDotMatchesLineSeparators  error:&error];
    if (error) {
        NSLog(@"%@",error.localizedDescription);
        return nil;
    }
    NSTextCheckingResult *result = [regular firstMatchInString:self options:NSRegularExpressionDotMatchesLineSeparators | NSRegularExpressionCaseInsensitive range:NSMakeRange(0, self.length)];
    if (result) {
        NSRange range = [result rangeAtIndex:1];
        return [self substringWithRange:range];
    }
    return nil;
}
#pragma mark - 匹配多项
- (NSArray *)matchsWithPattern:(NSString *)pattern
{
    NSError *error;
    //1.指定匹配方案
    NSRegularExpression *regular = [[NSRegularExpression alloc] initWithPattern:pattern options:NSRegularExpressionCaseInsensitive | NSRegularExpressionDotMatchesLineSeparators  error:&error];

    if (error) {
        NSLog(@"%@",error.localizedDescription);
        return nil;
    }

    //    NSTextCheckingResult *result = [regular firstMatchInString:html options:NSRegularExpressionDotMatchesLineSeparators | NSRegularExpressionCaseInsensitive range:NSMakeRange(0, html.length)];
    NSArray *array =  [regular matchesInString:self options:NSRegularExpressionDotMatchesLineSeparators | NSRegularExpressionCaseInsensitive range:NSMakeRange(0, self.length)];

    if ([array count] > 0) {
        return  array;
    }
    return nil;
}

#pragma mark 截断收尾空白字符
- (NSString *)trimString
{
    return [self stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
}

图片处理改变尺寸,拉伸位置

+ (UIImage *)resizeWithName:(NSString *)imageName
{
    return [self resizeWithName:imageName leftRate:0.5 topRatio:0.5];
}

+ (UIImage *)resizeWithName:(NSString *)imageName leftRate:(CGFloat)leftRate topRatio:(CGFloat)topRatio
{
    UIImage *image = [self imageWithName:imageName];
    CGFloat left = image.size.width * leftRate;
    CGFloat top = image.size.height * topRatio;
    return [image stretchableImageWithLeftCapWidth:left topCapHeight:top];
}

-(UIImage *)scaleImage:(UIImage *)image toScale:(float)scaleSize
{
    UIGraphicsBeginImageContext(CGSizeMake(image.size.width*scaleSize,image.size.height*scaleSize));
    [image drawInRect:CGRectMake(0, 0, image.size.width * scaleSize, image.size.height *scaleSize)];
    UIImage *scaledImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return scaledImage;
}

- (UIImage *) imageWithTintColor:(UIColor *)tintColor
{
    UIGraphicsBeginImageContextWithOptions(self.size, NO, 0.0f);
    [tintColor setFill];
    CGRect bounds = CGRectMake(0, 0, self.size.width, self.size.height);
    UIRectFill(bounds);

    [self drawInRect:bounds blendMode:kCGBlendModeDestinationIn alpha:1.0f];

    UIImage *tintedImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    return tintedImage;
}

TableViewCell在Nib加载代码重用

@implementation UITableViewCell (Reuse)

+ (instancetype )cellWithTableView:(UITableView *)tableView
{
    return [self cellWithTableView:tableView createBlock:nil];
}

+ (instancetype )cellWithTableView:(UITableView *)tableView
                               createBlock:(UITableViewCell *(^)(NSString *reuseIdentifier))createBlock
{
    return [self cellWithTableView:tableView createBlock:createBlock initialBlock:nil];
}

+ (instancetype )cellWithTableView:(UITableView *)tableView
                              initialBlock:(void(^)(UITableViewCell *))initialBlock
{
    return [self cellWithTableView:tableView createBlock:nil initialBlock:initialBlock];
}

+ (instancetype )cellWithTableView:(UITableView *)tableView
                               createBlock:(UITableViewCell *(^)(NSString *reuseIdentifier))createBlock
                              initialBlock:(void(^)(UITableViewCell *))initialBlock
{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:self.description];
    if (!cell) {
        NSString *xibPath = [[NSBundle mainBundle] pathForResource:[self xibName] ofType:@"nib"];
        if (xibPath) {
            cell = [self createViewFromXibWithOwner:nil];
        } else {
            if (createBlock) {
                cell = createBlock(self.description);
            } else {
                cell = [[self alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:self.description];
            }
        }
        if (initialBlock) {
            initialBlock(cell);
        }
    }
    return cell;
}

@end

UIView属性处理x, y, width, height,圆角,抖动动画设置

@implementation UIView (Self)

- (void)setX:(CGFloat)x
{
    CGRect frame = self.frame;
    frame.origin.x = x;
    self.frame = frame;
}
- (CGFloat)x
{
    return self.frame.origin.x;
}
- (void)setY:(CGFloat)y
{
    CGRect frame = self.frame;
    frame.origin.y = y;
    self.frame = frame;
}
- (CGFloat)y
{
    return self.frame.origin.y;
}
- (void)setCentreX:(CGFloat)centreX
{
    CGPoint center = self.center;
    center.x = centreX;
    self.center = center;

}
- (CGFloat)centreX
{
    return self.center.x;
}
- (void)setCentreY:(CGFloat)centreY
{
    CGPoint center = self.center;
    center.y = centreY;
    self.center = center;
}
- (CGFloat)centreY
{
    return self.center.y;
}

- (void)setWidth:(CGFloat)width
{
    CGRect frame = self.frame;
    frame.size.width = width;
    self.frame = frame;
}

- (CGFloat)width
{
    return self.frame.size.width;
}

- (void)setHeight:(CGFloat)height
{
    CGRect frame = self.frame;
    frame.size.height = height;
    self.frame = frame;
}

- (CGFloat)height
{
    return self.frame.size.height;
}

- (void)setSize:(CGSize)size
{
    CGRect frame = self.frame;
    frame.size = size;
    self.frame = frame;
}

- (CGSize)size
{
    return self.frame.size;
}

#pragma mark - 设置视图圆角

/**
 *  设置顶部圆角
 */
- (void)setCornerOnTop
{
    UIBezierPath *maskPath;
    maskPath = [UIBezierPath bezierPathWithRoundedRect:self.bounds
                                     byRoundingCorners:(UIRectCornerTopLeft | UIRectCornerTopRight)
                                           cornerRadii:CGSizeMake(10.0f, 10.0f)];
    CAShapeLayer *maskLayer = [[CAShapeLayer alloc] init];
    maskLayer.frame = self.bounds;
    maskLayer.path = maskPath.CGPath;
    self.layer.mask = maskLayer;

}
/**
 *  设置底部圆角
 */
- (void)setCornerOnBottom
{
    UIBezierPath *maskPath;
    maskPath = [UIBezierPath bezierPathWithRoundedRect:self.bounds
                                     byRoundingCorners:(UIRectCornerBottomLeft | UIRectCornerBottomRight)
                                           cornerRadii:CGSizeMake(10.0f, 10.0f)];
    CAShapeLayer *maskLayer = [[CAShapeLayer alloc] init];
    maskLayer.frame = self.bounds;
    maskLayer.path = maskPath.CGPath;
    self.layer.mask = maskLayer;

}
/**
 *  设置所有圆角
 */
- (void)setAllCorner
{
    UIBezierPath *maskPath;
    maskPath = [UIBezierPath bezierPathWithRoundedRect:self.bounds
                                          cornerRadius:10.0];
    CAShapeLayer *maskLayer = [[CAShapeLayer alloc] init];
    maskLayer.frame = self.bounds;
    maskLayer.path = maskPath.CGPath;
    self.layer.mask = maskLayer;

}
/**
 *  设置没有圆角
 */
- (void)setNoneCorner
{
    self.layer.mask = nil;
}
/**
 *  设置左边圆角
 */
- (void)setCornerOnLeft
{
    UIBezierPath *maskPath;
    maskPath = [UIBezierPath bezierPathWithRoundedRect:self.bounds
                                     byRoundingCorners:(UIRectCornerTopLeft | UIRectCornerBottomLeft)
                                           cornerRadii:CGSizeMake(5.0f, 5.0f)];
    CAShapeLayer *maskLayer = [[CAShapeLayer alloc] init];
    maskLayer.frame = self.bounds;
    maskLayer.path = maskPath.CGPath;
    self.layer.mask = maskLayer;
}
/**
 *  设置右边圆角
 */
- (void)setCornerOnRight
{
    UIBezierPath *maskPath;
    maskPath = [UIBezierPath bezierPathWithRoundedRect:self.bounds   byRoundingCorners:(UIRectCornerTopRight | UIRectCornerBottomRight)                           cornerRadii:CGSizeMake(5.0f, 5.0f)];
    CAShapeLayer *maskLayer = [[CAShapeLayer alloc] init];
    maskLayer.frame = self.bounds;
    maskLayer.path = maskPath.CGPath;
    self.layer.mask = maskLayer;
}
/**
 *  晃动提醒动画
 */
-(void)shakeWithtTanslation:(CGFloat)translation
    if (translation) {
        [self.layer removeAllAnimations];
        CAKeyframeAnimation * animation = [CAKeyframeAnimation animationWithKeyPath:@"transform.translation.x"];
        CGFloat currentTx = self.transform.tx;

        animation.duration = 0.5;
        animation.values = @[ @(currentTx), @(currentTx + translation), @(currentTx-translation*0.5), @(currentTx + translation*0.5), @(currentTx) ];
        animation.keyTimes = @[ @(0), @(0.25), @(0.5), @(0.75), @(1) ];
        animation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
        [self.layer addAnimation:animation forKey:@"shake"];
    }
}
@end
下载方式:https://pan.quark.cn/s/a4b39357ea24 布线问题(分支限界算法)是计算机科学和电子工程领域中一个广为人知的议题,它主要探讨如何在印刷电路板上定位两个节点间最短的连接路径。 在这一议题中,电路板被构建为一个包含 n×m 个方格的矩阵,每个方格能够被界定为可通行或不可通行,其核心任务是定位从初始点到最终点的最短路径。 分支限界算法是处理布线问题的一种常用策略。 该算法与回溯法有相似之处,但存在差异,分支限界法仅需获取满足约束条件的一个最优路径,并按照广度优先或最小成本优先的原则来探索解空间树。 树 T 被构建为子集树或排列树,在探索过程中,每个节点仅被赋予一次成为扩展节点的机会,且会一次性生成其全部子节点。 针对布线问题的解决,队列式分支限界法可以被采用。 从起始位置 a 出发,将其设定为首个扩展节点,并将与该扩展节点相邻且可通行的方格加入至活跃节点队列中,将这些方格标记为 1,即从起始方格 a 到这些方格的距离为 1。 随后,从活跃节点队列中提取队首节点作为下一个扩展节点,并将与当前扩展节点相邻且未标记的方格标记为 2,随后将这些方格存入活跃节点队列。 这一过程将持续进行,直至算法探测到目标方格 b 或活跃节点队列为空。 在实现上述算法时,必须定义一个类 Position 来表征电路板上方格的位置,其成员 row 和 col 分别指示方格所在的行和列。 在方格位置上,布线能够沿右、下、左、上四个方向展开。 这四个方向的移动分别被记为 0、1、2、3。 下述表格中,offset[i].row 和 offset[i].col(i=0,1,2,3)分别提供了沿这四个方向前进 1 步相对于当前方格的相对位移。 在 Java 编程语言中,可以使用二维数组...
源码来自:https://pan.quark.cn/s/a4b39357ea24 在VC++开发过程中,对话框(CDialog)作为典型的用户界面组件,承担着与用户进行信息交互的重要角色。 在VS2008SP1的开发环境中,常常需要满足为对话框配置个性化背景图片的需求,以此来优化用户的操作体验。 本案例将系统性地阐述在CDialog框架下如何达成这一功能。 首先,需要在资源设计工具中构建一个新的对话框资源。 具体操作是在Visual Studio平台中,进入资源视图(Resource View)界面,定位到对话框(Dialog)分支,通过右键选择“插入对话框”(Insert Dialog)选项。 完成对话框内控件的布局设计后,对对话框资源进行保存。 随后,将着手进行背景图片的载入工作。 通常有两种主要的技术路径:1. **运用位图控件(CStatic)**:在对话框界面中嵌入一个CStatic控件,并将其属性设置为BST_OWNERDRAW,从而具备自主控制绘制过程的权限。 在对话框的类定义中,需要重写OnPaint()函数,负责调用图片资源并借助CDC对象将其渲染到对话框表面。 此外,必须合理处理WM_CTLCOLORSTATIC消息,确保背景图片的展示不会受到其他界面元素的干扰。 ```cppvoid CMyDialog::OnPaint(){ CPaintDC dc(this); // 生成设备上下文对象 CBitmap bitmap; bitmap.LoadBitmap(IDC_BITMAP_BACKGROUND); // 获取背景图片资源 CDC memDC; memDC.CreateCompatibleDC(&dc); CBitmap* pOldBitmap = m...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值