在程序中我们经常用到Block,但写weak self 时会比较繁琐,这里介绍一个宏定义:

宏定义如下

1
#define WS(weakSelf) weak typeof(&*self)weakSelf = self;

用法例子:

1
2
3
4
WS(weakself)
[self.tableView addHeaderWithCallback:^{
[weakself requestMemberList];
}];

利用NSPredicate进行模糊搜索

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/**
模糊搜索,用来筛选数组里符合要求项
*
@param searchText 要搜索的字符串
@param stringArray 有字符串组成的数组
*
@return 所有符合项组成的数组
*/
-(NSArray)fuzzySearchText:(NSString)searchText inArray:(NSArray)stringArray{
NSStringformat=@”SELF LIKE[cd] ‘“;
for (int i=0; i<searchText.length; i++) {
NSStringstr=[searchText substringWithRange:NSMakeRange(i, 1)];
format=[format stringByAppendingString:[NSString stringWithFormat:@”%@“,str]];
}
format=[format stringByAppendingString:@”‘“];
NSPredicatepredicate = [NSPredicate predicateWithFormat:format];
return [stringArray filteredArrayUsingPredicate:predicate];
}

iOS判断颜色UIColor是浅色还是深色(DarkOrBright))中介绍了对颜色深浅的判断。那么,假如要判断背景图片颜色的深浅又该如何做呢?这里接啥一个获取UIImage颜色均值的方法,结合上一篇博文,便能很好的判断图片深浅:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
- (UIColor )averageColorForImage:(UIImage)image {
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
unsigned char rgba[4];
CGContextRef context = CGBitmapContextCreate(rgba, 1, 1, 8, 4, colorSpace, kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big);
CGContextDrawImage(context, CGRectMake(0, 0, 1, 1), image.CGImage);
CGColorSpaceRelease(colorSpace);
CGContextRelease(context);
if(rgba[3] &gt; 0) {
CGFloat alpha = ((CGFloat)rgba[3])/255.0;
CGFloat multiplier = alpha/255.0;
return [UIColor colorWithRed:((CGFloat)rgba[0])*multiplier
green:((CGFloat)rgba[1])*multiplier
blue:((CGFloat)rgba[2])*multiplier
alpha:alpha];
}
else {
return [UIColor colorWithRed:((CGFloat)rgba[0])/255.0
green:((CGFloat)rgba[1])/255.0
blue:((CGFloat)rgba[2])/255.0
alpha:((CGFloat)rgba[3])/255.0];
}
}

获取颜色的深浅这个需求并不少见,比如根据背景色来动态更改Label的文字颜色以让用户获得更好的阅读体验。

下面介绍一个简单的判断方法,可能不是最好的,但可以满足大部分需求。

颜色深很好理解,颜色浅就稍复杂一点,简单归为两种情况:

1.透明

2.不透明

不透明好办,不多做叙述。

对于透明,我自己在测试中发现可氛围两种情况来处理,一是全透明,二是部分透明。

我们看一下CGColor的一个方法:

1
2
/ Return the color components (including alpha) associated with `color’. /
CG_EXTERN const CGFloat *CGColorGetComponents(CGColorRef color)

这个方法可以取得颜色的分力,我们将用它来做颜色深浅的判断。上面的说明写的很清楚,包括透明度。但实际测试上,这个方法会把全透明判断为深色,所以对全透明我们做一个特别处理。

获取透明度代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
- (CGFloat) alphaForColor:(UIColor*)color {
CGFloat r, g, b, a, w, h, s, l;
BOOL compatible = [color getWhite:&w alpha:&a];
if (compatible) {
return a;
} else {
compatible = [color getRed:&r green:&g blue:&b alpha:&a];
if (compatible) {
return a;
} else {
[color getHue:&h saturation:&s brightness:&l alpha:&a];
return a;
}
}
}

判断颜色深浅代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
-(BOOL)isDarkColor:(UIColor )newColor{
if ([self alphaForColor: newColor]<10e-5) {
return YES;
}
const CGFloat componentColors = CGColorGetComponents(newColor.CGColor);
CGFloat colorBrightness = ((componentColors[0] 299) + (componentColors[1] 587) + (componentColors[2] * 114)) / 1000;
if (colorBrightness < 0.5){
NSLog(@"Color is dark");
return YES;
}
else{
NSLog(@"Color is light");
return NO;
}
}

下一篇博文,我将对本篇做一点扩展,介绍获取图片颜色均值的方法。

本篇博文介绍一种取得图片某一像素点颜色值的方法,话不多说,直接上代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
- (UIColor*) getPixelColorAtLocation:(CGPoint)point inImage:(UIImage *)image {
UIColor* color = nil;
CGImageRef inImage = image.CGImage;
CGContextRef cgctx = [self createARGBBitmapContextFromImage:inImage];
if (cgctx == NULL) {
return nil; /* error */
}
size_t w = CGImageGetWidth(inImage);
size_t h = CGImageGetHeight(inImage);
CGRect rect = {{0,0},{w,h}};
CGContextDrawImage(cgctx, rect, inImage);
unsigned char* data = CGBitmapContextGetData (cgctx);
if (data != NULL) {
int offset = 4*((w*round(point.y))+round(point.x));
int alpha = data[offset];
int red = data[offset+1];
int green = data[offset+2];
int blue = data[offset+3];
color = [UIColor colorWithRed:(red/255.0f) green:(green/255.0f) blue:
(blue/255.0f) alpha:(alpha/255.0f)];
}
CGContextRelease(cgctx);
if (data) {
free(data);
}
return color;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
- (CGContextRef) createARGBBitmapContextFromImage:(CGImageRef) inImage {
CGContextRef context = NULL;
CGColorSpaceRef colorSpace;
void *bitmapData;
int bitmapByteCount;
int bitmapBytesPerRow;
size_t pixelsWide = CGImageGetWidth(inImage);
size_t pixelsHigh = CGImageGetHeight(inImage);
bitmapBytesPerRow = (pixelsWide * 4);
bitmapByteCount = (bitmapBytesPerRow * pixelsHigh);
colorSpace = CGColorSpaceCreateDeviceRGB();
if (colorSpace == NULL){
fprintf(stderr, "Error allocating color space\n");
return NULL;
}
bitmapData = malloc( bitmapByteCount );
if (bitmapData == NULL){
fprintf (stderr, "Memory not allocated!");
CGColorSpaceRelease( colorSpace );
return NULL;
}
context = CGBitmapContextCreate (bitmapData,pixelsWide,pixelsHigh,8,bitmapBytesPerRow,colorSpace,kCGImageAlphaPremultipliedFirst);
if (context == NULL){
free (bitmapData);
fprintf (stderr, "Context not created!");
}
CGColorSpaceRelease( colorSpace );
return context;
}