objective-c - CALayer可拖动 mask

标签 objective-c ios calayer

我有两个图像。具有相同大小的相同场景都占据了整个屏幕。一种是图像模糊,一种是焦点模糊。理想的效果是,用户最初将看到模糊的图像,并且当他们从左向右在屏幕上拖动手指时,他们将看到图像中被拖动焦点所在部分的左侧(例如,如果拖动仅在一半时,场景的左半部分是聚焦图像,而右半部分仍然模糊。

我这样做是通过将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似乎都不能解决性能问题。

最佳答案

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

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

这就是@Rizwan的解决方法起作用的原因。这是绕过隐式动画的一种方法。

关于objective-c - CALayer可拖动 mask ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11094289/

相关文章:

objective-c - GDB:使用地址在外部文件上插入断点

iphone - NSString的initWithData :encoding: return type issue

ios - CAGradientLayer 不能改变颜色

iphone - iOS CALayer 内存泄漏仅在设备上

iphone - 使用 CALayer 绘图的问题

ios - GMSPlacePickerViewController 中的 UI 偏移量

objective-c - ViewController 仅调用一次 TouchMoved

ios - 从 iOS 应用程序内购买收据中检索订单 ID/文档编号

ios - iOS 在显示之前如何设置 ViewController View 框架?

javascript - 使用 iFrame 表单后 iPhone 数字键盘不断弹出 (iOS Safari)