ios 定点缩放动画

2021-06-12  本文已影响0人  画舫烟中浅
#define kScreenWidth [[UIScreen mainScreen] bounds].size.width
#define kScreenHeight [[UIScreen mainScreen] bounds].size.height
#define UIColorFromRGB(rgbValue) [UIColor colorWithRed:((float)((rgbValue & 0xFF0000) >> 16))/255.0 green:((float)((rgbValue & 0xFF00) >> 8))/255.0 blue:((float)(rgbValue & 0xFF))/255.0 alpha:1.0]

#import "ViewController.h"
#import "Masonry.h"

@interface ViewController ()<CAAnimationDelegate>{

}

@property (nonatomic , strong) UIView *backView;
@property (nonatomic , strong) UIImageView *imageV;

@end

@implementation ViewController

 - (void)viewDidLoad {
[super viewDidLoad];

UIButton *taskBtn = [UIButton buttonWithType:UIButtonTypeCustom];
taskBtn.frame = CGRectMake(kScreenWidth-100, kScreenHeight-150, 65, 67);
[taskBtn setBackgroundImage:[UIImage imageNamed:@"task_button_image"] forState:UIControlStateNormal];
[taskBtn addTarget:self action:@selector(taskButtonClickEvent) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:taskBtn];


}

#pragma mark --- backView create
-(void)setUpBackView{
if (!_backView) {
    _backView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, kScreenWidth, kScreenHeight)];
    _backView.backgroundColor = [UIColorFromRGB(0x000000) colorWithAlphaComponent:0.5];
    
    [self.view addSubview:_backView];
    
    _backView.userInteractionEnabled = YES;
    UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(backViewClickEvent)];
    [_backView addGestureRecognizer:singleTap];
    
    _imageV = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, kScreenWidth, kScreenHeight)];
    _imageV.image = [UIImage imageNamed:@"task_view_image"];
    [_backView addSubview:_imageV];
//        [_imageV mas_makeConstraints:^(MASConstraintMaker *make) {
//            make.left.mas_equalTo(0);
//            make.top.mas_equalTo(0);
//            make.width.mas_equalTo(kScreenWidth);
//            make.height.mas_equalTo(kScreenHeight);
//            
//        }];
//        
//        [self.imageV layoutIfNeeded];
}
 
}

#pragma mark --- 点击事件
-(void)taskButtonClickEvent{
    [self setUpBackView];

    CABasicAnimation *animationScale = [CABasicAnimation       animationWithKeyPath:@"transform.scale"];
    animationScale.duration = 0.2;
    animationScale.repeatCount = 1;
    animationScale.fromValue = @0.0;
    animationScale.toValue = @1.0;
    animationScale.removedOnCompletion = NO;
    animationScale.delegate = self;
    CGRect frame = self.backView.frame;
    /*定点缩放的位置 锚点 如果(0,0)就是从左上角缩放,如果 (1,1)就是从右下角 */
    self.backView.layer.anchorPoint = CGPointMake(0.9, 0.9);
    self.backView.frame = frame;
   [self.backView.layer addAnimation:animationScale forKey:@"scale-show-layer"];

   __weak typeof(self) weakSelf = self;
   [UIView animateWithDuration:0.2 animations:^{
        weakSelf.backView.alpha = 1;
    
   }];

  }

-(void)backViewClickEvent{

/*
 fromValue:开始帧
 toValue:结束帧
  removedOnCompletion:设置是否自动移除动画
  fillMode:设置保存动画状态
 -> kCAFillModeForwards:保持着动画结束后状态(removedOnCompletion = NO)
 -> kCAFillModeBackwards:回到动画开始前状态(removedOnCompletion = NO)
 -> kCAFillModeBoth:上面两个的合成
 -> kCAFillModeRemoved:默认值 动画开始或结束都会回到最初状态
 */

CABasicAnimation *animationScale = [CABasicAnimation animationWithKeyPath:@"transform.scale"];
animationScale.duration = 0.2;
animationScale.repeatCount = 1;
animationScale.fromValue = @1.0;
animationScale.toValue = @0.0;
animationScale.fillMode = kCAFillModeBoth;
animationScale.removedOnCompletion = NO;
animationScale.delegate = self;
[self.backView.layer addAnimation:animationScale forKey:@"scale-remove-layer"];

__weak typeof(self) weakSelf = self;
[UIView animateWithDuration:0.2 animations:^{
    weakSelf.backView.alpha = 0;
} completion:^(BOOL finished) {
    [weakSelf.imageV removeFromSuperview];
    weakSelf.imageV = nil;
    [weakSelf.backView removeFromSuperview];
    weakSelf.backView = nil;
}];




  }

  -(void) animationDidStop:(CAAnimation *)anim finished:(BOOL)flag{
if ([anim isEqual:[self.backView.layer animationForKey:@"scale-show-layer"]]) {
    [self.backView.layer removeAnimationForKey:@"scale-show-layer"];
}else if ([anim isEqual:[self.backView.layer animationForKey:@"scale-remove-layer"]]){
    [self.backView.layer removeAnimationForKey:@"scale-remove-layer"];
    [self.backView removeFromSuperview];
}
}


@end
上一篇下一篇

猜你喜欢

热点阅读