iPhone “slide to unlock” animation

前端 未结 13 800
感情败类
感情败类 2020-11-28 00:49

Any ideas as to how Apple implemented the \"slide to unlock\" (also, \"slide to power off\" is another identical example) animation?

I thought about some sort of ani

13条回答
  •  隐瞒了意图╮
    2020-11-28 01:17

    It can be easilly done by using Core Animation, animating a mask layer on the layer displaying the text.

    Try this in any plain UIViewController (you can start with a new Xcode project based on the View-based application project template), or grab my Xcode project here:

    Note that the CALayer.mask property is only available in iPhone OS 3.0 and later.

    - (void)viewDidLoad 
    {
      self.view.layer.backgroundColor = [[UIColor blackColor] CGColor];
    
      UIImage *textImage = [UIImage imageNamed:@"SlideToUnlock.png"];
      CGFloat textWidth = textImage.size.width;
      CGFloat textHeight = textImage.size.height;
    
      CALayer *textLayer = [CALayer layer];
      textLayer.contents = (id)[textImage CGImage];
      textLayer.frame = CGRectMake(10.0f, 215.0f, textWidth, textHeight);
    
      CALayer *maskLayer = [CALayer layer];
    
      // Mask image ends with 0.15 opacity on both sides. Set the background color of the layer
      // to the same value so the layer can extend the mask image.
      maskLayer.backgroundColor = [[UIColor colorWithRed:0.0f green:0.0f blue:0.0f alpha:0.15f] CGColor];
      maskLayer.contents = (id)[[UIImage imageNamed:@"Mask.png"] CGImage];
    
      // Center the mask image on twice the width of the text layer, so it starts to the left
      // of the text layer and moves to its right when we translate it by width.
      maskLayer.contentsGravity = kCAGravityCenter;
      maskLayer.frame = CGRectMake(-textWidth, 0.0f, textWidth * 2, textHeight);
    
      // Animate the mask layer's horizontal position
      CABasicAnimation *maskAnim = [CABasicAnimation animationWithKeyPath:@"position.x"];
      maskAnim.byValue = [NSNumber numberWithFloat:textWidth];
      maskAnim.repeatCount = HUGE_VALF;
      maskAnim.duration = 1.0f;
      [maskLayer addAnimation:maskAnim forKey:@"slideAnim"];
    
      textLayer.mask = maskLayer;
      [self.view.layer addSublayer:textLayer];
    
      [super viewDidLoad];
    }
    

    The images used by this code are:

提交回复
热议问题