【问题标题】:CALayer Draggable MaskCALayer 可拖动蒙版
【发布时间】:2012-06-19 04:18:55
【问题描述】:

我有两张图片。两个相同的场景,相同的大小,占据了整个屏幕。一个是图像模糊,一个是焦点。想要的效果是用户最初会看到模糊的图像,当他们在屏幕上从左到右拖动手指时,他们将看到图像左侧的部分,他们拖动的位置是焦点(例如,如果他们拖动只过了一半,那么场景的左半部分是聚焦的图像,而右半部分仍然是模糊的。

我这样做是通过将聚焦图像作为图像的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 似乎对性能问题没有帮助。

【问题讨论】:

    标签: objective-c ios calayer


    【解决方案1】:

    我遇到了同样的问题,更新蒙版的框架总是滞后于触摸。我发现实际上使用新框架重新创建蒙版可确保蒙版始终即时更新。

    【讨论】:

      【解决方案2】:

      也许问题在于图层的隐式动画导致它显得迟缓。关闭隐式动画应该可以解决问题:

      [CATransaction begin];
      [CATransaction setDisableActions:YES];
      maskingLayer.frame = CGRectMake(newMaskX, 0 ,480, 300);
      [CATransaction commit];
      

      这就是@Rizwan 的变通方法有效的原因。这是一种绕过隐式动画的方法。

      【讨论】:

        猜你喜欢
        • 2012-09-15
        • 2017-07-03
        • 2012-06-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多