目标C中的Animate Mask

时间:2013-07-30 16:39:11

标签: objective-c resize uiimage mask

我正在创建一个应用程序,我必须在一个屏幕上显示3个图像,当用户触摸一个图像时,那个图像应该通过动画和调整大小来显示。

因此,对于第一步,我使用3个不同的透明蒙版图像对3张图像进行了遮罩 How to Mask an UIImageView

我的方法如下

- (UIImageView*) maskedImage:(UIImage *)image withMasked:(UIImage *)maskImage {
    UIImageView *imageView = [[UIImageView alloc] initWithImage:image];
    CALayer *mask1 = [CALayer layer];
    mask1.contents = (id)[maskImage CGImage];
    mask1.frame = CGRectMake(0, 0, 1024, 768);
    imageView.layer.mask = mask1;
    imageView.layer.masksToBounds = YES;
    return imageView;
}

我称之为

    self.image2 = [UIImage imageNamed:@"screen2Full.png"];
    self.mask2 = [UIImage imageNamed:@"maskImage.png"];
    self.imageView2 = [self maskedImage:self.image2 withMasked:self.mask2];
    [self.completeSingleView addSubview:self.imageView2];

这很完美。

现在进行第2步。为蒙版设置动画,以便显示完整图像。我已经搜索了很多关于这一点,但没有取得成功。所以请帮帮我。我只是想知道我们如何动画和调整蒙版图像的大小以便我可以查看完整的图像。我的概念如下。

enter image description here

1 个答案:

答案 0 :(得分:0)

所以最后我从多个站点得到了解决方案,显然有一些逻辑和努力工作;)。所以这是这个

的解决方案
-(void)moveLayer:(CALayer*)layer to:(CGPoint)point
{
    // Prepare the animation from the current position to the new position
    CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"position"];
    animation.fromValue = [layer valueForKey:@"position"];
    animation.toValue = [NSValue valueWithCGPoint:point];
    animation.duration = .3;
    layer.position = point;

    [layer addAnimation:animation forKey:@"position"];
}

-(void)resizeLayer:(CALayer*)layer to:(CGSize)size
{
    CGRect oldBounds = layer.bounds;
    CGRect newBounds = oldBounds;
    newBounds.size = size;
    CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"bounds"];

    animation.fromValue = [NSValue valueWithCGRect:oldBounds];
    animation.toValue = [NSValue valueWithCGRect:newBounds];
    animation.duration = .3;
    layer.bounds = newBounds;    
    [layer addAnimation:animation forKey:@"bounds"];
}

- (UIImageView*) animateMaskImage:(UIImage *)image withMask:(UIImage *)maskImage width:(int )wd andHeight:(int )ht andSize:(CGSize)size andPosition:(CGPoint)pt {
    UIImageView *imageView = [[UIImageView alloc] initWithImage:image];
    CALayer *mask = [CALayer layer];
    mask.contents = (id)[maskImage CGImage];
    mask.frame = CGRectMake(0, 0, wd, ht);

    //This needs to be place before masking. I don't knwo why. But its working :)
    [self resizeLayer:mask to:size];
    [self moveLayer:mask to:pt];

    imageView.layer.mask = mask;
    imageView.layer.masksToBounds = YES;
    return imageView;
}

你只需要将其称为

 [self.imageView1 removeFromSuperview];
 self.imageView1 = [self animateMaskedImage:self.image1 withMasked:self.mask1 width:1024 andHeight:768 andSize:CGSizeMake(1024*4, 768*4) andPosition:CGPointMake(1024*2, 768*2)];
 [self.completeSingleView addSubview:self.imageView1];