iOS开发模仿系统方法自定义UIAlertView的实现和代理

释放双眼,带上耳机,听听看~!

背景是博主偷懒依然用了iOS8后被废弃掉的UIAlertView,然后取消的字体比确定要粗,同时为了统一界面风格,需要把UIAlertView统一换成定制的样子,博主就犯难了,又不想大批量更改代码,怎么办,突然意识到为什么我不能自己写一个类似系统的方法呢,只要整体代码一样,不就可以通过搜索统一修改一下类名就好了么?说干就干,这里贴上代码:

#import <UIKit/UIKit.h>
@class MyAlertView;
@protocol MyAlertDelegate <NSObject>
-(void)alertView:(MyAlertView *)alertView clickedButtonAtIndex:(NSUInteger)buttonIndex;
@end
@interface MyAlertView : UIView
@property (weak,nonatomic) id<MyAlertDelegate>delegate;
-(instancetype)initWithTitle:title message:messge delegate:delegate cancelButtonTitle:cancelTitle otherButtonTitle:otherTitle;
-(void)show;
@end
#import "MyAlertView.h"
#define WIDTH [UIApplication sharedApplication].keyWindow.frame.size.width
#define HEIGHT [UIApplication sharedApplication].keyWindow.frame.size.height
@interface MyAlertView()
@property(nonatomic,strong)UIView *blackView;
@property(nonatomic,strong)UIView *alertBackView;
@property(nonatomic,strong)UILabel *contentLabel;
@property(nonatomic,strong)UIButton *cancelBtn;
@property(nonatomic,strong)UIButton *okBtn;
@property(nonnull,strong)NSString *title;
@property(nonnull,strong)NSString *content;
@property(nonnull,strong)NSString *cancelBtnTitle;
@property(nonnull,strong)NSString *okBtnTitle;
@end
@implementation MyAlertView
-(instancetype)initWithTitle:title message:messge delegate:delegate cancelButtonTitle:cancelTitle otherButtonTitle:otherTitle
{
if (self=[super initWithFrame:[[UIApplication sharedApplication] keyWindow].frame]) {
_delegate=delegate;
_title=title;
_content=messge;
_cancelBtnTitle=cancelTitle;
_okBtnTitle=otherTitle;
[self setUp];
}
return self;
}
-(void)setUp
{
NSLog(@"%f",WIDTH);
NSLog(@"%f",HEIGHT);
//黑色背景
_blackView=[[UIView alloc] initWithFrame:CGRectMake(0, 0, WIDTH, HEIGHT)];
_blackView.backgroundColor=[UIColor blackColor];
_blackView.alpha=0.6;
[self addSubview:_blackView];
//弹出框背景
_alertBackView=[[UIView alloc]initWithFrame:CGRectMake(20, 44, WIDTH-40, 160)];
_alertBackView.layer.cornerRadius=6;
_alertBackView.center=CGPointMake(320/2, 568/2);
_alertBackView.backgroundColor=[UIColor whiteColor];
[self addSubview:_alertBackView];
//标题
UILabel *alertTitle=[[UILabel alloc]initWithFrame:CGRectMake(20, 10, WIDTH-40-40, 20)];
alertTitle.text=_title;
alertTitle.textAlignment=NSTextAlignmentCenter;
alertTitle.textColor=[UIColor colorWithRed:0.31f green:0.31f blue:0.31f alpha:1.00f];
alertTitle.font=[UIFont systemFontOfSize:15];
[_alertBackView addSubview:alertTitle];
//消息内容
UILabel *message=[[UILabel alloc]initWithFrame:CGRectMake(20, 30, WIDTH-40-40, 60)];
message.text=_content;
message.numberOfLines=0;
message.textAlignment=NSTextAlignmentCenter;
message.textColor=[UIColor colorWithRed:0.31f green:0.31f blue:0.31f alpha:1.00f];
message.font=[UIFont systemFontOfSize:15];
[_alertBackView addSubview:message];
//    CAKeyframeAnimation * animation;
//    animation = [CAKeyframeAnimation animationWithKeyPath:@"transform"];
//    animation.duration = 0.5;
//    animation.delegate = self;
//    animation.removedOnCompletion = YES;
//    animation.fillMode = kCAFillModeForwards;
//
//    NSMutableArray *values = [NSMutableArray array];
//    [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(0.1, 0.1, 1.0)]];
//    [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(1.1, 1.1, 1.0)]];
//    [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(0.9, 0.9, 0.9)]];
//    [values addObject:[NSValue valueWithCATransform3D:CATransform3DMakeScale(1.0, 1.0, 1.0)]];
//
//    animation.values = values;
//    [_alertBackView.layer addAnimation:animation forKey:nil];
//按钮背景
UIView *btnBGView=[[UIView alloc]initWithFrame:CGRectMake(0, 100, WIDTH-40, 60)];
btnBGView.backgroundColor=[UIColor colorWithRed:0.96f green:0.96f blue:0.96f alpha:1.00f];
[_alertBackView addSubview:btnBGView];
UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:btnBGView.bounds byRoundingCorners:UIRectCornerBottomLeft | UIRectCornerBottomRight cornerRadii:CGSizeMake(3, 3)];
CAShapeLayer *maskLayer = [[CAShapeLayer alloc] init];
maskLayer.frame = btnBGView.bounds;
maskLayer.path = maskPath.CGPath;
btnBGView.layer.mask = maskLayer;
if (_cancelBtnTitle==nil||_okBtnTitle==nil) {
//确定按钮
_okBtn=[UIButton buttonWithType:UIButtonTypeRoundedRect];
_okBtn.frame=CGRectMake((WIDTH-40-220)/2, 15, 220, 30);
_okBtn.titleLabel.font=[UIFont systemFontOfSize:15];
[_okBtn setTitle:_cancelBtnTitle==nil ? _okBtnTitle:_cancelBtnTitle forState:UIControlStateNormal];
[_okBtn setBackgroundImage:[UIImage imageNamed:@"login_loginbtn.png"] forState:UIControlStateNormal];
[_okBtn setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
_okBtn.tag=1;
[_okBtn addTarget:self action:@selector(buttonAction:) forControlEvents:UIControlEventTouchUpInside];
[btnBGView addSubview:_okBtn];
}
else
{
//取消按钮
_cancelBtn=[UIButton buttonWithType:UIButtonTypeRoundedRect];
_cancelBtn.frame=CGRectMake(25, 15,100, 30);
_cancelBtn.titleLabel.font=[UIFont systemFontOfSize:15];
[_cancelBtn setTitle:_cancelBtnTitle forState:UIControlStateNormal];
[_cancelBtn setBackgroundImage:[UIImage imageNamed:@"detail_alert_left"] forState:UIControlStateNormal];
[_cancelBtn setTitleColor:[UIColor colorWithRed:0.47f green:0.47f blue:0.47f alpha:1.00f] forState:UIControlStateNormal];
_cancelBtn.tag=0;
[_cancelBtn addTarget:self action:@selector(buttonAction:) forControlEvents:UIControlEventTouchUpInside];
[btnBGView addSubview:_cancelBtn];
//确定按钮
_okBtn=[UIButton buttonWithType:UIButtonTypeRoundedRect];
_okBtn.frame=CGRectMake(WIDTH-40-25-100, 15, 100, 30);
_okBtn.titleLabel.font=[UIFont systemFontOfSize:15];
[_okBtn setTitle:_okBtnTitle forState:UIControlStateNormal];
[_okBtn setBackgroundImage:[UIImage imageNamed:@"detail_alert_right"] forState:UIControlStateNormal];
[_okBtn setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
_okBtn.tag=1;
[_okBtn addTarget:self action:@selector(buttonAction:) forControlEvents:UIControlEventTouchUpInside];
[btnBGView addSubview:_okBtn];
}
}
-(void)buttonAction:(UIButton *)btn
{
if ([self.delegate respondsToSelector:@selector(alertView:clickedButtonAtIndex:)]) {
[self.delegate alertView:self clickedButtonAtIndex:(btn.tag)];
}
self.alpha = 0.0;
[self removeFromSuperview];
_blackView=nil;
_alertBackView=nil;
}
-(void)show
{
UIView * keywindow = [[UIApplication sharedApplication] keyWindow];
[keywindow addSubview:self];
}

原谅我没写很多注释,不过我觉得大家都能看得懂,我并没有写的很复杂。这里需要注意的问题是,怎么把自己的alert添加到控制器上来显示,添加是简单,可是像系统那样,不在调用时设置frame和利用控制器addSubView怎么实现呢?博主一开始纠结了好久,不过最后算是写出来了,参考的小伙伴要认真看下,还有代理的实现步骤,需要格外注意下哦,代码中注释部分为动画效果,自定义alert弹出时不会像系统的那样直接让当前键盘收回,如果有键盘时触发,键盘有可能会遮挡到当前alert,需要在触发时手动对键盘resignFirstResponder。其他的博主就不详细说明了,代码中有体现。附上github下载地址:https://github.com/codeliu6572/CustomAlertView

人已赞赏
iOS文章

iOS开发自定义tabbar的基本封装

2021-2-3 12:52:25

iOS文章

iOS开发使用iOS沙盒路径遇到的问题

2021-2-3 14:07:24

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索