源码分享:比较有趣的功能代码

前言

最近在工作中,写到的两段自己感觉比较有趣的代码,一个是将一张彩色的图片变灰度的,另一个是让AlertView背后的蒙层点击可以让AlertView消失,分享出来。

图片灰度

前几天有这么个需求,APP 有一个活动页面,里面有很多活动的展示图片,有一些活动是正在进行的(彩色,可点击);有一些活动呢,就是已经过期的(黑白,不可点击)。

由于设计师比较忙,一直没有给出黑白的活动图,所以呢。我就想着能不能自己用代码实现一下。

其实让图片变成有一定灰度的,可以在 UIImageView 上面添加一个 UIView ,这个 UIView 具有一定的透明度的黑色,应该也是可以实现的。但是不太优雅。

后来在 stackoverflow 上得到启发,就有了下面的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
-(UIImage*)getGrayImage:(UIImage*)sourceImage
{
int width = sourceImage.size.width;
int height = sourceImage.size.height;

CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceGray();
CGContextRef context = CGBitmapContextCreate (nil,width,height,8,0,colorSpace,kCGImageAlphaNone);
CGColorSpaceRelease(colorSpace);

if (context == NULL) {
return nil;
}

CGContextDrawImage(context,CGRectMake(0, 0, width, height), sourceImage.CGImage);
UIImage *grayImage = [UIImage imageWithCGImage:CGBitmapContextCreateImage(context)];
CGContextRelease(context);

return grayImage;
}

代码的思路主要是:

  • 定义一个灰度空间
  • 创建一个原图片大小使用灰度空间的位图
  • 使用位图和原图来绘制新的灰度图片

大概的效果如下:

点击蒙层点击AlertView消失

我们都知道当我们展示一个 alertView 时,背面会有蒙层,并且蒙层没有点击效果,屏幕的焦点会集中在 alertView,可以用 alertView 的功能按钮来让其消失。

但是需求有时候总是这么出乎意料,昨天就碰到了,产品经理告诉我,他想让后面的灰色蒙版也响应点击事件,让 alertView 消失,于是有了以下的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
@property (nonatomic, strong) UIAlertView* alertView;
//定义手势识别器
@property (nonatomic,strong) UITapGestureRecognizer *recognizerTap;

self.recognizerTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTapBehind:)];
[self.recognizerTap setNumberOfTapsRequired:1];
self.recognizerTap.cancelsTouchesInView = NO;
[self.alertView.window addGestureRecognizer:self.recognizerTap];


- (void)handleTapBehind:(UITapGestureRecognizer *)sender
{
if (sender.state == UIGestureRecognizerStateEnded)
{
CGPoint location = [sender locationInView:nil];
if (![self.alertView pointInside:[self.alertView convertPoint:location fromView:self.alertView.window] withEvent:nil])
{
[self.alertView.window removeGestureRecognizer:sender];
[self.alertView dismissWithClickedButtonIndex:0 animated:YES];
}
}
}

代码的思路主要是:

定义点击事件,并判断点击事件是否在 alertView 里面,如果是里面就进行忽略,如果是外面就触发 dismiss事件

后记

午休的时间写完了这篇博客,深圳的天气真是热了狗了,出去吃饭阳光明媚,吃完饭倾盆大雨,回到公司,又是阳光明媚,这整个过程唯一的缺陷就是:我TM没有带伞!