首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >UIVibrancyEffect On iOS 7

UIVibrancyEffect On iOS 7
EN

Stack Overflow用户
提问于 2014-06-25 02:46:20
回答 1查看 1.2K关注 0票数 0

所以我一直在玩iOS 8测试版,在我的应用程序需要的地方实现新的UIEffectViews。现在,我遇到了一个问题,我仍然希望iOS 7具有向后兼容性,但是保持活力效应,因为它确实有助于可读性。我以前用过UIToolbars来产生模糊效果,它们效果很好,但不适合活力。我想我应该将UIView子类添加一个工具栏子视图,然后进行一些巧妙的呈现,以实现如下的振动效果: 1.将工具栏呈现为UIImage 2.将充满活力的内容呈现为UIImage 3.将工具栏图像呈现为充满活力的内容图像掩码4.使UIView的子视图显示工具栏上的最终结果

我在drawRect中尝试过这样做: UIView,但是它不想重新绘制每一个帧,并且设置一个计时器真的会扰乱动画,即使渲染时间不是很长。如果有人能告诉我示例代码或开源库,那将是非常感谢的。

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-08-19 16:58:08

所以我从来没有发过答案,但我确实想出了答案。

我尝试过的蛮力方法是使用核心图像效果。我会将superview呈现给一个UIImage,模糊它,然后用黑色样式将它叠加在工具栏上。这看起来很棒,但即使在我的5S上的GPU环境中,它也很慢,所以它不可能在其他设备上工作。这是我所能看到的最好的东西,对静态内容来说效果很好,但对实时来说却不实用。

我能够实现一个实时版本,但它看起来不太好。基本上,我所做的就是将所有充满活力的内容呈现到图像中,并将其用作视图的掩码。然后,我使视图几乎不可见(如.2 alpha),然后将其放在工具栏上。它看上去不像iOS8或最初的CI版本那样生机勃勃,但它工作得很好,而且预制件也很好。

这里有一些代码,如果您真的想要的话,只需复制和粘贴:

代码语言:javascript
复制
-(instancetype)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self)
        {

            self.backgroundColor = [UIColor colorWithWhite:1 alpha:0.2];

            maskingContents = [[UIView alloc] initWithFrame:self.bounds];
            [self addSubview:maskingContents];
        }

    return self;
}

-(void)addSubview:(UIView *)view
    {

        if (![view isEqual:maskingContents])
        {
            [maskingContents setHidden:NO];

            [maskingContents addSubview:view];

            //now we need to mask it
            UIGraphicsBeginImageContextWithOptions(self.bounds.size, NO, 0);
            [maskingContents.layer renderInContext:UIGraphicsGetCurrentContext()];

            UIImage* mask = UIGraphicsGetImageFromCurrentImageContext();

            UIGraphicsEndImageContext();

            //apply the mask
            CALayer* maskLayer = [CALayer layer];
            maskLayer.frame = self.bounds;
            [maskLayer setContents:(id)mask.CGImage];
            [self.layer setMask:maskLayer];

            [maskingContents setHidden:YES];

        } else [super addSubview:view];
    }

-(void)forceVibrancyUpdate
    {
        [maskingContents setHidden:NO];

        //now we need to mask it
        UIGraphicsBeginImageContextWithOptions(self.bounds.size, NO, 0);
        [maskingContents.layer renderInContext:UIGraphicsGetCurrentContext()];

        UIImage* mask = UIGraphicsGetImageFromCurrentImageContext();

        UIGraphicsEndImageContext();

        //apply the mask
        CALayer* maskLayer = [CALayer layer];
        maskLayer.frame = self.bounds;
        [maskLayer setContents:(id)mask.CGImage];
        [self.layer setMask:maskLayer];

        [maskingContents setHidden:YES];
    }

@end

如果您想动态更新活跃视图中的内容,您将调用forceVibrancyUpdate,因为这将重新呈现掩码并应用它。希望这对大家都有帮助。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24399415

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档