Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 在具有裁剪过渡的图像之间滚动_Objective C_Ios7_Uiscrollview_Uiimageview - Fatal编程技术网

Objective c 在具有裁剪过渡的图像之间滚动

Objective c 在具有裁剪过渡的图像之间滚动,objective-c,ios7,uiscrollview,uiimageview,Objective C,Ios7,Uiscrollview,Uiimageview,我已经搜索了一段时间,并试图亲自完成类似的事情。 在中,有一个非常奇特的效果,你可以在屏幕之间滚动,每个屏幕都有不同的图像,但滚动本身并没有移动图像移动,而是像它们之间移动的裁剪线一样(视差效果,就像在一些网站中一样) 我的问题是: 我尝试了类似的效果,但遇到了两个障碍。 遮罩图像CGImageMaskCreate的速度不够快,无法正确裁剪图像 我尝试的是加载屏幕上出现的3个裁剪图像,这意味着为3个遮罩中的每一个创建3个graphicsContexts,为每个遮罩屏蔽图像。然后,创建另一个缓冲区

我已经搜索了一段时间,并试图亲自完成类似的事情。 在中,有一个非常奇特的效果,你可以在屏幕之间滚动,每个屏幕都有不同的图像,但滚动本身并没有移动图像移动,而是像它们之间移动的裁剪线一样(视差效果,就像在一些网站中一样)

我的问题是: 我尝试了类似的效果,但遇到了两个障碍。 遮罩图像
CGImageMaskCreate
的速度不够快,无法正确裁剪图像

我尝试的是加载屏幕上出现的3个裁剪图像,这意味着为3个遮罩中的每一个创建3个
graphicsContexts
,为每个遮罩屏蔽图像。然后,创建另一个缓冲区上下文,我在其中添加完成的部分(创建3次,在每个裁剪图像之后创建一次,然后我开始处理下一个) 这是有道理的,它是沉重的,它是

第二次,我试过了,但也感觉很慢,我尽量减少了我正在使用的GraphicsContexts的数量。 我肯定做错了什么,但我不知道从哪里开始。我找不到任何可以做类似调整的示例代码。 我决定破坏我正在尝试的现有代码,所以我将重新开始(所以不要问我代码:D)


我知道
scrollViewDidScroll
对于类似的东西来说足够平滑。

您应该将图像视图剪辑/屏蔽为路径,而不是图像屏蔽。然后,在平移时,图像不会移动,而只是更新每个图像视图的剪辑/遮罩。如果要在核心图形中执行此操作,可以使用
CGContextMoveToPoint
CGContextAddLineToPoint
等创建路径,然后使用
CGContextClip
进行剪辑

如果要在QuartzCore中执行此操作,可以使用
CAShapeLayer
作为各个图像视图的遮罩,为每个图像的每个遮罩提供自己的
UIBezierPath

// create path

UIBezierPath *path = [UIBezierPath bezierPath];;
CGPoint point = CGPointZero;

point.x += slantOffset;
[path moveToPoint:point];

point.x += self.view.bounds.size.width;
[path addLineToPoint:point];

point.x -= slantOffset * 2.0;
point.y += self.view.bounds.size.height;
[path addLineToPoint:point];

point.x -= self.view.bounds.size.width;
[path addLineToPoint:point];

[path closePath];

// create shape layer, use the path, and specify it for the mask of the image view

CAShapeLayer *maskLayer = [CAShapeLayer layer];
maskLayer.path = [path CGPath];
self.imageView.layer.mask = maskLayer;
如果要更改遮罩(例如在平移手势识别器中),只需更新
遮罩者的
路径
。只需对任何给定时间内可能可见的所有图像重复此过程(例如,此应用程序看起来有三个图像同时可见)

这比你的手势识别器和/或自定义转换快得多。这里我有三个图像视图,我有一个手势识别器为三个图像视图中的每一个的相应遮罩层更新
UIBezierpath
。显然,图层遮罩的路径会相应地进行调整(左、中、右),但我想你应该明白了:


对于不拥有/使用该应用程序的读者来说,这很难。为了改进您的问题,添加一系列屏幕截图或动画GIF或显示您试图解决的问题的东西可能是一个好主意。我刚刚下载了该应用程序,只是为了了解您在谈论什么,我仍然只能猜测您谈论的是“探索国际足联”上可见的效果当水平滚动时。Thnx,为您的答案。我很快就会试试。但是小调查。我可以使用滚动视图而不是平移视图并读取偏移来调整裁剪区域吗?或者回调不够频繁?是的,确实如此,只是尝试在scrollView中使用它&性能非常好。非常感谢:)谢谢,罗布,你有没有可能把这个示例项目发布到github或者别的什么地方?@McCygnus在上看到粗略的演示。@EhabAmer你能用scrollview在github上发布一个代码示例吗?我无法在Scrollview中合并“Rob”代码。