自制AlertViewController其实比较简单,而且适用比较广泛,可以做出一些需要的跳转效果。
1.首先需要创建两个UIViewController,一个作为主页面,一个作为AlertViewController覆盖在其上边。
如图,这个作为主页面。
这个作为AlertViewController,在这里设置了一个backgroundView并把其alpha调为了0.3。
2.编写跳转代码。在ViewController的buttonAction里加上如下代码。
KLAlertViewController *alertOne = [[UIStoryboard storyboardWithName:@"Main" bundle:nil] instantiateViewControllerWithIdentifier:@"sbAlertView"];
[self addChildViewController:alertOne];
[self.view addSubview:alertOne.view];
[alertOne didMoveToParentViewController:self];
因为这里的KLAlertViewController是存放在storyboard中的,所以初始化时请注意区分是使用UIStoryboard还是xib来初始化ViewController。
这里说一下代码意思,第一句初始化,第二句是把初始化的页面的controller移到本controller上来获取将要发生的事件;第三局把初始化的KLAlertViewController上要显示的View层添加到当前页面上;最后一句完成移动覆盖。
3.编写移除代码。在KLAlertViewController的 『pls click』这个button的action方法里写的代码如下:
[self didMoveToParentViewController:nil];
[self.view removeFromSuperview];
[self removeFromParentViewController];
每次点击按钮执行这三句代码就会把本页面移除。
效果如图:
4.添加tap事件以实现点击空白处移除alertView。
(1)添加对应的图层来接收点击事件;
(2)遵守协议 <UIGestureRecognizerDelegate>;
(3)添加手势事件,这里用代码添加:
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(removeFromSuperViewController:)];
tap.delegate = self;
tap.numberOfTapsRequired = 1;
tap.delaysTouchesBegan = YES;
[self.backgroundTapView addGestureRecognizer:tap];
(4)改进移除方法,以实现移除点击事件和接收事件:
- (void)removeFromSuperViewController:(UIGestureRecognizer *)gr {
[self didMoveToParentViewController:nil];
[self.view removeFromSuperview];
[self removeFromParentViewController];
[self.backgroundTapView removeGestureRecognizer:gr];
}
效果如图:
Alert.gif
5.增加一个方法控制显示,减少代码重复问题。
- (void)show {
UIViewController *rootViewController = [UIApplication sharedApplication].keyWindow.rootViewController;
[rootViewController addChildViewController:self];
[rootViewController.view addSubview:self.view];
[self didMoveToParentViewController:rootViewController];
}
之后使用便只需要调用此方法来显示。
到此一个基本模型就搭了出来,根据需要可以提供接口来设置图片、文字、样式、是否点击空白消失等等功能。














网友评论