// // Created by 刘超 on 15/4/26. // Copyright (c) 2015年 Leo. All rights reserved. // // Email: leoios@sina.com // GitHub: http://github.com/LeoiOS // 如有问题或建议请给我发Email, 或在该项目的GitHub主页lssues我, 谢谢:) // #import "LCActionSheet.h" // 按钮高度 #define BUTTON_H 49.0f // 屏幕尺寸 #define SCREEN_SIZE [UIScreen mainScreen].bounds.size // 颜色 #define LCColor(r, g, b) [UIColor colorWithRed:(r)/255.0f green:(g)/255.0f blue:(b)/255.0f alpha:1.0f] @interface LCActionSheet () { /** 所有按钮 */ NSArray *_buttonTitles; /** 暗黑色的view */ UIView *_darkView; /** 所有按钮的底部view */ UIView *_bottomView; /** 代理 */ id _delegate; } @property (nonatomic, strong) UIWindow *backWindow; @end @implementation LCActionSheet + (instancetype)sheetWithTitle:(NSString *)title buttonTitles:(NSArray *)titles redButtonIndex:(NSInteger)buttonIndex delegate:(id)delegate { return [[self alloc] initWithTitle:title buttonTitles:titles redButtonIndex:buttonIndex delegate:delegate]; } - (instancetype)initWithTitle:(NSString *)title buttonTitles:(NSArray *)titles redButtonIndex:(NSInteger)buttonIndex delegate:(id)delegate { if (self = [super init]) { _delegate = delegate; // 暗黑色的view UIView *darkView = [[UIView alloc] init]; [darkView setAlpha:0]; [darkView setUserInteractionEnabled:NO]; [darkView setFrame:(CGRect){0, 0, SCREEN_SIZE}]; [darkView setBackgroundColor:LCColor(46, 49, 50)]; [self addSubview:darkView]; _darkView = darkView; UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(dismiss:)]; [darkView addGestureRecognizer:tap]; // 所有按钮的底部view UIView *bottomView = [[UIView alloc] init]; [bottomView setBackgroundColor:LCColor(233, 233, 238)]; [self addSubview:bottomView]; _bottomView = bottomView; if (title) { _title = title; // 标题 UILabel *label = [[UILabel alloc] init]; [label setText:title]; [label setTextColor:LCColor(111, 111, 111)]; [label setTextAlignment:NSTextAlignmentCenter]; [label setFont:[UIFont systemFontOfSize:13.0f]]; [label setBackgroundColor:[UIColor whiteColor]]; [label setFrame:CGRectMake(0, 0, SCREEN_SIZE.width, BUTTON_H)]; [label setNumberOfLines:0]; // label.lineBreakMode = UILineBreakModeWordWrap; [bottomView addSubview:label]; } if (titles.count) { _buttonTitles = titles; for (int i = 0; i < titles.count; i++) { // 所有按钮 UIButton *btn = [[UIButton alloc] init]; [btn setTag:i]; [btn setBackgroundColor:[UIColor whiteColor]]; [btn setTitle:titles[i] forState:UIControlStateNormal]; [[btn titleLabel] setFont:[UIFont systemFontOfSize:16.0f]]; UIColor *titleColor = nil; if (i == buttonIndex) { titleColor = LCColor(255, 10, 10); } else { titleColor = [UIColor blackColor] ; } [btn setTitleColor:titleColor forState:UIControlStateNormal]; [btn setBackgroundImage:[UIImage imageNamed:@"bgImage_HL"] forState:UIControlStateHighlighted]; [btn addTarget:self action:@selector(didClickBtn:) forControlEvents:UIControlEventTouchUpInside]; CGFloat btnY = BUTTON_H * (i + (title ? 1 : 0)); [btn setFrame:CGRectMake(0, btnY, SCREEN_SIZE.width, BUTTON_H)]; [bottomView addSubview:btn]; } for (int i = 0; i < titles.count; i++) { // 所有线条 UIImageView *line = [[UIImageView alloc] init]; [line setImage:[UIImage imageNamed:@"cellLine"]]; [line setContentMode:UIViewContentModeCenter]; CGFloat lineY = (i + (title ? 1 : 0)) * BUTTON_H; [line setFrame:CGRectMake(0, lineY, SCREEN_SIZE.width, 1.0f)]; [bottomView addSubview:line]; } } // 取消按钮 UIButton *cancelBtn = [[UIButton alloc] init]; [cancelBtn setTag:titles.count]; [cancelBtn setBackgroundColor:[UIColor whiteColor]]; [cancelBtn setTitle:@"取消" forState:UIControlStateNormal]; [[cancelBtn titleLabel] setFont:[UIFont systemFontOfSize:16.0f]]; [cancelBtn setTitleColor:[UIColor blackColor] forState:UIControlStateNormal]; [cancelBtn setBackgroundImage:[UIImage imageNamed:@"bgImage_HL"] forState:UIControlStateHighlighted]; [cancelBtn addTarget:self action:@selector(didClickCancelBtn:) forControlEvents:UIControlEventTouchUpInside]; CGFloat btnY = BUTTON_H * (titles.count + (title ? 1 : 0)) + 5.0f; [cancelBtn setFrame:CGRectMake(0, btnY, SCREEN_SIZE.width, BUTTON_H+20)]; [bottomView addSubview:cancelBtn]; CGFloat bottomH = (title ? BUTTON_H : 0) + BUTTON_H * titles.count + BUTTON_H + 5.0f; [bottomView setFrame:CGRectMake(0, SCREEN_SIZE.height, SCREEN_SIZE.width, bottomH+20)]; [self setFrame:(CGRect){0, 0, SCREEN_SIZE}]; [self.backWindow addSubview:self]; } return self; } - (UIWindow *)backWindow { if (_backWindow == nil) { _backWindow = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]; _backWindow.windowLevel = UIWindowLevelStatusBar; _backWindow.backgroundColor = [UIColor clearColor]; _backWindow.hidden = NO; } return _backWindow; } - (void)didClickBtn:(UIButton *)btn { [self dismiss:nil]; if ([_delegate respondsToSelector:@selector(actionSheet:didClickedButton:)]) { [_delegate actionSheet:self didClickedButton:btn]; } } - (void)dismiss:(UITapGestureRecognizer *)tap { if ([_delegate respondsToSelector:@selector(actionSheet:didClickedBlankPlace:)]) { [_delegate actionSheet:self didClickedBlankPlace:0]; } RDS_WEAKSELF(weakSelf) [UIView animateWithDuration:0.3f delay:0 options:UIViewAnimationOptionCurveEaseOut animations:^{ __strong typeof(weakSelf)theSelf = weakSelf; [theSelf->_darkView setAlpha:0]; [theSelf->_darkView setUserInteractionEnabled:NO]; CGRect frame = theSelf->_bottomView.frame; frame.origin.y += frame.size.height; [theSelf->_bottomView setFrame:frame]; } completion:^(BOOL finished) { __strong typeof(weakSelf)theSelf = weakSelf; theSelf->_backWindow.hidden = YES; [theSelf removeFromSuperview]; }]; } - (void)didClickCancelBtn:(UIButton *)btn { RDS_WEAKSELF(weakSelf) [UIView animateWithDuration:0.3f delay:0 options:UIViewAnimationOptionCurveEaseOut animations:^{ __strong typeof(weakSelf)theSelf = weakSelf; [theSelf->_darkView setAlpha:0]; [theSelf->_darkView setUserInteractionEnabled:NO]; CGRect frame = theSelf->_bottomView.frame; frame.origin.y += frame.size.height; [theSelf->_bottomView setFrame:frame]; } completion:^(BOOL finished) { __strong typeof(weakSelf)theSelf = weakSelf; theSelf->_backWindow.hidden = YES; [theSelf removeFromSuperview]; if ([theSelf->_delegate respondsToSelector:@selector(actionSheet:didClickedButton:)]) { [theSelf->_delegate actionSheet:theSelf didClickedButton:btn]; } }]; } - (void)show { _backWindow.hidden = NO; RDS_WEAKSELF(weakSelf) [UIView animateWithDuration:0.3f delay:0 options:UIViewAnimationOptionCurveEaseOut animations:^{ __strong typeof(weakSelf)theSelf = weakSelf; [theSelf->_darkView setAlpha:0.4f]; [theSelf->_darkView setUserInteractionEnabled:YES]; CGRect frame = theSelf->_bottomView.frame; frame.origin.y -= frame.size.height; [theSelf->_bottomView setFrame:frame]; } completion:nil]; } - (void)dealloc { DDLog(@"dealloc"); } @end