| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385 |
- //
- // 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 <Masonry/Masonry.h>
- @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
|