iOS UIVisualEffect 模糊动画的正确姿势

iOS UIVisualEffect 模糊动画的正确姿势,第1张

iOS 提供了一个非常方便的类来提供背景模糊效果,那就是 UIVisualEffect 。

但经常地,我们需要在模糊和透明两个状态之间切换,通常大家的做法就是直接动画它的 alpha 值,但是...结果不言而喻,渐变的过程十分奇怪,有点朦胧的感觉....总之就是不好看,并且 iOS 也会 print 出一个警告说效果在 alpha 为 1 之前会 broken。好吧,总之渐变 alpha 值的做法大家以后一定不要用了。

然后,很多人就想到要自己实现 Blur 算法,达到自定义的效果,也有用 Private API 来强行设置 UIBlurEffect 的 blurRadius 属性,但这些都不是最好的方法。

其实,iOS 内部早已提供了一个完美的解决方案,那就是 UIView.animateWith... ,使用这个方法可以完美地渐变模糊半径和 Vibrancy 亮度效果,如果大家仔细看了 WWDC 2015 的 What's New in Cocoa Touch 这个 Session 的话,你应该听说了 iOS 9 新增了模糊动画的功能。

那么说了这么多废话,到底怎么做呢?非常简单:

就是这么简单,你唯一需要做的就是事先在 viewDidLoad() 或者其他适当的位置将 UIVisualEffectView 原本有的 effect 属性置 nil ,或者干脆在创建的时候就不要在构造函数中传 UIBlurEffect 对象,然后在你想让它出现的时候调用上面的方法。

我这里加了一个 UILabel 并且给它也设置了一些动画,我们看看效果:

有点 Siri 的感觉了吧~

下面还有一个例子:

这个效果无非就是先让 UIVisualEffectView 有个一个 Light 风格的 UIBlurEffect ,然后再动画将 effect 属性置 nil ,然后让 UILabel 动画放大就 OK 了,大家自己回去研究吧。

最后,为什么 iOS 9 以后才能用这个方法呢?因为 UIVisualEffectView 的 effect 属性 iOS 9 之前是 readonly 的摔!!!

然后苹果那帮人良心发现,把这个属性改成 readwrite 的了......

最近项目中遇到多张网络图片展示的需求,若使用普通的Cell则会频繁计算Cell的高度,而且会导致很多bug.

此时我突发奇想,UILabel可以自适应高度,而且可以展示Html,那么一定也可以展示多张图片的.但是多图片预览又要点击效果,网上搜索了很久发现都是提示要改成UITextView,但是UITextView又不能自动适应高度(只能使用KVO),所以就有了此贴.

我们可以将图片的url添加为image标签,点击时只需比对点击区域和图片frame即可,如图所示,点击后会d窗提示点击第几张图片

体验请点击demo的github地址: 这里 ,好用记得给颗星星哦!

UILabel是用来显示文本的脚本,继承自UIWidget。

所有的label都需要 Font 才可正常工作。这个字体可以使 Dynamic 的(引用Unity Font),也可以是 Bitmap 字体——嵌入到Atlas里面的字体。动态字体更稳固因为它不需要你预先创建符号,但是Bitmap字体可以和你atlas的其他东西渲染在同一个draw call上并且这些字体可以通过photoshop美化。

修改 Pivot 来改变label的对齐方式。Top-left、Left和Bottom-left是左对齐。Top、Center或者Bottom是中间对齐。Top-right、Right、Bottom-right是右对齐。

使用Dynamic字体的时候,你可以设置 label的 Font Size 和 style 。你也可以设置一个material用来渲染。

接下来的大框——你可能猜到了——用来输入文本。默认是多行文本输入,除非通过下面的 Max Lines 属性 限制 。

Overflow *** 作让你决定lable的文本超过允许的空间之后的处理方法。

Shrink Content 内容自动缩放。与 Keep Crisp 设置一起来控制Dynamic字体,使字体的字号变小而不是简单的缩放。这样不管label是否被缩放都能保持清晰。

Clamp Content 剔除多余的文本。

Resize Freely 根据输入的文本内容自动调整dimension。不需要手动调整。

Resize Height 保持宽度不变,必要时增加高度。

Spacing 属性控制字符间距。正负皆可。像素为单位。

前面提到的 Max Lines 用来控制最多要多少行。用0表示不限制。

关掉 Encoding 表示不需要颜色和表情标签。 默认启用。

可以给label提供渐变通过 Gradient 的bottom和top颜色。

文本可以有shadow或者outline Effect 。shadow会使用两倍的 geometry,outline会使用五倍——所以要小心这个属性。 Distance 参数控制 shadow或者outline与原文本的距离,以像素为单位。

运行时修改文本,你可以通过以下方法:

UILabel lbl = GetComponent<UILabel>()

lbl.text = "Hello world!"

小贴士

给label一个深色的前景和明亮的Shadow效果,可以让label看起来有 斜角外观 。


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/bake/7862002.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-10
下一篇2023-04-10

发表评论

登录后才能评论

评论列表(0条)

    保存