iOS scrollview,灰度图像处于非活动状态,普通图像处于滚动状态

iOS scrollview,灰度图像处于非活动状态,普通图像处于滚动状态,ios,objective-c,uiscrollview,gpuimage,Ios,Objective C,Uiscrollview,Gpuimage,声明 滚动视图滚动时,滚动视图中的图像将变为彩色,滚动结束或未滚动后,图像将变为灰度 滚动视图中的内容 scrollview将UIView和UIImage作为直接后代。图像可能包含在每个ui视图中,也可能不包含在其中。每个ui视图可能有文本、文本和图像以及图像 图像分辨率 图像分辨率将很小,例如300x150,450x150 我们做了什么? 我们已经遇到了框架。至少可以说,这个框架给人留下了深刻的印象,我们对这个框架提供的一切都很着迷 我们对该框架的性能进行了初步测试,结果令人满意 我们已经设法

声明

滚动视图滚动时,滚动视图中的图像将变为彩色,滚动结束或未滚动后,图像将变为灰度

滚动视图中的内容

scrollview将
UIView
UIImage
作为直接后代。图像可能包含在每个
ui视图中,也可能不包含在其中。每个
ui视图
可能有文本、文本和图像以及图像

图像分辨率

图像分辨率将很小,例如300x150450x150

我们做了什么?

我们已经遇到了框架。至少可以说,这个框架给人留下了深刻的印象,我们对这个框架提供的一切都很着迷

我们对该框架的性能进行了初步测试,结果令人满意

我们已经设法使用
GPUImageGrayscaleFilter
将图像插入滚动视图时转换为灰度图像

优化

我们决定在scrollview中可见的图像上应用过滤器。这将显著降低负载

我们现在被困在哪里了?

有两种方法可以将颜色恢复到图像中

  • 从UIImage中删除
    GPUImageGrayscaleFilter
    。我们未能做到这一点
  • 删除
    ui图像
    并插入原始图像。正在使用
    NSURLRequestReturnCacheDataElseLoad
    的缓存策略下载图像。插入下载的图像将不是问题
  • 无论哪种方式,我们都将应用过滤器并多次插入相同的图像。我们对这一部分没有把握。我们错过了一个简单的把戏吗

    我想提前感谢大家的时间和回应:)

    更新和解决方案 我能够使用GPUImage实现这一点

    涉及的步骤

  • 将普通图像分配给
    ui按钮的
    uicontrolstatemormal
    ,并将灰度变换图像从
    GPUImageGrayScaleFilter
    分配给
    uicontrolstatelhighted
  • 当您希望图像获得颜色时,触发状态更改
  • 当您希望图像变灰时,触发状态更改
  • 这个旋转木马的性能非常平稳。GPU时间流逝曲线在开始时有一个尖峰,但之后它绝对为零

    随着测试的进行,我将更新分析统计数据


    谢谢大家。

    如果您的图像数量有限,您可以下载普通图像,创建灰度副本并将其保存到磁盘。 在滚动视图中,使用带有自定义和清晰背景色的ui按钮,而不是UIImageView。 UIButton允许您为不同的控制状态设置不同的图像。 设置正常和选定/禁用状态的正常和灰度图像。对于不需要图像的视图,只需不设置图像即可。 在代理中更改滚动开始和结束时按钮的状态

    注意:您是否考虑过滚动视图更复杂的子代“UITableView”和“UICollectionView”,而不是使用简单的滚动视图?它们将为您节省大量与滚动相关的代码和时间。

    多亏了它们,我才能够实现一种类似旋转木马的效果,在不活动时将图像转换为灰度,在滚动时获得颜色


    实施
  • 为不同的状态设置不同的图像

    UIbutton* someButton = [UIButton buttonWithType:UIButtonTypeCustom];
    
    [someButton setBackgroundImage:[UIImage imageNamed:@"first.png"] forState:UIControlStateNormal];
    
    
    GPUImageGrayscaleFilter* grayScaleFilter = [[GPUImageGrayscaleFilter alloc] init];
    
    [someButton setBackgroundImage:[grayScaleFilter imageByFilteringImage:imageToBeTransformed] forState:UIControlStateHighlighted];
    
  • 当scrollview开始滚动时更改状态(增加颜色)

    我的scrollview中的一些视图不需要这种效果,所以我使用标记将它们过滤掉

      -(void) scrollViewDidScroll:(UIScrollView *)scrollView {
           for(id view in scrollView.subviews) {
                if([view isKindOfClass:[UIButton class]]) {
                      if(((UIView*)view).tag == kRequiresScrollEffectChange)
                          [self highlightButtonsInView:(UIView*) view];
                }
           }
       }
    
  • 滚动视图完成滚动后,将状态更改回正常状态

     - (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate 
     {
           if (!decelerate) {
               [self normalizeHighlightedButtonsInScrollview:scrollView];
           }
     }
    
     -(void)scrollViewDidEndDecelerating:(UIView *)scrollView
     {
           [self normalizeHighlightedButtonsInScrollview:scrollView];
     }
    
  • 突出显示按钮以通过动画获得颜色,并将其规格化回灰度图像

     -(void) highlightButtonsInView:(UIView*) view    
     {
         for(id object in view.subviews) 
         {
              if([object isKindOfClass:[UIButton class]]
              {
                   [self changeButtonState:object willHighlight:YES];
              }
         }
     }
    
     -(void) normalizeButtonsInView:(UIView*) view    
     {
         for(id object in view.subviews) 
         {
              if([object isKindOfClass:[UIButton class]]
              {
                   [self changeButtonState:object willHighlight:NO];
              }
         }
     }
    
     -(void) normalizeHighlightedButtonsInScrollview:(UIScrollView*) scrollView
     {
         for(id view in scrollView.subviews)
         {
              if(((UIView*)view).tag == kRequiresScrollEffectChange)
              {
                  [self normalizeButtonsInView:view];
              }
         }
     }
    
     -(void) changeButtonState:(UIButton)button willHighlight:(BOOL) enableDisable
     {
         [UIView transitionWithView:button
                                  duration:2.3
                                   options:UIViewAnimationOptionTransitionCrossDissolve
                                animations:^{ [button setHighlighted:enableDisable]; }
                                completion:nil];
     }
    

  • 听起来你正在研究一个非常有趣的话题。但是,代码在哪里?
     -(void) highlightButtonsInView:(UIView*) view    
     {
         for(id object in view.subviews) 
         {
              if([object isKindOfClass:[UIButton class]]
              {
                   [self changeButtonState:object willHighlight:YES];
              }
         }
     }
    
     -(void) normalizeButtonsInView:(UIView*) view    
     {
         for(id object in view.subviews) 
         {
              if([object isKindOfClass:[UIButton class]]
              {
                   [self changeButtonState:object willHighlight:NO];
              }
         }
     }
    
     -(void) normalizeHighlightedButtonsInScrollview:(UIScrollView*) scrollView
     {
         for(id view in scrollView.subviews)
         {
              if(((UIView*)view).tag == kRequiresScrollEffectChange)
              {
                  [self normalizeButtonsInView:view];
              }
         }
     }
    
     -(void) changeButtonState:(UIButton)button willHighlight:(BOOL) enableDisable
     {
         [UIView transitionWithView:button
                                  duration:2.3
                                   options:UIViewAnimationOptionTransitionCrossDissolve
                                animations:^{ [button setHighlighted:enableDisable]; }
                                completion:nil];
     }