草庐IT

iOS ScrollView 在非事件状态和正常图像上滚动时带有灰度图像

coder 2024-01-19 原文

声明

scrollview中的图片会在scrollview滚动时变色,滚动结束或不滚动时变成灰度。

ScrollView 中的内容

ScrollView 将 UIViewUIImage 作为直接后代。该图像可能包含也可能不包含在每个 UIView 中。每个 UIView 都可能有文本、texts & images 和图像。

图像分辨率

图片分辨率会比较小,比如300x150450x150

我们做了什么?

我们遇到了GPUImage框架 Brad Larson .至少可以说,该框架令人印象深刻,我们一直对框架提供的一切着迷。

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

我们已经设法使用 GPUImageGrayscaleFilter 在将图像插入 ScrollView 时将它们转换为灰度图像。

优化

我们决定对 ScrollView 中可见的图像应用过滤器。这将显着降低负载

我们现在卡在哪里了?

有两种方法可以使图像恢复颜色

  1. 从 UIImage 中移除 GPUImageGrayscaleFilter我们无法做到这一点
  2. 删除 UIImage 并插入原始图像。图片正在下载,缓存策略为 NSURLRequestReturnCacheDataElseLoad插入下载的图像不会有问题。

无论哪种方式,我们都会应用过滤器并多次插入相同的图像。我们不确定这部分。我们是否缺少一个简单的技巧?

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

更新和解决方案

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

涉及的步骤

  1. 将普通图像分配给 UIButtonUIControlStateNormal 并将灰度转换后的图像从 GPUImageGrayScaleFilter 分配给 UIControlStateHighlighted
  2. 当您希望图像获得颜色时触发状态变化
  3. 当您希望图像变灰时触发状态变化

这个轮播的表现非常流畅。 GPU Time Elapsed 配置文件在开始时出现峰值,但之后绝对为零。

我会随着测试的进展更新分析统计数据。

谢谢大家

最佳答案

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

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

关于iOS ScrollView 在非事件状态和正常图像上滚动时带有灰度图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27773232/

有关iOS ScrollView 在非事件状态和正常图像上滚动时带有灰度图像的更多相关文章

  1. ruby - 在 Ruby 程序执行时阻止 Windows 7 PC 进入休眠状态 - 2

    我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0

  2. ruby-on-rails - 跳过状态机方法的所有验证 - 2

    当我的预订模型通过rake任务在状态机上转换时,我试图找出如何跳过对ActiveRecord对象的特定实例的验证。我想在reservation.close时跳过所有验证!叫做。希望调用reservation.close!(:validate=>false)之类的东西。仅供引用,我们正在使用https://github.com/pluginaweek/state_machine用于状态机。这是我的预订模型的示例。classReservation["requested","negotiating","approved"])}state_machine:initial=>'requested

  3. ruby - 字符串文字中的转义状态作为 `String#tr` 的参数 - 2

    对于作为String#tr参数的单引号字符串文字中反斜杠的转义状态,我觉得有些神秘。你能解释一下下面三个例子之间的对比吗?我特别不明白第二个。为了避免复杂化,我在这里使用了'd',在双引号中转义时不会改变含义("\d"="d")。'\\'.tr('\\','x')#=>"x"'\\'.tr('\\d','x')#=>"\\"'\\'.tr('\\\d','x')#=>"x" 最佳答案 在tr中转义tr的第一个参数非常类似于正则表达式中的括号字符分组。您可以在表达式的开头使用^来否定匹配(替换任何不匹配的内容)并使用例如a-f来匹配一

  4. ruby - Net::HTTP 获取源代码和状态 - 2

    我目前正在使用以下方法获取页面的源代码:Net::HTTP.get(URI.parse(page.url))我还想获取HTTP状态,而无需发出第二个请求。有没有办法用另一种方法做到这一点?我一直在查看文档,但似乎找不到我要找的东西。 最佳答案 在我看来,除非您需要一些真正的低级访问或控制,否则最好使用Ruby的内置Open::URI模块:require'open-uri'io=open('http://www.example.org/')#=>#body=io.read[0,50]#=>"["200","OK"]io.base_ur

  5. ruby-on-rails - 添加回形针新样式不影响旧上传的图像 - 2

    我有带有Logo图像的公司模型has_attached_file:logo我用他们的Logo创建了许多公司。现在,我需要添加新样式has_attached_file:logo,:styles=>{:small=>"30x15>",:medium=>"155x85>"}我是否应该重新上传所有旧数据以重新生成新样式?我不这么认为……或者有什么rake任务可以重新生成样式吗? 最佳答案 参见Thumbnail-Generation.如果rake任务不适合你,你应该能够在控制台中使用一个片段来调用重新处理!关于相关公司

  6. ruby-on-rails - 事件管理员日期过滤器日期格式自定义 - 2

    是否有简单的方法来更改默认ISO格式(yyyy-mm-dd)的ActiveAdmin日期过滤器显示格式? 最佳答案 您可以像这样为日期选择器提供额外的选项,而不是覆盖js:=f.input:my_date,as::datepicker,datepicker_options:{dateFormat:"mm/dd/yy"} 关于ruby-on-rails-事件管理员日期过滤器日期格式自定义,我们在StackOverflow上找到一个类似的问题: https://s

  7. ruby-on-rails - 在 Ruby (on Rails) 中使用 imgur API 获取图像 - 2

    我正在尝试使用Ruby2.0.0和Rails4.0.0提供的API从imgur中提取图像。我已尝试按照Ruby2.0.0文档中列出的各种方式构建http请求,但均无济于事。代码如下:require'net/http'require'net/https'defimgurheaders={"Authorization"=>"Client-ID"+my_client_id}path="/3/gallery/image/#{img_id}.json"uri=URI("https://api.imgur.com"+path)request,data=Net::HTTP::Get.new(path

  8. python ffmpeg 使用 pyav 转换 一组图像 到 视频 - 2

    2022/8/4更新支持加入水印水印必须包含透明图像,并且水印图像大小要等于原图像的大小pythonconvert_image_to_video.py-f30-mwatermark.pngim_dirout.mkv2022/6/21更新让命令行参数更加易用新的命令行使用方法pythonconvert_image_to_video.py-f30im_dirout.mkvFFMPEG命令行转换一组JPG图像到视频时,是将这组图像视为MJPG流。我需要转换一组PNG图像到视频,FFMPEG就不认了。pyav内置了ffmpeg库,不需要系统带有ffmpeg工具因此我使用ffmpeg的python包装p

  9. ruby-on-rails - 事件记录 : Select max of limit - 2

    我正在尝试将以下SQL查询转换为ActiveRecord,它正在融化我的大脑。deletefromtablewhereid有什么想法吗?我想做的是限制表中的行数。所以,我想删除少于最近10个条目的所有内容。编辑:通过结合以下几个答案找到了解决方案。Temperature.where('id这给我留下了最新的10个条目。 最佳答案 从您的SQL来看,您似乎想要从表中删除前10条记录。我相信到目前为止的大多数答案都会如此。这里有两个额外的选择:基于MurifoX的版本:Table.where(:id=>Table.order(:id).

  10. ruby-on-rails - 带有 Zeus 的 RSpec 3.1,我应该在 spec_helper 中要求 'rspec/rails' 吗? - 2

    使用rspec-rails3.0+,测试设置分为spec_helper和rails_helper我注意到生成的spec_helper不需要'rspec/rails'。这会导致zeus崩溃:spec_helper.rb:5:in`':undefinedmethod`configure'forRSpec:Module(NoMethodError)对thisissue最常见的回应是需要'rspec/rails'。但这是否会破坏仅使用spec_helper拆分rails规范和PORO规范的全部目的?或者这无关紧要,因为Zeus无论如何都会预加载Rails?我应该在我的spec_helper中做

随机推荐