4

以前有人问过这个问题,但我还没有找到令人满意的答案。是不是真的没有办法给一个UIView设置一个blendmode(也就是用GPU合成来实现blend)。

使用 CGContextSetBlendMode 有一些建议,如下所示:Draw an image in Additive Blend Mode without using OpenGL但是到目前为止我偶然发现的所有这些解决方案似乎都使​​用了绘图例程,据我所知(并且据我的性能测量提示)这将在 CPU 上进行混合(然后才将其上传到 OpenGL 纹理进行显示)。

但是 afaik UIKit 使用 OpenGL 来呈现底层的 CALayers,所以使用单独的混合模式应该是世界上最简单的事情。

由于 IOS 5 似乎还有一些粒子系统http://www.raywenderlich.com/6063/uikit-particle-systems-in-ios-5-tutorial也支持加法混合(我怀疑这种混合是否已实现在 CPU 上) - 那么现在是否有一种方法可以在显示 UIViews 时使用添加(或其他类型)混合?

4

2 回答 2

3

您可以使用compositingFilter

view.layer.compositingFilter = "colorDodgeBlendMode"

其他一些有效值:

“normalBlendMode”、“darkenBlendMode”、“multiplyBlendMode”、“colorBurnBlendMode”、“lightenBlendMode”、“screenBlendMode”、“colorDodgeBlendMode”、“overlayBlendMode”、“softLightBlendMode”、“hardLightBlendMode”、“differenceBlendMode”、“exclusionBlendMode”

于 2020-03-09T14:56:49.877 回答
1

iOS 7 引入了一个新的层类,称为 CABackdropLayer。背景层从层次结构中它下方的 UIView 获取其图像。这是 Apple 在控制中心、通知中心、密码、拨号盘等中用于其刻录和叠加效果的图层类型,以及霜/高斯模糊视图。

要使用这种类型的层,子类 UIView 像这样......

@interface MyBackdropView : UIView
@end

@implementation MyBackdropView
+ (Class)layerClass {
    return [CABackdropLayer class];
}

也有一些私有 API 方法可以将此功能添加到现有的 UIView 中,但它们对于 App Store 来说并不安全......

UIView *blendedView = [[UIView alloc] initWithFrame:frame];
[blendedView _setDrawsAsBackdropLayerWithBlendMode:kCGBlendModeColorBurn];
于 2014-03-05T13:14:35.863 回答