产品开发中几个小功能的封装,很好用~~

版本记录

版本号 修改时间
2017.04.29 V1.0

前言

工程中我们总需要为各种各样的小功能进行封装,这样团队使用的时候,可以调用这些封装好的小模块或者小功能,就不用从底层开始一个个的写了,这样可以加快开发速度,缩短开发周期,下面我就写几个封装好的小功能,想起来几个就写几个,以后我会更新。

详情

一、十六进制字符串转颜色色值

  我们知道oc中,只有r g b a转化颜色色值,如下:

// Convenience methods for creating colors
+ (UIColor *)colorWithWhite:(CGFloat)white alpha:(CGFloat)alpha;
+ (UIColor *)colorWithHue:(CGFloat)hue saturation:(CGFloat)saturation brightness:(CGFloat)brightness alpha:(CGFloat)alpha;
+ (UIColor *)colorWithRed:(CGFloat)red green:(CGFloat)green blue:(CGFloat)blue alpha:(CGFloat)alpha;
+ (UIColor *)colorWithDisplayP3Red:(CGFloat)displayP3Red green:(CGFloat)green blue:(CGFloat)blue alpha:(CGFloat)alpha NS_AVAILABLE_IOS(10_0);
+ (UIColor *)colorWithCGColor:(CGColorRef)cgColor;
+ (UIColor *)colorWithPatternImage:(UIImage *)image;
#if __has_include(<CoreImage/CoreImage.h>)
+ (UIColor *)colorWithCIColor:(CIColor *)ciColor NS_AVAILABLE_IOS(5_0);
#endif

// Initializers for creating colors
- (UIColor *)initWithWhite:(CGFloat)white alpha:(CGFloat)alpha;
- (UIColor *)initWithHue:(CGFloat)hue saturation:(CGFloat)saturation brightness:(CGFloat)brightness alpha:(CGFloat)alpha;
- (UIColor *)initWithRed:(CGFloat)red green:(CGFloat)green blue:(CGFloat)blue alpha:(CGFloat)alpha;
- (UIColor *)initWithDisplayP3Red:(CGFloat)displayP3Red green:(CGFloat)green blue:(CGFloat)blue alpha:(CGFloat)alpha NS_AVAILABLE_IOS(10_0);
- (UIColor *)initWithCGColor:(CGColorRef)cgColor;
- (UIColor *)initWithPatternImage:(UIImage*)image;
#if __has_include(<CoreImage/CoreImage.h>)
- (UIColor *)initWithCIColor:(CIColor *)ciColor NS_AVAILABLE_IOS(5_0);
#endif

  可以发现并没有十六进制转化为颜色的接口,这里提供了一个,不多说了直接看代码,先看一下代码组织结构。

代码组织结构

直接看代码吧。

1. AppDelegate.m

#import "AppDelegate.h"
#import "JJMainVC.h"


@interface AppDelegate ()

@end

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    
    self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
    JJMainVC *mainVC = [[JJMainVC alloc] init];
    self.window.rootViewController = mainVC;
    [self.window makeKeyAndVisible];
    
    return YES;
}

@ end


2. JJMainVC.m
#import "JJMainVC.h"
#import "UIColor+JJUIColor.h"
#import "Masonry.h"

@interface JJMainVC ()

@property (nonatomic, strong) UILabel *titleLabel;
@property (nonatomic, strong) UIButton *avatarButton;

@end

@implementation JJMainVC

#pragma mark - Override Base Function

- (void)viewDidLoad
{
    [super viewDidLoad];
    
    [self setupUI];
    
}

- (void)viewWillLayoutSubviews
{
    [super viewWillLayoutSubviews];
    
    //用户描述
    [self.titleLabel sizeToFit];
    [self.titleLabel mas_makeConstraints:^(MASConstraintMaker *make) {
        make.top.equalTo(self.view).offset(100.0);
        make.left.equalTo(self.view).offset(100.0);
    }];
    

}

#pragma mark - Object Private Function

- (void)setupUI
{
    self.view.backgroundColor = [UIColor lightGrayColor];
    
    //用户描述
    UILabel *titleLabel = [[UILabel alloc] init];
    titleLabel.text = @"看我是什么颜色";
    titleLabel.textColor = [UIColor colorWithHexString:@"FF00FF"];
    [self.view addSubview:titleLabel];
    self.titleLabel = titleLabel;
    
}

@end


3. UIColor+JJUIColor.h
#import <UIKit/UIKit.h>

@interface UIColor (JJUIColor)

/**
 Creates and returns a color object from hex string.
 
 @discussion:
 Valid format: #RGB #RGBA #RRGGBB #RRGGBBAA 0xRGB ...
 The `#` or "0x" sign is not required.
 The alpha will be set to 1.0 if there is no alpha component.
 It will return nil when an error occurs in parsing.
 
 Example: @"0xF0F", @"66ccff", @"#66CCFF88"
 
 @param hexStr  The hex string value for the new color.
 
 @return        An UIColor object from string, or nil if an error occurs.
 */

+ (instancetype)colorWithHexString:(NSString *)hexStr;

@end

4. UIColor+JJUIColor.m

#import "UIColor+JJUIColor.h"
#import "NSString+JJNSString.h"

@implementation UIColor (JJUIColor)

#pragma mark - Object Base Function

+ (instancetype)colorWithHexString:(NSString *)hexStr {
    CGFloat r, g, b, a;
    if (hexStrToRGBA(hexStr, &r, &g, &b, &a)) {
        return [UIColor colorWithRed:r green:g blue:b alpha:a];
    }
    return nil;
}

static BOOL hexStrToRGBA(NSString *str,
                         CGFloat *r, CGFloat *g, CGFloat *b, CGFloat *a) {
    str = [[str stringByTrim] uppercaseString];
    if ([str hasPrefix:@"#"]) {
        str = [str substringFromIndex:1];
    } else if ([str hasPrefix:@"0X"]) {
        str = [str substringFromIndex:2];
    }
    
    NSUInteger length = [str length];
    //         RGB            RGBA          RRGGBB        RRGGBBAA
    if (length != 3 && length != 4 && length != 6 && length != 8) {
        return NO;
    }
    
    //RGB,RGBA,RRGGBB,RRGGBBAA
    if (length < 5) {
        *r = hexStrToInt([str substringWithRange:NSMakeRange(0, 1)]) / 255.0f;
        *g = hexStrToInt([str substringWithRange:NSMakeRange(1, 1)]) / 255.0f;
        *b = hexStrToInt([str substringWithRange:NSMakeRange(2, 1)]) / 255.0f;
        if (length == 4)  *a = hexStrToInt([str substringWithRange:NSMakeRange(3, 1)]) / 255.0f;
        else *a = 1;
    }
    else {
        *r = hexStrToInt([str substringWithRange:NSMakeRange(0, 2)]) / 255.0f;
        *g = hexStrToInt([str substringWithRange:NSMakeRange(2, 2)]) / 255.0f;
        *b = hexStrToInt([str substringWithRange:NSMakeRange(4, 2)]) / 255.0f;
        if (length == 8) *a = hexStrToInt([str substringWithRange:NSMakeRange(6, 2)]) / 255.0f;
        else *a = 1;
    }
    return YES;
}


static inline NSUInteger hexStrToInt(NSString *str)
{
    uint32_t result = 0;
    sscanf([str UTF8String], "%X", &result);
    return result;
}

@end


5. NSString+JJNSString.h
#import <Foundation/Foundation.h>

@interface NSString (JJNSString)

- (NSString *)stringByTrim;

@end


6. NSString+JJNSString.m
#import "NSString+JJNSString.h"

@implementation NSString (JJNSString)

- (NSString *)stringByTrim
{
    NSCharacterSet *set = [NSCharacterSet whitespaceAndNewlineCharacterSet];
    return [self stringByTrimmingCharactersInSet:set];
}

@end

我们直接看结果。

色值结果

二、图片切圆角

图片切圆角,其实就是切layer,就是两句话。

    self.avatarButton.layer.cornerRadius = 15.0;
    self.avatarButton.layer.masksToBounds = YES;

  但是这里有一个问题,图片少的话还可以,但是如果一个tableview上有很多图片的话,滑动的时候这么切圆角就很耗cpu性能,就会出现卡顿,这里有个方法就是画上去。

先看代码结构。

代码结构

  我这里红色的部分就是对上面增加的部分,我只列出改变的部分吧。看代码。

1. JJMainVC.m

#import "JJMainVC.h"
#import "UIColor+JJUIColor.h"
#import "Masonry.h"
#import "UIImage+JJImage.h"

@interface JJMainVC ()

@property (nonatomic, strong) UILabel *titleLabel;
@property (nonatomic, strong) UIButton *avatarButton;

@end

@implementation JJMainVC

#pragma mark - Override Base Function

- (void)viewDidLoad
{
    [super viewDidLoad];
    
    [self setupUI];
    
}

- (void)viewWillLayoutSubviews
{
    [super viewWillLayoutSubviews];
    
    
    //用户描述
    [self.titleLabel sizeToFit];
    [self.titleLabel mas_makeConstraints:^(MASConstraintMaker *make) {
        make.top.equalTo(self.view).offset(100.0);
        make.left.equalTo(self.view).offset(100.0);
    }];
    
    //头像
    [self.avatarButton mas_makeConstraints:^(MASConstraintMaker *make) {
        make.centerX.equalTo(self.view);
        make.top.equalTo(self.titleLabel.mas_bottom).offset(15.0);
        make.width.height.equalTo(@100);
    }];
    

}

#pragma mark - Object Private Function

- (void)setupUI
{
    self.view.backgroundColor = [UIColor lightGrayColor];
    
    //用户描述
    UILabel *titleLabel = [[UILabel alloc] init];
    titleLabel.text = @"看我是什么颜色";
    titleLabel.textColor = [UIColor colorWithHexString:@"FF00FF"];
    [self.view addSubview:titleLabel];
    self.titleLabel = titleLabel;
    
    //头像
    UIButton *avatarButton = [UIButton buttonWithType:UIButtonTypeCustom];
    [avatarButton setImage:[[UIImage imageNamed:@"71r58PICmDM_1024.jpg"] circleImage] forState:UIControlStateNormal];
    [self.view addSubview:avatarButton];
    self.avatarButton = avatarButton;
}

@end


2. UIImage+JJImage.h

#import <UIKit/UIKit.h>

@interface UIImage (JJImage)

- (UIImage *)circleImage;

@end


3. UIImage+JJImage.m
#import "UIImage+JJImage.h"

@implementation UIImage (JJImage)

- (UIImage *)circleImage
{
    
    // 开始图形上下文
    UIGraphicsBeginImageContextWithOptions(self.size, NO, 0.0);
    
    // 获得图形上下文
    CGContextRef ctx = UIGraphicsGetCurrentContext();
    
    // 设置一个范围
    CGRect rect = CGRectMake(0, 0, self.size.width, self.size.height);
    
    // 根据一个rect创建一个椭圆
    CGContextAddEllipseInRect(ctx, rect);
    
    // 裁剪
    CGContextClip(ctx);
    
    // 将原照片画到图形上下文
    [self drawInRect:rect];
    
    // 从上下文上获取剪裁后的照片
    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
    
    // 关闭上下文
    UIGraphicsEndImageContext();
    
    return newImage;
}

@end

然后我们看结果。

切圆角

三、根据UIColor色值返回Image

  这个功能就是根据传入的UIColor色值,返回UIImage图像,特别当我们希望我们这个按钮的背景的图片时,这个时候就需要我们给一个UIColor色值,返回的是UIImage图像。在原代码中继续加东西。

1. JJMainVC.m

//属性增加
@property (nonatomic, strong) UIImageView *contentImageView;

//控件内容增加
    //内容图像按钮
    UIImageView *contentImageView = [[UIImageView alloc] init];
    contentImageView.image = [UIImage zbImageWithColor:[UIColor colorWithHexString:@"FF00FF"]];
    [self.view addSubview:contentImageView];
    self.contentImageView = contentImageView;
//约束增加
    //内容
    [self.contentImageView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.centerX.equalTo(self.view);
        make.top.equalTo(self.avatarButton.mas_bottom).offset(15.0);
        make.width.height.equalTo(@200);
    }];
2. UIImage+JJImage.h
+ (UIImage *)zbImageWithColor:(UIColor *)color;

3. UIImage+JJImage.m

+ (UIImage *)zbImageWithColor:(UIColor *)color;
{
    CGRect rect = CGRectMake(0.0, 0.0, 1.0, 1.0);
    UIGraphicsBeginImageContext(rect.size);
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSetFillColorWithColor(context, [color CGColor]);
    CGContextFillRect(context, rect);
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return image;
}

我们可以看一下结果。

色值转图像

四、电话号有效性判断

  我们在做注册登录的时候,常需要对电话号的有效性进行判断,我们用的就是正则表达式进行判断。不多说了,我自己写了一个,用着还可以。先看代码。

1. JJMainVC.m

```
```
- (void)viewDidLoad
{
    [super viewDidLoad];
    
    BOOL isPhoneRight1 = [self isPhoneNumberAvailable:@"18614005678"];
    BOOL isPhoneRight2 = [self isPhoneNumberAvailable:@"12345678900"];
    NSLog(@"isPhoneRight1----%d",isPhoneRight1);
    NSLog(@"isPhoneRight2----%d",isPhoneRight2);
}

```
```
- (BOOL)isPhoneNumberAvailable:(NSString *)phoneNumberStr
{
    NSString *phoneNumStr;
    phoneNumStr = [[NSString alloc] initWithString:[phoneNumberStr stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]];
    phoneNumStr = [phoneNumStr stringByReplacingOccurrencesOfString:@" " withString:@""];
    
    NSString *phoneRegex = @"\\b(1)[34578][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]\\b|\\b(1)(7)(7)[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]\\b|\\b(1)(7)(6)[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]\\b";
    NSPredicate *phoneCheck = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",phoneRegex];
    
    if (![phoneCheck evaluateWithObject:phoneNumStr]) {
        
        return NO;
    }
    
    return YES;
}
```
然后我们查看结果。
```
2017-04-30 19:43:13.547 几种简单功能的封装[5502:232905] isPhoneRight1----1
2017-04-30 19:43:13.547 几种简单功能的封装[5502:232905] isPhoneRight2----0

```

#  后记

> &emsp;&emsp;先写这么多吧,待续~~~,谢谢大家。



![美图](http://upload-images.jianshu.io/upload_images/3691932-a9b82761f9ffb74a.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 195,783评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,360评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 142,942评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,507评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,324评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,299评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,685评论 3 386
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,358评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,652评论 1 293
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,704评论 2 312
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,465评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,318评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,711评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,991评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,265评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,661评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,864评论 2 335

推荐阅读更多精彩内容