前言
最近在工作中,写到的两段自己感觉比较有趣的代码,一个是将一张彩色的图片变灰度的,另一个是让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没有带伞!