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