iOS SDK详解之模糊(毛玻璃)效果效果

原创blog,转载请注明出处
http://blog.csdn.net/hello_hwc?viewmode=list


前言:
在iOS 8 之前,想要实现模糊效果,一般会使用一些Github库,当然自己定制也可以,其原理就是用Core Image进行一些数字图像处理(因为电子出身,本课的时候做过,用矩阵来做)。不过,到了iOS 8之后,这一切变的非常简单,因为Apple公开了之前的几个私有API。


Demo效果

三种Blur
技术分享技术分享技术分享
Vibrancy(也就是在Blur上加一些想要强调的部分)
技术分享


Demo下载链接

http://download.csdn.net/detail/hello_hwc/8678439


添加Blur

原理很简单

  • UIBlurEffect初始化一个blurEffect
  • 制定一个VisualEffectView,这个View定义了blur的区域
  • 把这个View作为Subview添加到想要blur的view上
    UIBlurEffect *blurEffect = [UIBlurEffect effectWithStyle:UIBlurEffectStyleLight];
    UIVisualEffectView *bluredEffectView = [[UIVisualEffectView alloc] initWithEffect:blurEffect];
    [bluredEffectView setFrame:  CGRectInset(self.imageview.bounds, 20, 20);
];
    bluredEffectView.layer.cornerRadius = 15;
    bluredEffectView.layer.masksToBounds = YES;
    [self.imageview addSubview:bluredEffectView];

其中Blur有三种,对应上文Demo图中的三种:

  • dark
  • light
  • extraLihgt

几点要注意的是

1. 不要对visualView设置alpha < 1
2. 可以对visualView设置Mask,来定制模糊的区域


添加Vibrancy

添加Vibrancy的原理就是在Blur的基础上再添加一个VisualView,并且在这个VisualView的contentView上添加想要的控件

   UIBlurEffect *blurEffect = [UIBlurEffect effectWithStyle:UIBlurEffectStyleLight];
    UIVisualEffectView *bluredEffectView = [[UIVisualEffectView alloc] initWithEffect:blurEffect];
    [bluredEffectView setFrame:CGRectMake(30,self.imageview.bounds.size.height - 50,self.imageview.bounds.size.width - 60, 40)];
    bluredEffectView.layer.cornerRadius = 15;
    bluredEffectView.layer.masksToBounds = YES;
    [self.imageview addSubview:bluredEffectView];

    UIVibrancyEffect *vibrancyEffect = [UIVibrancyEffect effectForBlurEffect:blurEffect];
    UIVisualEffectView *vibrancyEffectView = [[UIVisualEffectView alloc] initWithEffect:vibrancyEffect];
    [vibrancyEffectView setFrame:self.imageview.bounds];
    [bluredEffectView.contentView addSubview:vibrancyEffectView];

    UILabel * label = [[UILabel alloc] initWithFrame:CGRectMake(0,0,self.imageview.bounds.size.width - 60, 40)];
    label.text = @"Highlight";
    label.textAlignment = NSTextAlignmentCenter;
    label.textColor = [UIColor blackColor];
    [label setTextColor:[UIColor blackColor]];
    [vibrancyEffectView.contentView addSubview:label];

效果
技术分享


简单介绍下我写的Demo的一些设计原理

由两个数组保存Model

-(NSArray *)blurEffectArray{
    return @[[UIBlurEffect effectWithStyle:UIBlurEffectStyleDark],
             [UIBlurEffect effectWithStyle:UIBlurEffectStyleLight],
             [UIBlurEffect effectWithStyle:UIBlurEffectStyleExtraLight],
             ];
}
-(NSArray *)titleArray{
    return @[@"Dark",@"Light",@"ExtraLight"];
}

由CurrentIndex来获取/设定当前选择效果,在CurrentIndex的set函数里进行Model和View的同步

-(void)setCurrentIndex:(NSInteger)currentIndex{
    if (self.visualview != nil) {
        [self.visualview removeFromSuperview];
    }
    self.visualview = [[UIVisualEffectView alloc] initWithEffect:[[self blurEffectArray] objectAtIndex:currentIndex]];
    self.visualview.frame = CGRectInset(self.imageview.bounds, 20, 20);
    self.visualview.layer.cornerRadius = 15;
    self.visualview.layer.masksToBounds = YES;
    self.navigationItem.title = [[self titleArray] objectAtIndex:currentIndex];
    [self.imageview addSubview:self.visualview];
    _currentIndex = currentIndex;

}

手势触摸,只需要改变CurrentIndex即可

- (IBAction)swipt:(UISwipeGestureRecognizer *)sender {
    self.currentIndex = (self.currentIndex + 1)%[self blurEffectArray].count;
}

初始化的时候,指定最初的Index

- (void)viewDidLoad {
    [super viewDidLoad];
    self.imageview.userInteractionEnabled = YES;
    self.currentIndex = 0;
    // Do any additional setup after loading the view, typically from a nib.
}

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。