2024-06-07 11:41:02 +08:00

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