在UIView上调用UIAlertController
随着UIAlerView的废弃,UIAlertController的使用是势在必行了,我在这里就不再说明UIAlertController的具体用法了,自行百度,资料很多,我这里详细说明一下我具体遇到的问题,就是我想在一个展示在window上边的一个UIView上边使用弹窗,大家都知道,原来的UIAlertView是加载在window上边的,也就是展示在图层的最上边,这时候是没有问题的,但是换成UIAlertController之后,是需要控制器模态弹出,这时候如果当前控制器上边已经存在一个自定义边框透明的view,这时候就有问题了,如图:
1.png很明显是在当前view的下边.因为UIAlertController必须是使用控制器模态弹出,这时候灵感来了,
TestView *testView = [[TestView alloc] initWithFrame:self.view.bounds];
//关键就在这里,把这里的view赋值给一个vc的view,就是一个思路的变通
UIViewController *vc = [[UIViewController alloc] init];
//[vc.view addSubview:testView];//有兴趣的同学可以看看这里view赋值替换和增加子视图的区别
vc.view = testView;
// 最终用这个vc显示alertController:presentViewController
[vc presentViewController:wAlert animated:YES completion:nil];
上代码
AppDelegate *delegate =(id)[UIApplication sharedApplication].delegate;
TestView *testView = [[TestView alloc] initWithFrame:self.view.bounds];
//关键就在这里,把这里的view赋值给一个vc的view,就是一个思路的变通
UIViewController *vc = [[UIViewController alloc] init];
//[vc.view addSubview:testView];//有兴趣的同学可以看看这里view赋值替换和增加子视图的区别
vc.view = testView;
testView.btnBlock = ^(){
// 1.实例化alert:alertControllerWithTitle
UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"测试" message:@"UIAlertController" preferredStyle:UIAlertControllerStyleAlert];
// 2.实例化按钮:actionWithTitle
// 为防止block与控制器间循环引用,我们这里需用__weak来预防
__weak typeof(alert) wAlert = alert;
[alert addAction:[UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleDestructive handler:^(UIAlertAction *action) {
// 点击确定按钮的时候, 会调用这个block
NSLog(@"确定~~");
}]];
[alert addAction:[UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) {
}]];
// 3.显示alertController:presentViewController
[vc presentViewController:wAlert animated:YES completion:nil];
};
[delegate.window addSubview:vc.view];
来,看一下效果,如下图:
2.png另外附:获取空间相对屏幕的位置
UIWindow * window=[[[UIApplication sharedApplication] delegate] window];
CGRect rect=[label1 convertRect: label1.bounds toView:window];
有分享才有进步,集大家之所长,总结自己的经验,利己利人~~