203 lines
4.6 KiB
Objective-C
203 lines
4.6 KiB
Objective-C
//
|
|
// HWDimmedView.m
|
|
// HWPanModal
|
|
//
|
|
// Created by heath wang on 2019/4/26.
|
|
//
|
|
|
|
#import "HWDimmedView.h"
|
|
#import "HWVisualEffectView.h"
|
|
#import "HWBackgroundConfig.h"
|
|
|
|
@interface HWDimmedView ()
|
|
|
|
@property (nonatomic, strong) UIView *backgroundView;
|
|
@property (nonatomic, strong) HWVisualEffectView *blurView;
|
|
@property (nonatomic, strong) HWBackgroundConfig *backgroundConfig;
|
|
|
|
@property (nonatomic, assign) CGFloat maxDimAlpha;
|
|
@property (nonatomic, assign) CGFloat maxBlurRadius;
|
|
@property (nonatomic, assign) CGFloat maxBlurTintAlpha;
|
|
@property (nonatomic, strong) UITapGestureRecognizer *tapGestureRecognizer;
|
|
@property (nonatomic, assign) BOOL isBlurMode;
|
|
|
|
@end
|
|
|
|
@implementation HWDimmedView
|
|
|
|
- (instancetype)initWithDimAlpha:(CGFloat)dimAlpha blurRadius:(CGFloat)blurRadius {
|
|
self = [super initWithFrame:CGRectZero];
|
|
if (self) {
|
|
_maxBlurRadius = blurRadius;
|
|
_maxDimAlpha = dimAlpha;
|
|
[self commonInit];
|
|
}
|
|
|
|
return self;
|
|
}
|
|
|
|
- (instancetype)initWithFrame:(CGRect)frame {
|
|
self = [super initWithFrame:frame];
|
|
if (self) {
|
|
_maxDimAlpha = 0.7;
|
|
[self commonInit];
|
|
}
|
|
|
|
return self;
|
|
}
|
|
|
|
- (instancetype)initWithBackgroundConfig:(HWBackgroundConfig *)backgroundConfig {
|
|
self = [super initWithFrame:CGRectZero];
|
|
if (self) {
|
|
self.backgroundConfig = backgroundConfig;
|
|
_maxDimAlpha = backgroundConfig.backgroundAlpha;
|
|
_maxBlurRadius = backgroundConfig.backgroundBlurRadius;
|
|
_blurTintColor = backgroundConfig.blurTintColor;
|
|
|
|
[self commonInit];
|
|
}
|
|
|
|
return self;
|
|
}
|
|
|
|
- (void)commonInit {
|
|
_dimState = DimStateOff;
|
|
_maxBlurTintAlpha = 0.5;
|
|
// default, max alpha.
|
|
_percent = 1;
|
|
_tapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(didTapView)];
|
|
[self addGestureRecognizer:_tapGestureRecognizer];
|
|
|
|
[self setupView];
|
|
}
|
|
|
|
- (void)setupView {
|
|
self.isBlurMode = self.maxBlurRadius > 0 || self.backgroundConfig.visualEffect;
|
|
if (self.isBlurMode) {
|
|
[self addSubview:self.blurView];
|
|
[self configBlurView];
|
|
} else {
|
|
[self addSubview:self.backgroundView];
|
|
}
|
|
}
|
|
|
|
#pragma mark - layout
|
|
|
|
- (void)layoutSubviews {
|
|
[super layoutSubviews];
|
|
|
|
// not call getter.
|
|
_blurView.frame = self.bounds;
|
|
_backgroundView.frame = self.bounds;
|
|
}
|
|
|
|
#pragma mark - touch action
|
|
|
|
- (void)didTapView {
|
|
self.tapBlock ? self.tapBlock(self.tapGestureRecognizer) : nil;
|
|
}
|
|
|
|
#pragma mark - public method
|
|
|
|
- (void)reloadConfig:(HWBackgroundConfig *)backgroundConfig {
|
|
|
|
for (UIView *view in self.subviews) {
|
|
[view removeFromSuperview];
|
|
}
|
|
|
|
self.backgroundConfig = backgroundConfig;
|
|
_maxDimAlpha = backgroundConfig.backgroundAlpha;
|
|
_maxBlurRadius = backgroundConfig.backgroundBlurRadius;
|
|
_blurTintColor = backgroundConfig.blurTintColor;
|
|
|
|
[self setupView];
|
|
|
|
DimState state = self.dimState;
|
|
self.dimState = state;
|
|
}
|
|
|
|
#pragma mark - private method
|
|
|
|
- (void)updateAlpha {
|
|
CGFloat alpha = 0;
|
|
CGFloat blurRadius = 0;
|
|
CGFloat blurTintAlpha = 0;
|
|
|
|
switch (self.dimState) {
|
|
case DimStateMax:{
|
|
alpha = self.maxDimAlpha;
|
|
blurRadius = self.maxBlurRadius;
|
|
blurTintAlpha = self.maxBlurTintAlpha;
|
|
}
|
|
break;
|
|
case DimStatePercent: {
|
|
CGFloat percent = MAX(0, MIN(1.0f, self.percent));
|
|
alpha = self.maxDimAlpha * percent;
|
|
blurRadius = self.maxBlurRadius * percent;
|
|
blurTintAlpha = self.maxBlurTintAlpha * percent;
|
|
}
|
|
default:
|
|
break;
|
|
}
|
|
|
|
if (self.isBlurMode) {
|
|
if (self.backgroundConfig.visualEffect) return;
|
|
|
|
self.blurView.blurRadius = blurRadius;
|
|
self.blurView.colorTintAlpha = blurTintAlpha;
|
|
} else {
|
|
self.backgroundView.alpha = alpha;
|
|
}
|
|
}
|
|
|
|
- (void)configBlurView {
|
|
if (self.backgroundConfig.visualEffect) {
|
|
[_blurView updateBlurEffect:self.backgroundConfig.visualEffect];
|
|
} else {
|
|
_blurView.colorTint = [UIColor whiteColor];
|
|
_blurView.colorTintAlpha = self.maxBlurTintAlpha;
|
|
_blurView.userInteractionEnabled = NO;
|
|
}
|
|
}
|
|
|
|
#pragma mark - Setter
|
|
|
|
- (void)setDimState:(DimState)dimState {
|
|
_dimState = dimState;
|
|
[self updateAlpha];
|
|
}
|
|
|
|
- (void)setPercent:(CGFloat)percent {
|
|
_percent = percent;
|
|
[self updateAlpha];
|
|
}
|
|
|
|
#pragma mark - Getter
|
|
|
|
- (UIView *)backgroundView {
|
|
if (!_backgroundView) {
|
|
_backgroundView = [UIView new];
|
|
_backgroundView.userInteractionEnabled = NO;
|
|
_backgroundView.alpha = 0;
|
|
_backgroundView.backgroundColor = [UIColor blackColor];
|
|
}
|
|
return _backgroundView;
|
|
}
|
|
|
|
- (HWVisualEffectView *)blurView {
|
|
if (!_blurView) {
|
|
_blurView = [HWVisualEffectView new];
|
|
}
|
|
return _blurView;
|
|
}
|
|
|
|
#pragma mark - Setter
|
|
|
|
- (void)setBlurTintColor:(UIColor *)blurTintColor {
|
|
_blurTintColor = blurTintColor;
|
|
_blurView.colorTint = _blurTintColor;
|
|
}
|
|
|
|
|
|
@end
|