kukumaluCN / JXTAlertManager

UIAlertView/UIAlertController便捷调用工具
MIT License
181 stars 36 forks source link

关于毛玻璃 #2

Open SPStore opened 6 years ago

SPStore commented 6 years ago

你好,我能请教你一个问题吗?我最近也封装了一个类似系统的UIAlertController:https://github.com/SPStore/SPAlertController。 弹出效果类似微信微博,但是在实现的过程中遇到一个关于毛玻璃的瓶颈,这个问题我想了很久但是都不知如何实现。无论是微信微博还是系统的,都有一个遮罩,我看了系统的层级关系,这个遮罩是全屏的,颜色为黑色0.4透明。假如在一个控制器中present出对话框,这个控制器的view是绿色,此时对话框的毛玻璃效果不是存粹的对这个绿色进行毛玻璃,为什么?因为我的对话框弹出时,必然在遮罩之上,正是由于这这个遮罩的存在,导致毛玻璃效果总是偏黑,遮罩的0.4黑色加上绿色组合起来才是我最终的毛玻璃,这不是我想要的,我想要的是当我在给对话框毛玻璃的时候,不要受遮罩的影响。系统做到了,微信也做到了,微博也做到了,我就差这一点没做到,真的想了很久,能否帮我出个思路。谢谢。我现在是逮着人就想问,但是又没人能解决。。。

kukumaluCN commented 6 years ago

你的弹窗控制器是Controller,还是window,还是纯粹的一个view

kukumaluCN commented 6 years ago

我分析过微信的,感觉他使用window制作的,类似于系统的UIAlertView,但是UIAlertController就只是普通的controller。关于毛玻璃的效果,我觉得都有蒙层的遮盖的,只是蒙层的颜色透明度应该不是0.4,可能会更小吧

SPStore commented 6 years ago

我的弹窗用的是controller,跟系统的使用方法是一致的。我真的看了系统的,只要打开层级关系图一看就知道了,蒙层是0.4,它的毛玻璃没有受到蒙层的任何影响。不管微信用的是哪种反正他们都做到了毛玻璃不受蒙层的影响

kukumaluCN commented 6 years ago

但是看起来,0.4透明度的黑色,会暗很多,会不会不是黑色的,而是灰色或者接近灰黑色,这样的效果,影响会小一些。微信的话,还好,至少形状规则,蒙层可以遮盖一部分,但是系统的不行。我还考虑了渲染颜色或者多图层透明度叠加的问题,但都不行,毛玻璃会一概渲染,所以就开始考虑颜色的问题,系统的蒙层颜色看起来很淡,会不会是一种半透明的灰黑色呢?

SPStore commented 6 years ago

这个蒙层的颜色,不是我用肉眼看出来的,而是实实在在的数据,打开层级结构后,右侧栏有每个view的参数,蒙层是 [UIColor whiteColor:0 alpha:0.4];而且系统用的就是iOS8以后的那种毛玻璃UIBlurEffect

kukumaluCN commented 6 years ago

哦哦,这样啊,只是看上去颜色不太一样,可能就是因为这里面有什么操作吧,具体还真不知道,记得之前有见过一些封装的对应的库,不知道他们有没有解决。

SPStore commented 6 years ago

那你知不知道如何修改present出来的控制器的大小?网上都是在外部直接修改,在外部修改还未必管用。系统的UIAlertController被present出来后,就是我们看到的那么点大,并不是全屏的

kukumaluCN commented 6 years ago

系统的popovercontroller,不知道有没有参考价值?我记得直接改变window的大小,rootVC会自适应大小,我之前做的弹窗,都是基于window的

SPStore commented 6 years ago

我找到了我的那个毛玻璃的一种想法,因为我的蒙层是直接添加在我自封的控制器的view上,现在我想添加在window上,但是添加后,我发现如果是[keyWindow addSubView]的话,present后,蒙层会显示在最上面,把我的控制器挡住了,如果[keyWindow insertSubview:backgroundView atIndex:0]的话,那蒙层又会在底下,这样蒙层就又被第一个控制器挡住了。第一个控制器指的是 [self presentViewController:alertController animated:YES completion:nil]中的self.