123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210 |
- //
- // KSChoosePicker.m
- // TeacherDaya
- //
- // Created by Kyle on 2019/10/16.
- // Copyright © 2019 DayaMusic. All rights reserved.
- //
- #import "KSChoosePicker.h"
- @interface KSChoosePicker ()<UIPickerViewDelegate,UIPickerViewDataSource,UIGestureRecognizerDelegate>
- @property (nonatomic, strong) UIView *backView; // 背景图
- @property (nonatomic, strong) UIView *displayView;
- @property (nonatomic, strong) UIView *contentView;
- @property (nonatomic, strong) NSArray *sourceData;
- @property (nonatomic, strong) UIPickerView *picker; // 选择器
- @property (nonatomic, copy) PickerChooseCallback callback;
- @property (nonatomic, copy) PickerCancelCallback cancelCallback;
- @property (nonatomic, assign) NSInteger chooseIndex;
- @end
- @implementation KSChoosePicker
- - (instancetype)initWithTitle:(NSString * __nullable)title sourceData:(NSArray *)sourceData chooseReturnWithBlock:(PickerChooseCallback)callback cancel:(PickerCancelCallback)cancelCallback {
- if (self = [super init]) {
- if (callback) {
- self.callback = callback;
- }
- if (cancelCallback) {
- self.cancelCallback = cancelCallback;
- }
- self.sourceData = sourceData;
- self.frame = CGRectMake(0, 0, kScreen_Width, kScreen_Height);
- self.backView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, kScreen_Width, kScreen_Height)];
- self.backView.backgroundColor = HexRGBAlpha(0x000000, 0.5f);
- [self addSubview:_backView];
-
- UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapAction:)];
- tapGesture.delegate = self;
- [self.backView addGestureRecognizer:tapGesture];
-
- self.displayView = [[UIView alloc] initWithFrame:CGRectMake(0, kScreen_Height, kScreen_Width, 255)];
- self.displayView.backgroundColor = [UIColor whiteColor];
- [self.backView addSubview:self.displayView];
-
- self.displayView.layer.masksToBounds = YES;
- if (@available(iOS 11.0, *)) {
- self.displayView.layer.cornerRadius = 10;
- self.displayView.layer.maskedCorners = kCALayerMinXMinYCorner | kCALayerMaxXMinYCorner; // 左上圆角
- }
- else {
- UIBezierPath * path = [UIBezierPath bezierPathWithRoundedRect:self.displayView.bounds byRoundingCorners:UIRectCornerBottomLeft | UIRectCornerBottomRight cornerRadii:CGSizeMake(10, 10)];
- CAShapeLayer *maskLayer = [[CAShapeLayer alloc] init];
- maskLayer.frame = self.displayView.bounds;
- maskLayer.path = path.CGPath;
- self.displayView.layer.mask = maskLayer;
- }
-
- _contentView = [[UIView alloc] initWithFrame:CGRectMake(0, 39, kScreen_Width, 216)];
- _contentView.backgroundColor = [UIColor whiteColor];
- [_displayView addSubview:_contentView];
-
- [self initPickerViews];
- self.chooseIndex = 0;
- // 按钮
- UIButton *cancleButton = [UIButton buttonWithType:UIButtonTypeCustom];
- [cancleButton setTitle:@"取消" forState:UIControlStateNormal];
- cancleButton.titleLabel.font = [UIFont systemFontOfSize:17.0f];
- [cancleButton setTitleColor:HexRGB(0x666666) forState:UIControlStateNormal];
- [cancleButton addTarget:self action:@selector(cancleButtonAction:) forControlEvents:UIControlEventTouchUpInside];
- cancleButton.frame = CGRectMake(20, 10, 60, 30);
- [self.displayView addSubview:cancleButton];
-
-
- UIButton *sureButton = [UIButton buttonWithType:UIButtonTypeCustom];
- [sureButton setTitle:@"确定" forState:UIControlStateNormal];
- sureButton.titleLabel.font = [UIFont systemFontOfSize:17.0f];
- [sureButton setTitleColor:THEMECOLOR forState:UIControlStateNormal];
- [sureButton addTarget:self action:@selector(doneButtonAction:) forControlEvents:UIControlEventTouchUpInside];
- sureButton.frame = CGRectMake(kScreen_Width - 80, 10, 60, 30);
- [self.displayView addSubview:sureButton];
-
- [UIView animateWithDuration:0.3f animations:^{
- self.displayView.frame = CGRectMake(0, kScreen_Height - 255, kScreen_Width, 255);
- } completion:^(BOOL finished) {
-
- }];
- // titleLabel
- if (![NSString isEmptyString:title]) {
- UILabel *titleLabel = [[UILabel alloc] init];
- [titleLabel setTextColor:HexRGB(0x444444)];
- [titleLabel setFont:[UIFont systemFontOfSize:16.0f weight:UIFontWeightMedium]];
- titleLabel.textAlignment = NSTextAlignmentCenter;
- titleLabel.text = title;
- [self.displayView addSubview:titleLabel];
- [titleLabel mas_makeConstraints:^(MASConstraintMaker *make) {
- make.left.mas_equalTo(cancleButton.mas_right).offset(10);
- make.top.mas_equalTo(self.displayView.mas_top).offset(10);
- make.right.mas_equalTo(sureButton.mas_left).offset(-10);
- make.height.mas_equalTo(30);
- }];
- }
-
-
- }
- return self;
- }
- // 创建选择器
- - (void)initPickerViews {
- // 更新数据源
- CGRect frame = _contentView.frame;
- CGFloat height = CGRectGetHeight(frame);
- CGFloat width = CGRectGetWidth(frame);
- _picker = [[UIPickerView alloc] initWithFrame:CGRectMake(0, 0, width, height)];
- _picker.delegate = self;
- [_picker setShowsSelectionIndicator:YES];
- [_contentView addSubview:_picker];
- }
- - (void)cancleButtonAction:(UIButton *)sender {
- if (self.cancelCallback) {
- self.cancelCallback();
- }
- [UIView animateWithDuration:0.3f animations:^{
- self.displayView.frame = CGRectMake(0, kScreen_Height, kScreen_Width, 255);
- } completion:^(BOOL finished) {
- [self removeFromSuperview];
- }];
-
- }
- - (void)doneButtonAction:(UIButton *)sender {
- if (self.callback) {
- NSString *returnValue = self.sourceData[_chooseIndex];
- self.callback(returnValue, self.chooseIndex);
- }
- [UIView animateWithDuration:0.3f animations:^{
- self.displayView.frame = CGRectMake(0, kScreen_Height, kScreen_Width, 255);
- } completion:^(BOOL finished) {
- [self removeFromSuperview];
- }];
- }
- - (void)tapAction:(UITapGestureRecognizer *)gesture {
- if (self.cancelCallback) {
- self.cancelCallback();
- }
- [UIView animateWithDuration:0.3f animations:^{
- self.displayView.frame = CGRectMake(0, kScreen_Height, kScreen_Width, 255);
- } completion:^(BOOL finished) {
- [self removeFromSuperview];
- }];
- }
- - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
- if ([touch.view isDescendantOfView:self.displayView]) {
- return NO;
- }
- return YES;
- }
- - (void)showPicker {
- UIWindow *window = [[[UIApplication sharedApplication] delegate] window];
- [window addSubview:self];
- }
- #pragma mark --- UIPickerView Datasource
- - (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView {
- return 1;
- }
- - (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component {
- return self.sourceData.count;
- }
- - (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component {
- NSInteger index = row;
- NSString *titleMessage = self.sourceData[index];
- return titleMessage;
- }
- - (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component {
- [pickerView selectRow:row inComponent:component animated:YES];
- _chooseIndex = row;
- }
- #pragma mark ---- UIPickerView delegate
- - (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view {
- UILabel *pickerLabel = (UILabel *)view;
- if (!pickerLabel) {
- pickerLabel = [[UILabel alloc] init];
- [pickerLabel setTextAlignment:NSTextAlignmentCenter];
- [pickerLabel setBackgroundColor:[UIColor clearColor]];
- [pickerLabel setFont:[UIFont systemFontOfSize:16.0f weight:UIFontWeightMedium]];
- [pickerLabel setTextColor:HexRGB(0x444444)];
- }
- pickerLabel.text = [self pickerView:pickerView titleForRow:row forComponent:component];
- return pickerLabel;
- }
- /*
- // Only override drawRect: if you perform custom drawing.
- // An empty implementation adversely affects performance during animation.
- - (void)drawRect:(CGRect)rect {
- // Drawing code
- }
- */
- @end
|