我有两张照片。占据整个屏幕的相同场景,大小相同。一个是图像模糊,一个是焦点。期望的效果是用户最初将看到模糊的图像,并且当他们将手指从左向右拖过屏幕时,他们将看到图像的一部分在他们拖动的位置的左侧对焦(例如,如果他们拖动只有一半,场景的左半部分是聚焦的图像,而右半部分仍然是模糊的。
我这样做是通过将焦点图像作为图像继承UIImageView
- 然后在应用了蒙版的情况下添加CALayer
模糊图像,然后根据touchesBegan更改蒙版的位置/ touchesMoved。问题是使用下面的方法性能非常慢。所以我想知道我做错了什么。
@interface DragMaskImageView : UIImageView
@end
@implementation DragMaskImageView{
BOOL userIsTouchingMask;
CALayer *maskingLayer;
CALayer *topLayer;
float horzDistanceOfTouchFromCenter;
}
- (void)awakeFromNib {
topLayer = [CALayer layer];
topLayer.contents = (id) [UIImage imageNamed:@"blurryImage.jpg"].CGImage;
topLayer.frame = CGRectMake(0, 0, 480, 300);
[self.layer addSublayer:topLayer];
maskingLayer = [CALayer layer];
maskingLayer.contents = (id) [UIImage imageNamed:@"maskImage.png"].CGImage;
maskingLayer.anchorPoint = CGPointMake(0.0, 0.0);
maskingLayer.bounds = CGRectMake(0, 0, 480, 300);
[topLayer setMask:maskingLayer];
}
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
CGPoint touchPoint = [[[event allTouches] anyObject] locationInView:self];
if (touchPoint.x < maskingLayer.frame.origin.x) {
NSLog(@"user is touching to the left of mask - disregard");
userIsTouchingMask = NO;
} else {
NSLog(@"user is touching ");
horzDistanceOfTouchFromCenter = touchPoint.x - maskingLayer.frame.origin.x;
userIsTouchingMask = YES;
}
}
-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{
if (userIsTouchingMask) {
CGPoint touchPoint = [[[event allTouches] anyObject] locationInView:self];
float newMaskX = touchPoint.x - horzDistanceOfTouchFromCenter;
if (newMaskX < 0) {
newMaskX = 0;
}
if (newMaskX > 480) {
newMaskX = 480;
}
maskingLayer.frame = CGRectMake(newMaskX, 0 ,480, 300);
}
}
我检查了相关帖子core animation calayer mask animation performance,但在任何图层上将shouldRasterize
设置为YES似乎无助于解决性能问题。
答案 0 :(得分:4)
问题可能是图层的隐式动画导致它看起来很迟钝。关闭隐式动画应解决问题:
[CATransaction begin];
[CATransaction setDisableActions:YES];
maskingLayer.frame = CGRectMake(newMaskX, 0 ,480, 300);
[CATransaction commit];
这就是为什么@Rizwan的解决方案的工作原理。这是绕过隐式动画的一种方式。
答案 1 :(得分:3)
我遇到了同样的问题,更新掩码的帧总是落后于触摸。我发现实际上使用新框架重新创建蒙版可确保蒙版始终立即更新。