版本記錄
版本號 | 修改時間 |
---|---|
2017.04.29 | V1.0 |
前言
工程中我們總需要為各種各樣的小功能進(jìn)行封裝,這樣團(tuán)隊使用的時候,可以調(diào)用這些封裝好的小模塊或者小功能,就不用從底層開始一個個的寫了,這樣可以加快開發(fā)速度,縮短開發(fā)周期,下面我就寫幾個封裝好的小功能,想起來幾個就寫幾個,以后我會更新。
詳情
一、十六進(jìn)制字符串轉(zhuǎn)顏色色值
??我們知道oc中,只有r g b a轉(zhuǎn)化顏色色值,如下:
// 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
??可以發(fā)現(xiàn)并沒有十六進(jìn)制轉(zhuǎn)化為顏色的接口,這里提供了一個,不多說了直接看代碼,先看一下代碼組織結(jié)構(gòu)。
代碼組織結(jié)構(gòu)
直接看代碼吧。
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
我們直接看結(jié)果。
色值結(jié)果
二、圖片切圓角
圖片切圓角,其實(shí)就是切l(wèi)ayer,就是兩句話。
self.avatarButton.layer.cornerRadius = 15.0;
self.avatarButton.layer.masksToBounds = YES;
??但是這里有一個問題,圖片少的話還可以,但是如果一個tableview上有很多圖片的話,滑動的時候這么切圓角就很耗cpu性能,就會出現(xiàn)卡頓,這里有個方法就是畫上去。
先看代碼結(jié)構(gòu)。
代碼結(jié)構(gòu)
??我這里紅色的部分就是對上面增加的部分,我只列出改變的部分吧??创a。
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();
// 設(shè)置一個范圍
CGRect rect = CGRectMake(0, 0, self.size.width, self.size.height);
// 根據(jù)一個rect創(chuàng)建一個橢圓
CGContextAddEllipseInRect(ctx, rect);
// 裁剪
CGContextClip(ctx);
// 將原照片畫到圖形上下文
[self drawInRect:rect];
// 從上下文上獲取剪裁后的照片
UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
// 關(guān)閉上下文
UIGraphicsEndImageContext();
return newImage;
}
@end
然后我們看結(jié)果。
切圓角
三、根據(jù)UIColor色值返回Image
??這個功能就是根據(jù)傳入的UIColor色值,返回UIImage圖像,特別當(dāng)我們希望我們這個按鈕的背景的圖片時,這個時候就需要我們給一個UIColor色值,返回的是UIImage圖像。在原代碼中繼續(xù)加?xùn)|西。
1. JJMainVC.m
//屬性增加
@property (nonatomic, strong) UIImageView *contentImageView;
//控件內(nèi)容增加
//內(nèi)容圖像按鈕
UIImageView *contentImageView = [[UIImageView alloc] init];
contentImageView.image = [UIImage zbImageWithColor:[UIColor colorWithHexString:@"FF00FF"]];
[self.view addSubview:contentImageView];
self.contentImageView = contentImageView;
//約束增加
//內(nèi)容
[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;
}
我們可以看一下結(jié)果。
色值轉(zhuǎn)圖像
四、電話號有效性判斷
??我們在做注冊登錄的時候,常需要對電話號的有效性進(jìn)行判斷,我們用的就是正則表達(dá)式進(jìn)行判斷。不多說了,我自己寫了一個,用著還可以。先看代碼。
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;
}
```
然后我們查看結(jié)果。
```
2017-04-30 19:43:13.547 幾種簡單功能的封裝[5502:232905] isPhoneRight1----1
2017-04-30 19:43:13.547 幾種簡單功能的封裝[5502:232905] isPhoneRight2----0
```
# 后記
>   先寫這么多吧,待續(xù)~~~,謝謝大家。
