123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394 |
- //
- // BaseView.m
- // BRPickerViewDemo
- //
- // Created by renbo on 2017/8/11.
- // Copyright © 2017 irenb. All rights reserved.
- //
- // 最新代码下载地址:https://github.com/91renb/BRPickerView
- #import "BRBaseView.h"
- @interface BRBaseView ()
- // 蒙层视图
- @property (nonatomic, strong) UIView *maskView;
- // 标题栏背景视图
- @property (nonatomic, strong) UIView *titleBarView;
- // 左边取消按钮
- @property (nonatomic, strong) UIButton *cancelBtn;
- // 右边确定按钮
- @property (nonatomic, strong) UIButton *doneBtn;
- // 中间标题
- @property (nonatomic, strong) UILabel *titleLabel;
- // 取消按钮离屏幕边缘的距离
- @property (nonatomic, assign) CGFloat cancelBtnMargin;
- // 确定按钮离屏幕边缘的距离
- @property (nonatomic, assign) CGFloat doneBtnMargin;
- @end
- @implementation BRBaseView
- - (void)initUI {
- self.frame = self.keyView.bounds;
- // 设置子视图的宽度随着父视图变化
- self.autoresizingMask = UIViewAutoresizingFlexibleBottomMargin | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
-
- if (!self.pickerStyle.hiddenMaskView) {
- [self addSubview:self.maskView];
- }
-
- [self addSubview:self.alertView];
-
- // 是否隐藏标题栏
- if (!self.pickerStyle.hiddenTitleBarView) {
- [self.alertView addSubview:self.titleBarView];
- [self.alertView sendSubviewToBack:self.titleBarView];
- if (!self.pickerStyle.hiddenTitleLabel) {
- [self.titleBarView addSubview:self.titleLabel];
- }
- if (!self.pickerStyle.hiddenCancelBtn) {
- [self.titleBarView addSubview:self.cancelBtn];
- // 获取边距
- if (self.pickerStyle.cancelBtnFrame.origin.x < self.bounds.size.width / 2) {
- self.cancelBtnMargin = self.pickerStyle.cancelBtnFrame.origin.x;
- } else {
- self.cancelBtnMargin = self.bounds.size.width - self.pickerStyle.cancelBtnFrame.origin.x - self.pickerStyle.cancelBtnFrame.size.width;
- }
- }
- if (!self.pickerStyle.hiddenDoneBtn) {
- [self.titleBarView addSubview:self.doneBtn];
- // 获取边距
- if (self.pickerStyle.doneBtnFrame.origin.x < self.bounds.size.width / 2) {
- self.doneBtnMargin = self.pickerStyle.doneBtnFrame.origin.x;
- } else {
- self.doneBtnMargin = self.bounds.size.width - self.pickerStyle.doneBtnFrame.origin.x - self.pickerStyle.doneBtnFrame.size.width;
- }
- }
- }
- }
- #pragma mark - 适配横屏安全区域,更新子视图布局
- - (void)layoutSubviews {
- [super layoutSubviews];
- if (_cancelBtn || _doneBtn) {
- if (@available(iOS 11.0, *)) {
- UIEdgeInsets safeInsets = self.safeAreaInsets;
- if (_cancelBtn) {
- CGRect cancelBtnFrame = self.pickerStyle.cancelBtnFrame;
- if (cancelBtnFrame.origin.x < MIN(self.bounds.size.width / 2, self.bounds.size.height / 2)) {
- cancelBtnFrame.origin.x += safeInsets.left;
- } else {
- cancelBtnFrame.origin.x = self.bounds.size.width - cancelBtnFrame.size.width - safeInsets.right - self.cancelBtnMargin;
- }
- self.cancelBtn.frame = cancelBtnFrame;
- }
- if (_doneBtn) {
- CGRect doneBtnFrame = self.pickerStyle.doneBtnFrame;
- if (doneBtnFrame.origin.x < MIN(self.bounds.size.width / 2, self.bounds.size.height / 2)) {
- doneBtnFrame.origin.x += safeInsets.left;
- } else {
- doneBtnFrame.origin.x = self.bounds.size.width - doneBtnFrame.size.width - safeInsets.right - self.doneBtnMargin;
- }
- self.doneBtn.frame = doneBtnFrame;
- }
- }
- }
-
- if (_alertView && self.pickerStyle.topCornerRadius > 0) {
- // 设置顶部圆角
- [self br_setView:_alertView roundingCorners:UIRectCornerTopLeft | UIRectCornerTopRight withRadius:self.pickerStyle.topCornerRadius];
- }
- }
- #pragma mark - 蒙层视图
- - (UIView *)maskView {
- if (!_maskView) {
- _maskView = [[UIView alloc]initWithFrame:self.keyView.bounds];
- _maskView.backgroundColor = self.pickerStyle.maskColor;
- // 设置子视图的大小随着父视图变化
- _maskView.autoresizingMask = UIViewAutoresizingFlexibleBottomMargin | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
- _maskView.userInteractionEnabled = YES;
- UITapGestureRecognizer *myTap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(didTapMaskView:)];
- [_maskView addGestureRecognizer:myTap];
- }
- return _maskView;
- }
- #pragma mark - 弹框视图
- - (UIView *)alertView {
- if (!_alertView) {
- CGFloat accessoryViewHeight = 0;
- if (self.pickerHeaderView) {
- accessoryViewHeight += self.pickerHeaderView.bounds.size.height;
- }
- if (self.pickerFooterView) {
- accessoryViewHeight += self.pickerFooterView.bounds.size.height;
- }
- CGFloat height = self.pickerStyle.titleBarHeight + self.pickerStyle.pickerHeight + self.pickerStyle.paddingBottom + accessoryViewHeight;
- _alertView = [[UIView alloc]initWithFrame:CGRectMake(0, self.keyView.bounds.size.height - height, self.keyView.bounds.size.width, height)];
- _alertView.backgroundColor = self.pickerStyle.alertViewColor ? self.pickerStyle.alertViewColor : self.pickerStyle.pickerColor;
- if (!self.pickerStyle.topCornerRadius && !self.pickerStyle.hiddenShadowLine) {
- // 设置弹框视图顶部边框线
- UIView *shadowLineView = [[UIView alloc]initWithFrame:CGRectMake(0, 0, _alertView.frame.size.width, self.pickerStyle.shadowLineHeight)];
- shadowLineView.backgroundColor = self.pickerStyle.shadowLineColor;
- shadowLineView.autoresizingMask = UIViewAutoresizingFlexibleWidth;
- [_alertView addSubview:shadowLineView];
- }
- _alertView.autoresizingMask = UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleWidth;
- }
- return _alertView;
- }
- #pragma mark - 标题栏视图
- - (UIView *)titleBarView {
- if (!_titleBarView) {
- _titleBarView =[[UIView alloc]initWithFrame:CGRectMake(0, 0, self.keyView.bounds.size.width, self.pickerStyle.titleBarHeight)];
- _titleBarView.backgroundColor = self.pickerStyle.titleBarColor;
- _titleBarView.autoresizingMask = UIViewAutoresizingFlexibleWidth;
- if (!self.pickerStyle.hiddenTitleLine) {
- // 设置标题栏底部分割线
- UIView *titleLineView = [[UIView alloc]initWithFrame:CGRectMake(0, _titleBarView.frame.size.height - 0.5f, _titleBarView.frame.size.width, 0.5f)];
- titleLineView.backgroundColor = self.pickerStyle.titleLineColor;
- titleLineView.autoresizingMask = UIViewAutoresizingFlexibleWidth;
- [_titleBarView addSubview:titleLineView];
- }
- }
- return _titleBarView;
- }
- #pragma mark - 取消按钮
- - (UIButton *)cancelBtn {
- if (!_cancelBtn) {
- _cancelBtn = [UIButton buttonWithType:UIButtonTypeCustom];
- _cancelBtn.frame = self.pickerStyle.cancelBtnFrame;
- _cancelBtn.autoresizingMask = UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleLeftMargin;
- _cancelBtn.backgroundColor = self.pickerStyle.cancelColor;;
- _cancelBtn.titleLabel.font = self.pickerStyle.cancelTextFont;
- [_cancelBtn setTitleColor:self.pickerStyle.cancelTextColor forState:UIControlStateNormal];
- if (self.pickerStyle.cancelBtnImage) {
- [_cancelBtn setImage:self.pickerStyle.cancelBtnImage forState:UIControlStateNormal];
- }
- if (self.pickerStyle.cancelBtnTitle) {
- [_cancelBtn setTitle:self.pickerStyle.cancelBtnTitle forState:UIControlStateNormal];
- }
- [_cancelBtn addTarget:self action:@selector(clickCancelBtn) forControlEvents:UIControlEventTouchUpInside];
- // 设置按钮圆角或边框
- if (self.pickerStyle.cancelBorderStyle == BRBorderStyleSolid) {
- _cancelBtn.layer.cornerRadius = self.pickerStyle.cancelCornerRadius > 0 ? self.pickerStyle.cancelCornerRadius : 6.0f;
- _cancelBtn.layer.borderColor = self.pickerStyle.cancelTextColor.CGColor;
- _cancelBtn.layer.borderWidth = self.pickerStyle.cancelBorderWidth > 0 ? self.pickerStyle.cancelBorderWidth : 1.0f;
- _cancelBtn.layer.masksToBounds = YES;
- } else if (self.pickerStyle.cancelBorderStyle == BRBorderStyleFill) {
- _cancelBtn.layer.cornerRadius = self.pickerStyle.cancelCornerRadius > 0 ? self.pickerStyle.cancelCornerRadius : 6.0f;
- _cancelBtn.layer.masksToBounds = YES;
- }
- }
- return _cancelBtn;
- }
- #pragma mark - 确定按钮
- - (UIButton *)doneBtn {
- if (!_doneBtn) {
- _doneBtn = [UIButton buttonWithType:UIButtonTypeCustom];
- _doneBtn.frame = self.pickerStyle.doneBtnFrame;
- _doneBtn.autoresizingMask = UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleLeftMargin;
- _doneBtn.backgroundColor = self.pickerStyle.doneColor;
- if (self.pickerStyle.doneBtnImage) {
- [_doneBtn setImage:self.pickerStyle.doneBtnImage forState:UIControlStateNormal];
- }
- if (self.pickerStyle.doneBtnTitle) {
- _doneBtn.titleLabel.font = self.pickerStyle.doneTextFont;
- [_doneBtn setTitleColor:self.pickerStyle.doneTextColor forState:UIControlStateNormal];
- [_doneBtn setTitle:self.pickerStyle.doneBtnTitle forState:UIControlStateNormal];
- }
- [_doneBtn addTarget:self action:@selector(clickDoneBtn) forControlEvents:UIControlEventTouchUpInside];
- // 设置按钮圆角或边框
- if (self.pickerStyle.doneBorderStyle == BRBorderStyleSolid) {
- _doneBtn.layer.cornerRadius = self.pickerStyle.doneCornerRadius > 0 ? self.pickerStyle.doneCornerRadius : 6.0f;
- _doneBtn.layer.borderColor = self.pickerStyle.doneTextColor.CGColor;
- _doneBtn.layer.borderWidth = self.pickerStyle.doneBorderWidth > 0 ? self.pickerStyle.doneBorderWidth : 1.0f;
- _doneBtn.layer.masksToBounds = YES;
- } else if (self.pickerStyle.doneBorderStyle == BRBorderStyleFill) {
- _doneBtn.layer.cornerRadius = self.pickerStyle.doneCornerRadius > 0 ? self.pickerStyle.doneCornerRadius : 6.0f;
- _doneBtn.layer.masksToBounds = YES;
- }
- }
- return _doneBtn;
- }
- #pragma mark - 中间标题label
- - (UILabel *)titleLabel {
- if (!_titleLabel) {
- _titleLabel = [[UILabel alloc]initWithFrame:self.pickerStyle.titleLabelFrame];
- _titleLabel.backgroundColor = self.pickerStyle.titleLabelColor;
- _titleLabel.autoresizingMask = UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleLeftMargin;
- _titleLabel.textAlignment = NSTextAlignmentCenter;
- _titleLabel.font = self.pickerStyle.titleTextFont;
- _titleLabel.textColor = self.pickerStyle.titleTextColor;
- _titleLabel.text = self.title;
- }
- return _titleLabel;
- }
- #pragma mark - 点击蒙层视图事件
- - (void)didTapMaskView:(UITapGestureRecognizer *)sender {
- [self removePickerFromView:nil];
- if (self.cancelBlock) {
- self.cancelBlock();
- }
- }
- #pragma mark - 取消按钮的点击事件
- - (void)clickCancelBtn {
- [self removePickerFromView:nil];
- if (self.cancelBlock) {
- self.cancelBlock();
- }
- }
- #pragma mark - 确定按钮的点击事件
- - (void)clickDoneBtn {
- if (self.doneBlock) {
- self.doneBlock();
- }
- }
- #pragma mark - 添加视图方法
- - (void)addPickerToView:(UIView *)view {
- if (view) {
- self.frame = view.bounds;
- self.autoresizingMask = UIViewAutoresizingFlexibleBottomMargin | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
-
- CGFloat accessoryViewHeight = 0;
- if (self.pickerHeaderView) {
- CGRect rect = self.pickerHeaderView.frame;
- self.pickerHeaderView.frame = CGRectMake(0, 0, view.bounds.size.width, rect.size.height);
- self.pickerHeaderView.autoresizingMask = UIViewAutoresizingFlexibleWidth;
- [self addSubview:self.pickerHeaderView];
-
- accessoryViewHeight += self.pickerHeaderView.bounds.size.height;
- }
- if (self.pickerFooterView) {
- CGRect rect = self.pickerFooterView.frame;
- self.pickerFooterView.frame = CGRectMake(0, view.bounds.size.height - rect.size.height, view.bounds.size.width, rect.size.height);
- self.pickerFooterView.autoresizingMask = UIViewAutoresizingFlexibleWidth;
- [self addSubview:self.pickerFooterView];
-
- accessoryViewHeight += self.pickerFooterView.bounds.size.height;
- }
-
- [view addSubview:self];
- } else {
- [self initUI];
-
- if (self.pickerHeaderView) {
- CGRect rect = self.pickerHeaderView.frame;
- CGFloat titleBarHeight = self.pickerStyle.hiddenTitleBarView ? 0 : self.pickerStyle.titleBarHeight;
- self.pickerHeaderView.frame = CGRectMake(0, titleBarHeight, self.alertView.bounds.size.width, rect.size.height);
- self.pickerHeaderView.autoresizingMask = UIViewAutoresizingFlexibleWidth;
- [self.alertView addSubview:self.pickerHeaderView];
- }
- if (self.pickerFooterView) {
- CGRect rect = self.pickerFooterView.frame;
- self.pickerFooterView.frame = CGRectMake(0, self.alertView.bounds.size.height - self.pickerStyle.paddingBottom - rect.size.height, self.alertView.bounds.size.width, rect.size.height);
- self.pickerFooterView.autoresizingMask = UIViewAutoresizingFlexibleWidth;
- [self.alertView addSubview:self.pickerFooterView];
- }
-
- [self.keyView addSubview:self];
- // 动画前初始位置
- CGRect rect = self.alertView.frame;
- rect.origin.y = self.bounds.size.height;
- self.alertView.frame = rect;
- // 弹出动画
- if (!self.pickerStyle.hiddenMaskView) {
- self.maskView.alpha = 0;
- }
- [UIView animateWithDuration:0.3 animations:^{
- if (!self.pickerStyle.hiddenMaskView) {
- self.maskView.alpha = 1;
- }
- CGFloat alertViewHeight = self.alertView.bounds.size.height;
- CGRect rect = self.alertView.frame;
- rect.origin.y -= alertViewHeight;
- self.alertView.frame = rect;
- }];
- }
- }
- #pragma mark - 移除视图方法
- - (void)removePickerFromView:(UIView *)view {
- if (view) {
- [self removeFromSuperview];
- } else {
- // 关闭动画
- [UIView animateWithDuration:0.2 animations:^{
- CGFloat alertViewHeight = self.alertView.bounds.size.height;
- CGRect rect = self.alertView.frame;
- rect.origin.y += alertViewHeight;
- self.alertView.frame = rect;
- if (!self.pickerStyle.hiddenMaskView) {
- self.maskView.alpha = 0;
- }
- } completion:^(BOOL finished) {
- [self removeFromSuperview];
- }];
- }
- }
- #pragma mark - 刷新选择器数据
- - (void)reloadData {
-
- }
- #pragma mark - 添加自定义视图到选择器(picker)上
- - (void)addSubViewToPicker:(UIView *)customView {
-
- }
- #pragma mark - 添加自定义视图到标题栏(titleBar)上
- - (void)addSubViewToTitleBar:(UIView *)customView {
- if (!self.pickerStyle.hiddenTitleBarView) {
- [self.titleBarView addSubview:customView];
- }
- }
- - (BRPickerStyle *)pickerStyle {
- if (!_pickerStyle) {
- _pickerStyle = [[BRPickerStyle alloc]init];
- }
- return _pickerStyle;
- }
- - (UIView *)keyView {
- if (!_keyView) {
- _keyView = BRGetKeyWindow();
- }
- return _keyView;
- }
- #pragma mark - 设置 view 的部分圆角
- // corners(枚举类型,可组合使用):UIRectCornerTopLeft | UIRectCornerTopRight | UIRectCornerBottomLeft | UIRectCornerBottomRight | UIRectCornerAllCorners
- - (void)br_setView:(UIView *)view roundingCorners:(UIRectCorner)corners withRadius:(CGFloat)radius {
- UIBezierPath *rounded = [UIBezierPath bezierPathWithRoundedRect:view.bounds byRoundingCorners:corners cornerRadii:CGSizeMake(radius, radius)];
- CAShapeLayer *shape = [[CAShapeLayer alloc]init];
- [shape setPath:rounded.CGPath];
- view.layer.mask = shape;
- }
- #pragma mark - setter 方法(支持动态设置标题)
- - (void)setTitle:(NSString *)title {
- _title = title;
- if (_titleLabel) {
- _titleLabel.text = title;
- }
- }
- - (void)dealloc {
- NSLog(@"%@ dealloc", NSStringFromClass([self class]));
- }
- @end
|