最终效果图:

先加入GPUImage.framework











导入BlurAlertView的类声明和类实现
//
// BlurAlertView.h
// 特效弹出框
//
// Created by beyond on 14-10-18.
// Copyright (c) 2014年 com.beyond All rights reserved.
// #import <UIKit/UIKit.h>
// 必须先导入GPUImage.framework
#import <GPUImage/GPUImage.h>
@class BlurAlertView;
@protocol BlurAlertViewDelegate; typedef NS_ENUM(NSInteger, BlurAlertViewAnimationType){
BlurAlertViewAnimationTypeBounce,
BlurAlertViewAnimationTypeDrop
}; typedef NS_ENUM(NSInteger, BlurAlertViewContentType){
BlurAlertViewContentTypeText,
BlurAlertViewContentTypeCustomView
}; @interface BlurAlertView : UIView @property (nonatomic,strong) UIButton *okButton;
@property (nonatomic,strong) UIButton *cancelButton;
@property (nonatomic,assign) BlurAlertViewAnimationType animationType;
@property (nonatomic,weak) id<BlurAlertViewDelegate> delegate; @property(nonatomic,copy) void(^completionBlock)(BlurAlertView *alertView,UIButton *button); - (id)initWithTitle:(NSString *)title text:(NSString *)text cancelButton:(BOOL)hasCancelButton;
- (id)initWithTitle:(NSString *)title contentView:(UIView *)contentView cancelButton:(BOOL)hasCancelButton;
- (void)show;
- (void)dismiss; @end @protocol BlurAlertViewDelegate <NSObject> @optional
-(void) alertView:(BlurAlertView *)alertView didDismissWithButton:(UIButton *)button;
-(void) alertViewWillShow:(BlurAlertView *)alertView;
-(void) alertViewDidShow:(BlurAlertView *)alertView;
-(void) alertViewWillDismiss:(BlurAlertView *)alertView;
-(void) alertViewDidDismiss:(BlurAlertView *)alertView; @end
// 隆重介绍 使用方式
/********************Title and Text:
BlurAlertView *alertView = [[BlurAlertView alloc] initWithTitle:@"title" text:@"this is text" cancelButton:YES color:[UIColor blueColor]]; //set animation type
alertView.animationType = BlurAlertViewAnimationTypeDrop; [alertView setCompletionBlock:^(BlurAlertView *alert, UIButton *button) {
if (button == alert.okButton) {
NSLog(@"ok button touched!");
}else{
NSLog(@"cancel button touched!");
}
}];
[alertView show];
*/ /***************Custom content view: UIView *contentView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 180, 180)];
contentView.backgroundColor = [UIColor blackColor];
BlurAlertView *alertView = [[BlurAlertView alloc] initWithTitle:@"title" contentView:contentView cancelButton:YES color:[UIColor blueColor]];
[alertView show];
*/

//
// BlurAlertView.m
// 特效弹出框
//
// Created by beyond on 14-10-18.
// Copyright (c) 2014年 com.beyond All rights reserved.
//
static const float AlertViewTitleLabelHeight = 44.0;
static const float AlertViewSpaceHeight = 10;
static const float AlertViewDefaultTextFontSize = 16; /*Default Colors*/
#define RJTitleLabelBackgroundColor [UIColor colorWithRed:0.20392156862745098 green:0.596078431372549 blue:0.8588235294117647 alpha:1.0]
#define RJComfirmButtonColor [UIColor colorWithRed:0.20392156862745098 green:0.596078431372549 blue:0.8588235294117647 alpha:1.0] #define screenBounds [[UIScreen mainScreen] bounds]
#define IS_IOS7_Or_Later [[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0 #import "BlurAlertView.h" @interface BlurAlertView () @property (nonatomic,strong) GPUImageiOSBlurFilter *blurFilter;
@property (nonatomic,strong) UIView *alertView;
@property (nonatomic,strong) UIImageView *backgroundView;
@property (nonatomic,strong) UILabel *titleLabel;
@property (nonatomic,strong) UILabel *textLabel;
@property (nonatomic,assign) CGSize contentSize;
@property (nonatomic,assign) BlurAlertViewContentType contentType;
@property (nonatomic,strong) UIView *contentView;
@end @implementation BlurAlertView - (id)initWithTitle:(NSString *)title contentView:(UIView *)contentView cancelButton:(BOOL)hasCancelButton
{
self = [super initWithFrame:screenBounds];
if (self) {
self.opaque = YES;
self.alpha = 1;
_contentType = BlurAlertViewContentTypeCustomView;
_contentView = contentView;
[self _setupViewsWithTitle:title text:nil cancelButton:hasCancelButton];
}
return self;
} - (id)initWithTitle:(NSString *)title text:(NSString *)text cancelButton:(BOOL)hasCancelButton
{
self = [super initWithFrame:screenBounds];
if (self) {
self.opaque = YES;
self.alpha = 1;
_contentType = BlurAlertViewContentTypeText;
[self _setupViewsWithTitle:title text:text cancelButton:hasCancelButton];
}
return self;
} #pragma mark - Show and Dismiss
- (void)show
{
if ([self.delegate respondsToSelector:@selector(alertViewWillShow:)]) {
[self.delegate alertViewWillShow:self];
} switch (self.animationType) {
case BlurAlertViewAnimationTypeBounce:
[self triggerBounceAnimations];
break;
case BlurAlertViewAnimationTypeDrop:
[self triggerDropAnimations];
break;
default:
break;
}
[[[[UIApplication sharedApplication] delegate] window] addSubview:self];
} - (void)dismiss
{
if ([self.delegate respondsToSelector:@selector(alertViewWillDismiss:)]) {
[self.delegate alertViewWillDismiss:self];
} [UIView animateWithDuration:0.4
delay:0.0
options: UIViewAnimationOptionCurveEaseInOut
animations:^{
self.alpha = 0;
}
completion:^(BOOL finished){
[self removeFromSuperview];
if ([self.delegate respondsToSelector:@selector(alertViewDidDismiss:)]){
[self.delegate alertViewDidDismiss:self];
}
}];
} #pragma mark - Animations
- (void) triggerBounceAnimations
{ self.alertView.alpha = 0;
self.alertView.center = CGPointMake(CGRectGetWidth(screenBounds)/2, (CGRectGetHeight(screenBounds)/2)); CAKeyframeAnimation * animation;
animation = [CAKeyframeAnimation animationWithKeyPath:@"transform"];
animation.duration = 0.3f;
//animation.delegate = self;
animation.removedOnCompletion = NO;
animation.fillMode = kCAFillModeForwards;
NSMutableArray *values = [NSMutableArray array];
[values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(0.1, 0.1, 1.0)]];
[values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(1.2, 1.2, 1.0)]];
[values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(1.0, 1.0, 1.0)]];
animation.values = values;
animation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
[self.alertView.layer addAnimation:animation forKey:nil]; [UIView animateWithDuration:0.3f
delay:0
options:UIViewAnimationOptionAllowUserInteraction | UIViewAnimationCurveEaseIn | UIViewAnimationOptionBeginFromCurrentState
animations:^{
[self.backgroundView setAlpha:1.0];
[self.alertView setAlpha:1.0];
}
completion:^(BOOL finished){
if ([self.delegate respondsToSelector:@selector(alertViewDidShow:)]) {
[self.delegate alertViewDidShow:self];
}
}];
} -(void) triggerDropAnimations
{
CAKeyframeAnimation * animation;
animation = [CAKeyframeAnimation animationWithKeyPath:@"position"];
animation.duration = 0.4f;
//animation.delegate = self;
animation.removedOnCompletion = NO;
animation.fillMode = kCAFillModeForwards;
NSMutableArray *values = [NSMutableArray array];
[values addObject:[NSValue valueWithCGPoint:CGPointMake(screenBounds.size.width/2, -self.alertView.frame.size.height)]];
[values addObject:[NSValue valueWithCGPoint:CGPointMake(screenBounds.size.width/2, (screenBounds.size.height/2)+self.alertView.frame.size.height*0.05)]];
[values addObject:[NSValue valueWithCGPoint:CGPointMake(screenBounds.size.width/2, (screenBounds.size.height/2))]];
[values addObject:[NSValue valueWithCGPoint:CGPointMake(screenBounds.size.width/2, (screenBounds.size.height/2)-self.alertView.frame.size.height*0.05)]];
[values addObject:[NSValue valueWithCGPoint:CGPointMake(screenBounds.size.width/2, (screenBounds.size.height/2))]];
animation.values = values;
animation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
[self.alertView.layer addAnimation:animation forKey:nil]; [UIView animateWithDuration:0.4 delay:0.0 options:UIViewAnimationOptionCurveEaseOut animations:^{
self.backgroundView.alpha = 1.0;
} completion:^(BOOL finished){
if ([self.delegate respondsToSelector:@selector(alertViewDidShow:)]) {
[self.delegate alertViewDidShow:self];
}
}]; } #pragma mark - View Setup
- (void)_setupViewsWithTitle:(NSString *)title text:(NSString *)aText cancelButton:(BOOL)hasCancelButton
{ [self calculateContentSize:aText]; /*setup backgroundView*/
_blurFilter = [[GPUImageiOSBlurFilter alloc] init];
_blurFilter.blurRadiusInPixels = 2.0;
_backgroundView = [[UIImageView alloc]initWithFrame:screenBounds];
UIImage * image = [self _convertViewToImage];
UIImage *blurredSnapshotImage = [_blurFilter imageByFilteringImage:image];
[self.backgroundView setImage:blurredSnapshotImage];
self.backgroundView.alpha = 0.0;
[self addSubview:self.backgroundView]; /*setup alertPopupView*/
self.alertView = [self _alertPopupView]; /*setup title and content view*/
[self _labelSetupWithTitle:title andText:aText];
[self addSubview:self.alertView]; /*setup buttons*/
[self _buttonSetupWithCancelButton:hasCancelButton];
} - (void)_labelSetupWithTitle:(NSString*) title andText:(NSString*) text
{
_titleLabel = [[UILabel alloc]initWithFrame:CGRectMake(0, 0, 180, AlertViewTitleLabelHeight)];
_titleLabel.center = CGPointMake(CGRectGetWidth(self.alertView.frame)/2, AlertViewTitleLabelHeight/2);
_titleLabel.text = title;
_titleLabel.font = [UIFont fontWithName:@"HelveticaNeue-LightItalic" size:20.0f];
_titleLabel.textAlignment = NSTextAlignmentCenter;
[self.alertView addSubview:_titleLabel]; if (self.contentType == BlurAlertViewContentTypeText) {
_textLabel = [[UILabel alloc]initWithFrame:CGRectMake(0, 0, 180, self.contentSize.height)];
_textLabel.center = CGPointMake(self.alertView.frame.size.width/2, CGRectGetHeight(self.alertView.frame)/2);
_textLabel.text = text;
_textLabel.font = [UIFont fontWithName:@"HelveticaNeue" size:AlertViewDefaultTextFontSize];
_textLabel.textAlignment = NSTextAlignmentCenter;
_textLabel.lineBreakMode = NSLineBreakByWordWrapping;
_textLabel.numberOfLines = 0;
[self.alertView addSubview:_textLabel];
}else{
//customView type
self.contentView.center = CGPointMake(self.alertView.frame.size.width/2, CGRectGetHeight(self.alertView.frame)/2);
[self.alertView addSubview:self.contentView];
}
} - (UIView*)_alertPopupView
{
UIView * alertSquare = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 200, AlertViewTitleLabelHeight+2*AlertViewSpaceHeight+self.contentSize.height+AlertViewTitleLabelHeight)];
alertSquare.backgroundColor = [UIColor colorWithRed:0.937 green:0.937 blue:0.937 alpha:1];
alertSquare.center = CGPointMake(CGRectGetWidth(screenBounds)/2, CGRectGetHeight(screenBounds)/2); [alertSquare.layer setCornerRadius:4.0];
[alertSquare.layer setShadowColor:[UIColor blackColor].CGColor];
[alertSquare.layer setShadowOpacity:0.4];
[alertSquare.layer setShadowRadius:20.0f];
[alertSquare.layer setShadowOffset:CGSizeMake(0.0, 0.0)]; //add top background layer
CAShapeLayer *topBackgroundLayer = [CAShapeLayer layer];
UIBezierPath *topBackgroundPath = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(0,0, CGRectGetWidth(alertSquare.frame), AlertViewTitleLabelHeight) byRoundingCorners:UIRectCornerTopLeft|UIRectCornerTopRight cornerRadii:CGSizeMake(4.0, 4.0)];
topBackgroundLayer.path = topBackgroundPath.CGPath;
topBackgroundLayer.fillColor = RJTitleLabelBackgroundColor.CGColor;
[alertSquare.layer addSublayer:topBackgroundLayer]; return alertSquare;
} - (void)_buttonSetupWithCancelButton:(BOOL) hasCancelButton
{
CGFloat buttonCenterY = (CGRectGetHeight(self.alertView.frame)*2-30-AlertViewSpaceHeight)/2;
if (hasCancelButton) {
//ok button
_okButton = [[UIButton alloc]initWithFrame:CGRectMake(0, 0, 84, 30)];
_okButton.center = CGPointMake((CGRectGetWidth(self.alertView.frame)/4)+3, buttonCenterY); //cancel button
_cancelButton = [[UIButton alloc]initWithFrame:CGRectMake(0, 0, 84, 30)];
_cancelButton.center = CGPointMake((CGRectGetWidth(self.alertView.frame)*3/4)-3, buttonCenterY);
_cancelButton.backgroundColor = [UIColor colorWithRed:0.792 green:0.792 blue:0.792 alpha:1]; [_cancelButton setTitle:@"取消" forState:UIControlStateNormal];
_cancelButton.titleLabel.textColor = [UIColor whiteColor];
_cancelButton.titleLabel.font = [UIFont fontWithName:@"HelveticaNeue" size:18.0f];
[_cancelButton addTarget:self action:@selector(handleButtonTouched:) forControlEvents:UIControlEventTouchUpInside];
[_cancelButton.layer setCornerRadius:3.0f];
}else{
_okButton = [[UIButton alloc]initWithFrame:CGRectMake(0, 0, 180, 30)];
_okButton.center = CGPointMake(CGRectGetWidth(self.alertView.frame)/2, buttonCenterY);
} [_okButton setBackgroundColor:RJComfirmButtonColor]; //ok button end setup
[_okButton setTitle:@"确定" forState:UIControlStateNormal];
_okButton.titleLabel.font = [UIFont fontWithName:@"HelveticaNeue" size:18.0f];
[_okButton addTarget:self action:@selector(handleButtonTouched:) forControlEvents:UIControlEventTouchUpInside];
[_okButton.layer setCornerRadius:3.0f]; [self.alertView addSubview:_okButton];
if (hasCancelButton){
[self.alertView addSubview:_cancelButton];
} } - (void)calculateContentSize:(NSString *)text
{
UIFont *font = [UIFont fontWithName:@"HelveticaNeue" size:AlertViewDefaultTextFontSize];
CGSize constrainedSize = CGSizeMake(180, CGFLOAT_MAX); if (IS_IOS7_Or_Later)
{
NSDictionary * tdic = [NSDictionary dictionaryWithObjectsAndKeys:font, NSFontAttributeName,nil];
self.contentSize =[text boundingRectWithSize:constrainedSize options:NSStringDrawingUsesLineFragmentOrigin |NSStringDrawingUsesFontLeading attributes:tdic context:nil].size;
}else{
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
self.contentSize = [text sizeWithFont:font constrainedToSize:constrainedSize lineBreakMode:NSLineBreakByCharWrapping];
#pragma clang diagnostic pop
} if (self.contentType == BlurAlertViewContentTypeCustomView) {
self.contentSize = self.contentView.bounds.size;
}
} -(UIImage *)_convertViewToImage
{
UIWindow *keyWindow = [[UIApplication sharedApplication] keyWindow];
CGRect rect = [keyWindow bounds];
UIGraphicsBeginImageContextWithOptions(rect.size,YES,0.0f);
CGContextRef context = UIGraphicsGetCurrentContext();
[keyWindow.layer renderInContext:context];
UIImage *capturedScreen = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return capturedScreen;
} #pragma mark - Button Action
- (void)handleButtonTouched:(UIButton *)button
{
[self dismiss]; if ([self.delegate respondsToSelector:@selector(alertView:didDismissWithButton:)]) {
[self.delegate alertView:self didDismissWithButton:button];
} if (self.completionBlock) {
self.completionBlock(self,button);
}
} @end

主控制器,使用演示样例
//
// ViewController.m
// 特效弹出框
//
// Created by beyond on 14-10-18.
// Copyright (c) 2014年 com.beyond All rights reserved.
// #import "ViewController.h" // 1导入
#import "BlurAlertView.h"
@interface ViewController () @end @implementation ViewController - (void)viewDidLoad {
[super viewDidLoad];
// 加入图片 CGRect rect = CGRectMake(0, 20, 320, 460);
UIImageView *imageView = [[UIImageView alloc]initWithFrame:rect];
imageView.image = [UIImage imageNamed:@"1.png"];
imageView.contentMode = UIViewContentModeScaleAspectFill;
[self.view addSubview:imageView]; // 加入按钮
UIButton *btn = [UIButton buttonWithType:UIButtonTypeContactAdd];
btn.frame = CGRectMake(0, 40, 40, 40);
[btn addTarget:self action:@selector(showAlertView) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:btn];
// 加入按钮2
UIButton *btn2 = [UIButton buttonWithType:UIButtonTypeContactAdd];
btn2.frame = CGRectMake(0, 80, 40, 40);
[btn2 addTarget:self action:@selector(showAlertView2) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:btn2]; } #pragma mark - 第3方提醒控件
- (void)showAlertView
{
BlurAlertView *alertView = [[BlurAlertView alloc]initWithTitle:@"title" text:@"text" cancelButton:YES]; // 设置CA动画类型
alertView.animationType = BlurAlertViewAnimationTypeBounce;
// BlurAlertViewAnimationTypeDrop; [alertView setCompletionBlock:^(BlurAlertView *alert, UIButton *button) {
if (button == alert.okButton) {
NSLog(@"ok button touched!");
}else{
NSLog(@"cancel button touched!");
}
}];
[alertView show];
}
- (void)showAlertView2
{
BlurAlertView *alertView = [[BlurAlertView alloc]initWithTitle:@"title" text:@"text" cancelButton:YES]; // 设置CA动画类型
// alertView.animationType = BlurAlertViewAnimationTypeBounce;
alertView.animationType = BlurAlertViewAnimationTypeDrop; [alertView setCompletionBlock:^(BlurAlertView *alert, UIButton *button) {
if (button == alert.okButton) {
NSLog(@"ok button touched!");
}else{
NSLog(@"cancel button touched!");
}
}];
[alertView show];
}
@end











iOS_第3方类库_BlurAlertView_GPUImage的更多相关文章

  1. iOS_第3方类库MBprogressHUD

    1,将下载好的第3方类库MBprogressHUD源代码包增加到project(事实上就是一个.h和.m文件) 2,进入project的Build Phases,将源代码包里面的所有.m文件所有加入到 ...

  2. iOS_第3方类库_側滑选项卡SlideSwitchView

    终于效果: 用法: 1.在主控制器中创建一个[SlideSwitchView]的对象实例,并用成员变量记住,如_slideSwitchView,并加入到self.view 2.设置[_slideSwi ...

  3. IOS 编程中引用第三方的方类库的方法及常见问题

    方法一:直接复制全部源文件到项目中 这样的方法就是把第三方类库的全部源文件拷贝到项目中,直接把全部.h和.m文件拖到XCode项目中就可以. 注意: 1. 假设第三方类库引用了一些系统自带类库,那么在 ...

  4. iOS_文章3党库SDWebImage

    1,下载的文章3党库SDWebImage代码包增加到project 2,进入project的Build Phases,将源代码包里面的所有.m文件所有加入到project 3,导入第3方类库依赖的两个 ...

  5. laravel5.6 调用第三方类库

    大概流程: 1. 新建一个目录方类库 2. 配置composer配置文件 3. 在项目中使用终端运行composer  dumpautoload 4. 使用时 方法调用可以new对象后->方法名 ...

  6. scala 学习笔记(06) OOP(下)多重继承 及 AOP

    一.多继承 上篇trait中,已经看到了其用法十分灵活,可以借此实现类似"多重继承"的效果,语法格式为: class/trait A extends B with C with D ...

  7. weblogic.nodemanager.common.ConfigException: Native version is enabled but nodemanager native library could not be loaded 解决办法

    近日在一个原本工作正常的weblogic web server(操作系统为redhat 64位系统)上折腾安装redis/hadoop等东东,yum install了一堆第3方类库后,重启weblog ...

  8. python4delphi 使用

    Python 开发桌面程序, 之前写过一个使用IronPython的博客. 下面这个方案使用 delphi 作为主开发语言,通过 python4delphi 控件包将 python 作为 script ...

  9. 正确使用Python logging

    这篇文章主要参考: http://victorlin.me/posts/2012/08/26/good-logging-practice-in-python ===================== ...

随机推荐

  1. POJ 2406 Power Strings(字符串的最小循环节)

    题目链接:http://poj.org/problem?id=2406 题意:确定字符串最多是多少个相同的字串重复连接而成的 思路:关键是找到字符串的最小循环节 code: #include < ...

  2. BZOJ 1051: [HAOI2006]受欢迎的牛( tarjan )

    tarjan缩点后, 有且仅有一个出度为0的强连通分量即answer, 否则无解 ----------------------------------------------------------- ...

  3. JAVA_用_JCO连接_SAP,实现调用SAP_的_RFC_函数(整理)(附一篇看起来比较全面的说明)(JCO报错信息)

    // 获取RFC返回的字段值 11 JCoParameterList exportParam = function.getExportParameterList(); 12 String exPara ...

  4. php ajax提交数据 在本地可以执行,而在服务器不能执行

    1.排除是服务器的问题 把单独的ajax项目传到服务器上,可以正常返回xml数据 2.排除是项目下的限制问题 把单独的ajax放在相应的项目文件夹下,单独访问该ajax发送数据的页面,能够正常执行 3 ...

  5. Linux串口编程详解(转)

    串口本身,标准和硬件 † 串口是计算机上的串行通讯的物理接口.计算机历史上,串口曾经被广泛用于连接计算机和终端设备和各种外部设备.虽然以太网接口和USB接口也是以一个串行流进行数据传送的,但是串口连接 ...

  6. HighCharts学习

    http://www.stepday.com/topic/?369 http://www.helloweba.com/view-blog-156.html

  7. XML中SystemID和PublicID的区别

    http://hi.baidu.com/binboot007/item/1533f91d52113d7c7b5f259c http://supportweb.cs.bham.ac.uk/documen ...

  8. Bug驱动开发(Bug-driven development)

    说实话,作为一个Domino开发者,像測试驱动开发(Test-driven development).功能驱动开发(Feature-driven development)之类软件开发的高大上的方法论( ...

  9. Android实现视频录制

    安卓实现视频录制,有两种方法,一种是调用自带的视频功能,一种是使用MediaRecorder. 每种方法都有自己的优缺点.接下来,把两种方法的代码写出来. 先说第一种方法,也是最简单的方法,那就是直接 ...

  10. 二十三种设计模式及其python实现

    本文源码寄方于github:https://github.com/w392807287/Design_pattern_of_python 参考文献: <大话设计模式>——吴强 <Py ...