最近项目不是很紧,把以前遇到的弹窗类的问题总结一下,以避免以后复习查看。(前面文字说明很长,看文章的可以跳过)
一般项目中使用的警告类弹窗是系统自带的UIAlertView 或者UIAlertController就能满足需求,但是其样式是固定的,修改起来比较的有局限性,但是设计师又不想使用这种系统的样式,那我们就只能按照设计师的要求去自定义Alert,那么问题就来了。o(╯□╰)o
问题
- 如果涉及到网络,我们自定义的弹窗能满足项目的需要,往往也会伴随着Crash(具体情况下面说),安全这一块没有系统的Alert处理的好(大牛写的除外)
- 我们自定义的Alert没有很大的可扩展性,仅仅能满足自己的项目需要
- 打个广告我使用的可扩展比较强,非常好用Alert的应该属 CustomIOSAlertView ,可以根据项目的需要进行自定义View,但是这依旧不能满足我们的设计师的眼光。😔
还是乖乖的自定义Alert吧
上面说到了涉及到网络Crash的情况是这样的,我们自定义的Alert需要在一个页面的网络请求返回后弹出,这个时候我们Push或者Pressent到了另一个页面,刚好上个页面的请求返回了,就会出现在我们当前的页面,点击上面的按钮,Crash!!!
如何改进?
- 使用单利,就算在其他的页面弹出,起码不会造成崩溃
- block回调(这种方法不适合我目前的项目)
- 让自定义的Alert只在显示的页面出现,(需要传进去当前Controller)
这里我就用单利写一个简单的Alert(Frame和按钮的个数 我就写死了)O(∩_∩)O哈哈~ 尴尬😁
- .h中方法声明
@interface CTTAlertView : UIView
+(id)shareInstance;
-(void)showViewAtViewController:(UIViewController *)controller
withMessage:(NSString *)message
withCancel:(NSString *)cancel
withConfirm:(NSString *)confirm;
@end
- .m中实现
#import "CTTAlertView.h"
#define kAlertViewH 148.0
#define kAlertViewW 300.0
#define kMargin 10.0
#define kBtnW 100.0
#define kBtnH 22.0
#define kLeftMargin 16.0
#define kBottomMargin 13.0
@interface CTTAlertView ()
@property (nonatomic, strong) UIImageView *imgView;
@property (nonatomic, strong) UIView *separatorView;
@property (nonatomic, strong) UIView *alertView;
@property (nonatomic, strong) UILabel *msgLabel;
@property (nonatomic, strong) UIButton *cancelBtn;
@property (nonatomic, strong) UIButton *confirmBtn;
@end
@implementation CTTAlertView
+(id)shareInstance {
static dispatch_once_t onceToken;
static CTTAlertView *instance = nil;
dispatch_once(&onceToken, ^{
instance = [[CTTAlertView alloc] init];
});
return instance;
}
-(instancetype)init {
self = [super init];
if (self) {
[self setupViews];
}
return self;
}
-(instancetype)initWithFrame:(CGRect)frame {
self = [super initWithFrame:frame];
if (self) {
[self setupViews];
}
return self;
}
-(void)setupViews {
self.frame = CGRectMake(0, 0, KWIDTH, KHEIGHT);
self.backgroundColor = RGBACOLOR(0, 0, 0, .5);
//background image view
self.imgView = [[UIImageView alloc] initWithFrame:CGRectMake((KWIDTH - kAlertViewW) / 2.0, (KHEIGHT - kAlertViewH - 64.0) / 2.0, kAlertViewW, kAlertViewH)];
self.imgView.userInteractionEnabled = YES;
self.imgView.contentMode = UIViewContentModeScaleAspectFill;
self.imgView.image = [UIImage imageNamed:@"pop_alert_icon"];
[self addSubview:self.imgView];
//view
self.alertView = [[UIView alloc] initWithFrame:CGRectMake(self.imgView.frame.origin.x + kMargin, self.imgView.frame.origin.y + kMargin, (kAlertViewW - kMargin * 2), (kAlertViewH - kMargin * 2))];
self.alertView.backgroundColor = [UIColor whiteColor];
self.alertView.layer.cornerRadius = 2.0;
self.alertView.layer.masksToBounds = YES;
[self addSubview:self.alertView];
//cancel button
CGFloat yOffset = self.alertView.frame.size.height - kBottomMargin - kBtnH;
UIButton *cancelBtn = [UIButton buttonWithType:UIButtonTypeCustom];
cancelBtn.frame = CGRectMake(kLeftMargin, yOffset, kBtnW, kBtnH);
[cancelBtn setTitleColor:kColor(153, 153, 153, 1)
forState:UIControlStateNormal];
cancelBtn.titleLabel.font = [Yi23Utils pingFangSCLightFont:14];
[cancelBtn addTarget:self
action:@selector(cancelBtnAction:)
forControlEvents:UIControlEventTouchUpInside];
[self.alertView addSubview:cancelBtn];
self.cancelBtn = cancelBtn;
//confirm button
CGFloat xOffset = self.alertView.frame.size.width - kLeftMargin - kBtnW;
UIButton *confirmBtn = [UIButton buttonWithType:UIButtonTypeCustom];
confirmBtn.frame = CGRectMake(xOffset, yOffset, kBtnW, kBtnH);
[confirmBtn setTitleColor:KKhaki
forState:UIControlStateNormal];
confirmBtn.titleLabel.font = [Yi23Utils pingFangSCLightFont:14];
[confirmBtn addTarget:self
action:@selector(confirmBtnAction:)
forControlEvents:UIControlEventTouchUpInside];
[self.alertView addSubview:confirmBtn];
self.confirmBtn = confirmBtn;
//separator line
UIView *separatorView = [[UIView alloc] initWithFrame:CGRectMake((self.alertView.frame.size.width - 1.0) / 2.0, self.alertView.frame.size.height - 17.0 - 15.0, 1.0, 17.0)];
separatorView.backgroundColor = kColor(0, 0, 0, 0.1);
[self.alertView addSubview:separatorView];
//message label
CGFloat labelW = self.alertView.frame.size.width - 8 * 2;
self.msgLabel = [[UILabel alloc] initWithFrame:CGRectMake(8, 8, labelW, 74.0)];
self.msgLabel.font = [UIFont systemFontOfSize:14];
self.msgLabel.textAlignment = NSTextAlignmentCenter;
self.msgLabel.textColor = [UIColor blackColor];
self.msgLabel.numberOfLines = 0;
self.msgLabel.lineBreakMode = NSLineBreakByWordWrapping;
self.msgLabel.preferredMaxLayoutWidth = labelW;
[self.alertView addSubview:self.msgLabel];
}
-(void)showViewAtViewController:(UIViewController *)controller
withMessage:(NSString *)message
withCancel:(NSString *)cancel
withConfirm:(NSString *)confirm
{
UIView *bgView = (UIView *)controller.view;
[bgView addSubview:self];
[self.cancelBtn setTitle:cancel
forState:UIControlStateNormal];
[self.confirmBtn setTitle:confirm
forState:UIControlStateNormal];
self.msgLabel.text = (message == nil) ? @" " : message;
}
-(void)removeAlertViewFromSupview {
[self removeFromSuperview];
}
#pragma mark - ButtonAction
-(void)cancelBtnAction:(UIButton *)sender {
[self removeFromSuperview];
}
-(void)confirmBtnAction:(UIButton *)sender {
[self removeFromSuperview];
}
@end
网友评论