// // MMAlertView.m // MMPopupView // // Created by Ralph Li on 9/6/15. // Copyright © 2015 LJC. All rights reserved. // #import "MMAlertView.h" #import "MMPopupItem.h" #import "MMPopupCategory.h" #import "MMPopupDefine.h" #import @interface MMAlertView() @property (nonatomic, strong) UILabel *titleLabel; @property (nonatomic, strong) UILabel *detailLabel; @property (nonatomic, strong) UITextField *inputView; @property (nonatomic, strong) UIView *buttonView; @property (nonatomic, strong) NSArray *actionItems; @property (nonatomic, copy) MMPopupInputHandler inputHandler; @end @implementation MMAlertView - (instancetype) initWithInputTitle:(NSString *)title detail:(NSString *)detail placeholder:(NSString *)inputPlaceholder keyboardType:(UIKeyboardType)keyboardType items:(NSArray*)items handler:(MMPopupInputHandler)inputHandler { return [self initWithTitle:title detail:detail items:items inputPlaceholder:inputPlaceholder keyboardType:keyboardType inputHandler:inputHandler]; } - (instancetype) initWithConfirmTitle:(NSString*)title detail:(NSString*)detail { MMAlertViewConfig *config = [MMAlertViewConfig globalConfig]; NSArray *items =@[ MMItemMake(config.defaultTextOK, MMItemTypeNormal, nil) ]; return [self initWithTitle:title detail:detail items:items inputPlaceholder:nil keyboardType:UIKeyboardTypeDefault inputHandler:nil]; } - (instancetype) initWithTitle:(NSString*)title detail:(NSString*)detail items:(NSArray*)items { return [self initWithTitle:title detail:detail items:items inputPlaceholder:nil keyboardType:UIKeyboardTypeDefault inputHandler:nil]; } - (instancetype)initWithTitle:(NSString *)title detail:(NSString *)detail items:(NSArray *)items inputPlaceholder:(NSString *)inputPlaceholder keyboardType:(UIKeyboardType)keyboardType inputHandler:(MMPopupInputHandler)inputHandler { self = [super init]; if ( self ) { NSAssert(items.count>0, @"Could not find any items."); MMAlertViewConfig *config = [MMAlertViewConfig globalConfig]; self.type = MMPopupTypeAlert; self.withKeyboard = (inputHandler!=nil); self.inputHandler = inputHandler; self.actionItems = items; self.layer.cornerRadius = config.cornerRadius; self.clipsToBounds = YES; self.backgroundColor = config.backgroundColor; self.layer.borderWidth = MM_SPLIT_WIDTH; self.layer.borderColor = config.splitColor.CGColor; [self mas_makeConstraints:^(MASConstraintMaker *make) { make.width.mas_equalTo(config.width); }]; [self setContentCompressionResistancePriority:UILayoutPriorityRequired forAxis:UILayoutConstraintAxisHorizontal]; [self setContentHuggingPriority:UILayoutPriorityFittingSizeLevel forAxis:UILayoutConstraintAxisVertical]; MASViewAttribute *lastAttribute = self.mas_top; if ( title.length > 0 ) { self.titleLabel = [UILabel new]; [self addSubview:self.titleLabel]; [self.titleLabel mas_makeConstraints:^(MASConstraintMaker *make) { make.top.equalTo(lastAttribute).offset(config.innerMargin); make.left.right.equalTo(self).insets(UIEdgeInsetsMake(0, config.innerMargin, 0, config.innerMargin)); }]; self.titleLabel.textColor = config.titleColor; self.titleLabel.textAlignment = NSTextAlignmentCenter; self.titleLabel.font = [UIFont boldSystemFontOfSize:config.titleFontSize]; self.titleLabel.numberOfLines = 0; self.titleLabel.backgroundColor = self.backgroundColor; self.titleLabel.text = title; lastAttribute = self.titleLabel.mas_bottom; } else { self.titleLabel = [UILabel new]; [self addSubview:self.titleLabel]; [self.titleLabel mas_makeConstraints:^(MASConstraintMaker *make) { make.top.equalTo(lastAttribute).offset(config.innerMargin); make.left.right.equalTo(self).insets(UIEdgeInsetsMake(0, 5, 0, 5)); }]; lastAttribute = self.titleLabel.mas_bottom; } if ( detail.length > 0 ) { self.detailLabel = [UILabel new]; [self addSubview:self.detailLabel]; [self.detailLabel mas_makeConstraints:^(MASConstraintMaker *make) { make.top.equalTo(lastAttribute).offset(10); make.left.right.equalTo(self).insets(UIEdgeInsetsMake(0, config.innerMargin, 0, config.innerMargin)); }]; self.detailLabel.textColor = config.detailColor; self.detailLabel.textAlignment = NSTextAlignmentCenter; self.detailLabel.font = [UIFont systemFontOfSize:config.detailFontSize]; self.detailLabel.numberOfLines = 0; self.detailLabel.backgroundColor = self.backgroundColor; self.detailLabel.text = detail; lastAttribute = self.detailLabel.mas_bottom; } if ( self.inputHandler ) { self.inputView = [UITextField new]; [self addSubview:self.inputView]; [self.inputView mas_makeConstraints:^(MASConstraintMaker *make) { make.top.equalTo(lastAttribute).offset(10); make.left.right.equalTo(self).insets(UIEdgeInsetsMake(0, config.innerMargin, 0, config.innerMargin)); make.height.mas_equalTo(40); }]; self.inputView.backgroundColor = self.backgroundColor; self.inputView.layer.borderWidth = MM_SPLIT_WIDTH; self.inputView.layer.borderColor = config.splitColor.CGColor; self.inputView.leftView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 5, 5)]; self.inputView.leftViewMode = UITextFieldViewModeAlways; self.inputView.clearButtonMode = UITextFieldViewModeWhileEditing; self.inputView.placeholder = inputPlaceholder; self.inputView.font = [UIFont systemFontOfSize:13.0]; if (keyboardType) { self.inputView.keyboardType = keyboardType; } self.inputView.textAlignment = NSTextAlignmentCenter; lastAttribute = self.inputView.mas_bottom; } self.buttonView = [UIView new]; [self addSubview:self.buttonView]; [self.buttonView mas_makeConstraints:^(MASConstraintMaker *make) { make.top.equalTo(lastAttribute).offset(config.innerMargin); make.left.right.equalTo(self); }]; __block UIButton *firstButton = nil; __block UIButton *lastButton = nil; for ( NSInteger i = 0 ; i < items.count; ++i ) { MMPopupItem *item = items[i]; UIButton *btn = [UIButton mm_buttonWithTarget:self action:@selector(actionButton:)]; [self.buttonView addSubview:btn]; btn.tag = i; [btn mas_makeConstraints:^(MASConstraintMaker *make) { if ( items.count <= 2) { make.top.bottom.equalTo(self.buttonView); make.height.mas_equalTo(config.buttonHeight); if ( !firstButton ) { firstButton = btn; make.left.equalTo(self.buttonView.mas_left).offset(-MM_SPLIT_WIDTH); } else { make.left.equalTo(lastButton.mas_right).offset(-MM_SPLIT_WIDTH); make.width.equalTo(firstButton); } } else { make.left.right.equalTo(self.buttonView); make.height.mas_equalTo(config.buttonHeight); if ( !firstButton ) { firstButton = btn; make.top.equalTo(self.buttonView.mas_top).offset(-MM_SPLIT_WIDTH); } else { make.top.equalTo(lastButton.mas_bottom).offset(-MM_SPLIT_WIDTH); make.width.equalTo(firstButton); } } lastButton = btn; }]; [btn setBackgroundImage:[UIImage mm_imageWithColor:self.backgroundColor] forState:UIControlStateNormal]; [btn setBackgroundImage:[UIImage mm_imageWithColor:config.itemPressedColor] forState:UIControlStateHighlighted]; [btn setTitle:item.title forState:UIControlStateNormal]; [btn setTitleColor:item.highlight?config.itemHighlightColor:config.itemNormalColor forState:UIControlStateNormal]; btn.layer.borderWidth = MM_SPLIT_WIDTH; btn.layer.borderColor = config.splitColor.CGColor; btn.titleLabel.font = (item==items.lastObject)?[UIFont boldSystemFontOfSize:config.buttonFontSize]:[UIFont systemFontOfSize:config.buttonFontSize]; } [lastButton mas_updateConstraints:^(MASConstraintMaker *make) { if ( items.count <= 2 ) { make.right.equalTo(self.buttonView.mas_right).offset(MM_SPLIT_WIDTH); } else { make.bottom.equalTo(self.buttonView.mas_bottom).offset(MM_SPLIT_WIDTH); } }]; [self mas_updateConstraints:^(MASConstraintMaker *make) { make.bottom.equalTo(self.buttonView.mas_bottom); }]; } [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(notifyTextChange:) name:UITextFieldTextDidChangeNotification object:nil]; return self; } - (void)dealloc { [[NSNotificationCenter defaultCenter] removeObserver:self name:UITextFieldTextDidChangeNotification object:nil]; } - (void)actionButton:(UIButton*)btn { MMPopupItem *item = self.actionItems[btn.tag]; if ( item.disabled ) { return; } if ( self.withKeyboard && (btn.tag==1) ) { if ( self.inputView.text.length > 0 ) { [self hide]; } } else { [self hide]; } if ( self.inputHandler && (btn.tag>0) ) { self.inputHandler(self.inputView.text); } else { if ( item.handler ) { item.handler(btn.tag); } } } - (void)notifyTextChange:(NSNotification *)n { if ( self.maxInputLength == 0 ) { return; } if ( n.object != self.inputView ) { return; } UITextField *textField = self.inputView; NSString *toBeString = textField.text; UITextRange *selectedRange = [textField markedTextRange]; //获取高亮部分 UITextPosition *position = [textField positionFromPosition:selectedRange.start offset:0]; // 没有高亮选择的字,则对已输入的文字进行字数统计和限制 if (!position) { if (toBeString.length > self.maxInputLength) { textField.text = [toBeString mm_truncateByCharLength:self.maxInputLength]; } } } - (void)showKeyboard { [self.inputView becomeFirstResponder]; } - (void)hideKeyboard { [self.inputView resignFirstResponder]; } @end @interface MMAlertViewConfig() @end @implementation MMAlertViewConfig + (MMAlertViewConfig *)globalConfig { static MMAlertViewConfig *config; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ config = [MMAlertViewConfig new]; }); return config; } - (instancetype)init { self = [super init]; if ( self ) { self.width = 275.0f; self.buttonHeight = 50.0f; self.innerMargin = 25.0f; self.cornerRadius = 6.0f; self.titleFontSize = 16.0f; self.detailFontSize = 14.0f; self.buttonFontSize = 16.0f; self.backgroundColor = MMHexColor(0xFFFFFFFF); self.titleColor = MMHexColor(0x333333FF); self.detailColor = MMHexColor(0x333333FF); self.splitColor = MMHexColor(0xE7E7F1FF); self.itemNormalColor = MMHexColor(0x333333FF); self.itemHighlightColor = MMHexColor(0xE76153FF); self.itemPressedColor = MMHexColor(0xEFEDE7FF); self.defaultTextOK = ASLocalizedString(@"知道了"); self.defaultTextCancel = ASLocalizedString(@"取消"); self.defaultTextConfirm = ASLocalizedString(@"确定"); } return self; } @end