iOS滚动视图,滚动时非活动和正常图像上的灰度图像

时间:2015-01-05 04:02:12

标签: ios objective-c uiscrollview gpuimage

声明

当滚动视图滚动时,scrollview中的图像将获得颜色,滚动结束或滚动后灰度图像将被灰度化。

scrollview中的内容

滚动视图将UIViewUIImage作为直接后代。图像可能包含也可能不包含在每个UIView中。每个UIView都可能包含文字,文字和文字。图像和图像。

图像分辨率

图像分辨率很小,例如 300x150 450x150

我们做了什么?

我们在GPUImage之前遇到过Brad Larson框架。至少可以说框架令人印象深刻,我们对框架提供的所有内容着迷。

我们对框架性能的初步测试令人满意。

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

优化

我们已决定对滚动视图中可见的图像应用滤镜。这将显着降低负载

我们现在在哪里停留?

我们可以通过两种方式将颜色恢复到图像

  1. 从UIImage中删除GPUImageGrayscaleFilter我们无法做到这一点
  2. 删除UIImage并插入原始图片。正在使用NSURLRequestReturnCacheDataElseLoad的缓存策略下载图像。 插入下载的图片不会有问题。
  3. 无论哪种方式,我们都会应用过滤器并插入相同的图像次数 。我们不确定这一部分。我们错过了一个简单的技巧吗?

    我想提前感谢所有人的时间和回应:)

    更新&解

    我能够使用GPUImage实现这一目标。

    涉及的步骤

    1. 将正常图片指定给UIControlStateNormal UIButton,并将灰度转换后的图片从GPUImageGrayScaleFilter指定为UIControlStateHighlighted
    2. 当您希望图像获得颜色时触发状态更改
    3. 当您希望图像变灰时触发状态更改
    4. 这款旋转木马的性能非常流畅。 GPU Time Elapsed配置文件在开始时有一个峰值,但之后它绝对为零。

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

      谢谢大家。

2 个答案:

答案 0 :(得分:1)

如果您的图像数量有限,则可以下载普通图像,创建灰度副本并将两者保存到磁盘。 在滚动视图中,使用 UIButton 而不是UIImageView,使用自定义类型和清除背景颜色。 UIButton允许您设置different image for different control states。 将正常和灰度图像设置为正常和选定/禁用状态。对于不需要图像的视图,不要设置图像。 在代表中滚动开始和结束时更改按钮的状态。

P.S。 :你有没有考虑滚动视图的更复杂的后代' UITableView'和' UICollectionView'而不是使用简单的滚动视图?他们会为您节省大量与滚动相关的代码和时间。

答案 1 :(得分:1)

感谢@Swapnil,我能够实现类似旋转木马的效果,在不活动时将图像转换为灰度,并在滚动时获得颜色。


实施

  1. 为不同的状态设置不同的图像

    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];
    
  2. 滚动视图开始滚动(增益颜色)时更改状态

      -(void) scrollViewDidScroll:(UIScrollView *)scrollView {
           for(id view in scrollView.subviews) {
                if([view isKindOfClass:[UIButton class]]) {
                      [self highlightButtons];
                }
           }
       }
    

    我的滚动视图中的某些视图不需要此效果,因此我使用标记

    将其过滤掉
      -(void) scrollViewDidScroll:(UIScrollView *)scrollView {
           for(id view in scrollView.subviews) {
                if([view isKindOfClass:[UIButton class]]) {
                      if(((UIView*)view).tag == kRequiresScrollEffectChange)
                          [self highlightButtonsInView:(UIView*) view];
                }
           }
       }
    
  3. 滚动浏览滚动视图时,状态恢复正常

     - (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate 
     {
           if (!decelerate) {
               [self normalizeHighlightedButtonsInScrollview:scrollView];
           }
     }
    
     -(void)scrollViewDidEndDecelerating:(UIView *)scrollView
     {
           [self normalizeHighlightedButtonsInScrollview:scrollView];
     }
    
  4. 突出显示按钮以通过动画获取颜色并将其标准化为灰度图像

     -(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];
     }