所以我一直在玩iOS 8测试版,在我的应用程序需要的地方实现新的UIEffectViews。现在,我遇到了一个问题,我仍然希望iOS 7具有向后兼容性,但是保持活力效应,因为它确实有助于可读性。我以前用过UIToolbars来产生模糊效果,它们效果很好,但不适合活力。我想我应该将UIView子类添加一个工具栏子视图,然后进行一些巧妙的呈现,以实现如下的振动效果: 1.将工具栏呈现为UIImage 2.将充满活力的内容呈现为UIImage 3.将工具栏图像呈现为充满活力的内容图像掩码4.使UIView的子视图显示工具栏上的最终结果
我在drawRect中尝试过这样做: UIView,但是它不想重新绘制每一个帧,并且设置一个计时器真的会扰乱动画,即使渲染时间不是很长。如果有人能告诉我示例代码或开源库,那将是非常感谢的。
谢谢。
发布于 2014-08-19 16:58:08
所以我从来没有发过答案,但我确实想出了答案。
我尝试过的蛮力方法是使用核心图像效果。我会将superview呈现给一个UIImage,模糊它,然后用黑色样式将它叠加在工具栏上。这看起来很棒,但即使在我的5S上的GPU环境中,它也很慢,所以它不可能在其他设备上工作。这是我所能看到的最好的东西,对静态内容来说效果很好,但对实时来说却不实用。
我能够实现一个实时版本,但它看起来不太好。基本上,我所做的就是将所有充满活力的内容呈现到图像中,并将其用作视图的掩码。然后,我使视图几乎不可见(如.2 alpha),然后将其放在工具栏上。它看上去不像iOS8或最初的CI版本那样生机勃勃,但它工作得很好,而且预制件也很好。
这里有一些代码,如果您真的想要的话,只需复制和粘贴:
-(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,因为这将重新呈现掩码并应用它。希望这对大家都有帮助。
https://stackoverflow.com/questions/24399415
复制相似问题