在 UICollectionViewCell 中添加模糊

Posted

技术标签:

【中文标题】在 UICollectionViewCell 中添加模糊【英文标题】:Add blur in UICollectionViewCell 【发布时间】:2014-08-18 18:29:02 【问题描述】:

我正在尝试获取 UICollectionViewCell 的快照,将其模糊并作为子视图添加到 UICollectionViewCell。

一些奇怪的问题正在发生。

MyCollectionViewController

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath

    UICollectionViewCell<MyCollectionViewCellProtocol> *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"MyCollectionViewCell" forIndexPath:indexPath];
    cell.modelVariable = self.modelsArray[indexPath.item];
    return cell;




@interface MyCollectionViewCell : UICollectionViewCell <MyCollectionViewCellProtocol>

@property (strong, nonatomic) Promo *modelVariable;

@end


#import "UIImage+ImageEffects.h" // from WWDC 2013
#import "UIView+Snapshot.h" // My category to create a snapshot from a UIView
@implementation PromoRowCollectionViewCell

- (void)setModelVariable:(ModelVariableClass *)modelVariable

    _modelVariable = modelVariable;

    // just settings other stuff that is importante to the cell view
    self.mainImageView.image = modelVariable.mainImage;
    self.titleLabel.text = modelVariable.title;
    self.shortDescriptionLabel.text = modelVariable.detailedDescription;

    // removing the snapshot before taking other snapshot
    // or in case the cell is reused and this modelVariable is not in BlurState
    [self.blurImageView removeFromSuperview];
    self.blurImageView = nil;
    [self.myView removeFromSuperview];
    self.myView = nil;

    if (modelVariable.state == BlurState) 
        // Attempt 1
//        UIGraphicsBeginImageContext(self.bounds.size);
//        [self drawViewHierarchyInRect:self.bounds afterScreenUpdates:YES];
//        UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
//        UIGraphicsEndImageContext();

        // Attempt 2
//        UIGraphicsBeginImageContextWithOptions(self.bounds.size, self.opaque, 0.0);
//        [self.layer renderInContext:UIGraphicsGetCurrentContext()];
//        UIImage *imgage = UIGraphicsGetImageFromCurrentImageContext();
//        UIGraphicsEndImageContext();

        // This was just a test that showed weird behavior
//        UIView *snapshotView = [self snapshotViewAfterScreenUpdates:YES];
//        self.myView = snapshotView;
//        snapshotView.backgroundColor = [UIColor colorWithRed:1 green:0 blue:0 alpha:0.2];
//        CGRect frame = snapshotView.frame;
//        frame.origin = CGPointMake(20, 20);
//        snapshotView.frame = frame;
//        [self addSubview:snapshotView];

        // Attempt 3 // With the red background and shifting the frame we can see just a red rectangle and not the snapshot
        UIView *snapshotView = [self snapshotViewAfterScreenUpdates:YES];
        snapshotView.backgroundColor = [UIColor colorWithRed:1 green:0 blue:0 alpha:0.2]; // Just to see things better

//        self.blockedPromoImageView = [[UIImageView alloc] initWithImage:image]; // for attempts 1 and 2

        self.blurImageView = [[UIImageView alloc] initWithImage:snapshotView.snapshotImage.applyLightEffect];

//        self.blurImageView.frame = self.bounds;
        self.blockedPromoImageView.frame = CGRectMake(20, 20, self.bounds.size.width, self.bounds.size.height); // Also to see things better

//        self.blockedPromoImageView.backgroundColor = [UIColor colorWithRed:1 green:0 blue:0 alpha:0.2]; // for attempts 1 and 2

        [self addSubview:self.blurImageView];
    


@end


UIView+Snapshot

- (UIImage *)snapshotImage

    UIGraphicsBeginImageContextWithOptions(self.bounds.size, NO, 0.0);
    [self.layer renderInContext:UIGraphicsGetCurrentContext()];
    UIImage *resultingImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return resultingImage;

尝试 1:

尝试 2:

以奇怪的行为进行测试:

尝试 3:

如您所见,尝试 1、2 和 3 似乎他们没有拍摄任何快照。 我希望红色矩形在后面有视图的快照。

至于奇怪的行为测试,我希望可以在图像中看到什么,除了最前面的红色矩形。

有人知道怎么回事吗?或者如何解决?

谢谢。

编辑:

我刚刚用最少的代码创建了一个简单的项目来重现问题。 https://www.dropbox.com/sh/j1mhxj367kzn81y/AADW8ds9NvLMyjUDbn08mOJXa?dl=0

【问题讨论】:

【参考方案1】:

如果您只想在屏幕截图中显示图像和文本更改,则无需使用 afterScreenUpdates 标志。

您可以以标准方式编辑图像和文本,删除视图并将单元格保存为图像:

-(UIImage*) takeSnapshot 

    UIGraphicsBeginImageContext(self.frame.size);
    [self.layer renderInContext: UIGraphicsGetCurrentContext()];
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    return image;

然后添加模糊并添加到您的视图中。

if (modelVariable.state == BlurState) 
    UIImage *snapshot = [self takeSnapshot];
    UIImage *blurredImage = [snapshot applyLightEffect];

    self.blurredImageView = [[UIImageView alloc] initWithImage:blurredImage];
    [self.view addSubview:self.blurredImageView];

【讨论】:

那是我的尝试 2... 它没有捕获任何图像。 您似乎有一个错字,您将“图像”拼写为“图像”,所以它可能不起作用,因为您使用错误的变量初始化 UIImageView?我已经在我自己的自定义表格视图单元格中测试了这段代码 sn-p,它对我来说很好。 我实际上已经修正了真实代码中的错字=/。但是告诉我一些事情,你为什么要将子视图添加到 self.view 中?对我来说,自我就是细胞,所以我只是在做 [self addSubview:self.blurredImageView] 我刚刚添加了一个重现问题的小项目。如果您不想下载代码,只需写一个评论说,我会在这里复制代码。我删除了蓝色部分只是为了让事情变得更容易。 抱歉 self.view 是一个错误,它应该只是 self。我还下载了您的测试项目并运行了它,但它对我来说完美吗?我可以看到正在添加的子视图,这只是它所在单元格的快照。在 ios 7.1 和 8 上尝试了 Xcode 5 和 Xcode 6 beta 5。

以上是关于在 UICollectionViewCell 中添加模糊的主要内容,如果未能解决你的问题,请参考以下文章

如何在ios中的自定义UITableViewCell中添加轮播视图

如何在 xcode 的 MPMoviePlayerController 中添加下一个/上一个按钮/控件?

在 UICollectionViewCell 上设置 .reuseIdentifier

在 UICollectionViewCell 中更新 UITableView

在ios中添加多个子视图

如何使用 React 在 Fluent UI Detaillist 中添加分页