<img src="https://img-blog.youkuaiyun.com/20151030162509158?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />
//
// ZZAntiLostViewController.h
// JK_xuXuKou
//
// Created by ZZ_Macpro on 15/10/28.
// Copyright © 2015年 ZZ_Macpro. All rights reserved.
//
#import "JKSettingViewController.h"
@interface ZZAntiLostViewController : JKSettingViewController
@end
</pre><pre name="code" class="objc">#pragma warning----这里写出了利用开关状态来实时显示动画和开启动画注释写的很详细
<pre name="code" class="objc">//
// ZZAntiLostViewController.m
// JK_xuXuKou
//
// Created by ZZ_Macpro on 15/10/28.
// Copyright © 2015年 ZZ_Macpro. All rights reserved.
//
#import "ZZAntiLostViewController.h"
#import "JKSettingGroup.h"
#import "JKSettingSwitchItem.h"
#import "ZZCustomLayer.h"
@interface ZZAntiLostViewController ()
@property (nonatomic, strong) ZZCustomLayer *iphoneHalo;
@property (nonatomic, strong) ZZCustomLayer *babyHalo;
@property (nonatomic, strong) UIImageView *babyImgView;
@property (nonatomic, strong) UIImageView *iphoneView;
@property (nonatomic, strong) UISwitch *dismissSwitch;
@end
@implementation ZZAntiLostViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.tableView.bounces = NO;
// 1.0 设置背景
[self setupView];
// 2.0 设置开关View
[self setupSwitchView];
// 3.0 设置dismiss动画
[self setupDismissView];
}
/**
* 宝贝头像同步
*/
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
NSUserDefaults *iconDefault = [NSUserDefaults standardUserDefaults];
NSData *icon = (NSData *)[iconDefault objectForKey:@"indexIcon"];
UIImage *iconImg = [UIImage imageWithData:icon];
NSUserDefaults *dismissDefaults = [NSUserDefaults standardUserDefaults];
BOOL dismissSwithIsOn = [dismissDefaults objectForKey:@"dismissSwitch"];
/**
* 实时显示开关的记录并且根据调用layer动画
* UISwitch 技巧
* 1> 监听UISwitch 只能够是 UIControlEventValueChanged 因为它只有YES\NO属性
* 2> 实时设置UISwitch 开关属性的时候只能调用self.dismissSwitch.on(不能调用isOn)
*/
if (dismissSwithIsOn) {
self.dismissSwitch.on = YES;
[self setupLayer];
} else {
self.dismissSwitch.on = NO;
}
if (iconImg) {
self.babyImgView.image = iconImg;
self.babyImgView.clipsToBounds = YES;
self.babyImgView.layer.cornerRadius = 45.5;
}
}
/**
* 1.0 设置背景
*/
- (void)setupView
{
UIImageView *imgView = [[UIImageView alloc] init];
imgView.image = [UIImage imageWithName:@"防丢04(1)"];
imgView.frame = self.view.frame;
[self.view addSubview:imgView];
}
/**
* 2.0 设置开关View
*/
- (void)setupSwitchView
{
UIView *dissmissSwitchView = [[UIView alloc] init];
CGFloat dissmissSwitchViewX = 0;
CGFloat dissmissSwitchViewY = 30;
CGFloat dissmissSwitchViewW = self.view.frame.size.width;
CGFloat dissmissSwitchViewH = 50;
dissmissSwitchView.frame = CGRectMake(dissmissSwitchViewX, dissmissSwitchViewY, dissmissSwitchViewW, dissmissSwitchViewH);
[self.view addSubview:dissmissSwitchView];
UILabel *dismissLabel = [[UILabel alloc] init];
dismissLabel.text = NSLocalizedString(@"启动防丢功能", nil);
CGFloat dismissLabelX = 10;
CGFloat dismissLabelY = 0;
CGFloat dismissLabelW = dissmissSwitchViewW;
CGFloat dismissLabelH = dissmissSwitchViewH;
dismissLabel.frame = CGRectMake(dismissLabelX, dismissLabelY, dismissLabelW, dismissLabelH);
dismissLabel.textAlignment = NSTextAlignmentLeft;
[dissmissSwitchView addSubview:dismissLabel];
UISwitch *dismissSwitch = [[UISwitch alloc] init];
CGFloat dismissSwitchX = self.view.frame.size.width - 35;
CGFloat dismissSwitchY = dissmissSwitchViewH * 0.5;
dismissSwitch.center = CGPointMake(dismissSwitchX, dismissSwitchY);
[dismissSwitch addTarget:self action:@selector(dismissChange) forControlEvents:UIControlEventValueChanged];
[dissmissSwitchView addSubview:dismissSwitch];
self.dismissSwitch = dismissSwitch;
}
/**
* 监听开关的点击并且实时记录
*/
- (void)dismissChange
{
if (self.dismissSwitch.isOn == YES) {
NSUserDefaults *dismissDefaults = [NSUserDefaults standardUserDefaults];
[dismissDefaults setBool:self.dismissSwitch.isOn forKey:@"dismissSwitch"];
[dismissDefaults synchronize];
[self setupLayer];
} else if (self.dismissSwitch.isOn == NO) {
NSUserDefaults *dismissDefaults = [NSUserDefaults standardUserDefaults];
[dismissDefaults removeObjectForKey:@"dismissSwitch"];
[self removeLayer];
}
}
/**
* 3.0 设置dismiss动画
*/
- (void)setupDismissView
{
UIImageView *iphoneView = [[UIImageView alloc] init];
iphoneView.image = [UIImage imageWithName:@"dismissImg"];
CGFloat iphoneViewW = iphoneView.image.size.width;
CGFloat iphoneViewH = iphoneView.image.size.height;
if (SCREEN_HEIGHT == 480) {
CGFloat iphoneViewX = self.view.frame.size.width * 0.7;
CGFloat iphoneViewY = 360;
iphoneView.center = CGPointMake(iphoneViewX, iphoneViewY);
} else if (SCREEN_HEIGHT == 568) {
CGFloat iphoneViewX = self.view.frame.size.width * 0.7;
CGFloat iphoneViewY = 430;
iphoneView.center = CGPointMake(iphoneViewX, iphoneViewY);
} else if (SCREEN_WIDTH == 375) {
CGFloat iphoneViewX = self.view.frame.size.width * 0.7;
CGFloat iphoneViewY = 400;
iphoneView.center = CGPointMake(iphoneViewX, iphoneViewY);
} else {
CGFloat iphoneViewX = self.view.frame.size.width * 0.7;
CGFloat iphoneViewY = 410;
iphoneView.center = CGPointMake(iphoneViewX, iphoneViewY);
}
iphoneView.bounds = CGRectMake(0, 0, iphoneViewW, iphoneViewH);
[self.view addSubview:iphoneView];
self.iphoneView = iphoneView;
UIImageView *babyImgView = [[UIImageView alloc] init];
babyImgView.image = [UIImage imageWithName:@"babyPhoto_00"];
CGFloat babyImgViewW = babyImgView.image.size.width;
CGFloat babyImgViewH = babyImgView.image.size.height;
if (SCREEN_HEIGHT == 480) {
CGFloat babyImgViewX = self.view.frame.size.width * 0.3;
CGFloat babyImgViewY = 240;
babyImgView.center = CGPointMake(babyImgViewX, babyImgViewY);
} else if (SCREEN_HEIGHT == 568) {
CGFloat babyImgViewX = self.view.frame.size.width * 0.3;
CGFloat babyImgViewY = 280;
babyImgView.center = CGPointMake(babyImgViewX, babyImgViewY);
} else if (SCREEN_WIDTH == 375) {
CGFloat babyImgViewX = self.view.frame.size.width * 0.3;
CGFloat babyImgViewY = 280;
babyImgView.center = CGPointMake(babyImgViewX, babyImgViewY);
} else {
CGFloat babyImgViewX = self.view.frame.size.width * 0.3;
CGFloat babyImgViewY = 280;
babyImgView.center = CGPointMake(babyImgViewX, babyImgViewY);
}
babyImgView.bounds = CGRectMake(0, 0, babyImgViewW, babyImgViewH);
[self.view addSubview:babyImgView];
self.babyImgView = babyImgView;
}
/**
* 开启layer动画
*/
- (void)setupLayer
{
self.iphoneHalo = [ZZCustomLayer layer];
self.babyHalo = [ZZCustomLayer layer];
self.iphoneHalo.position = self.iphoneView.center;
self.babyHalo.position = self.babyImgView.center;
[self.view.layer insertSublayer:self.iphoneHalo below:self.iphoneView.layer];
[self.view.layer insertSublayer:self.babyHalo below:self.babyImgView.layer];
}
/**
* 移除layer动画
*/
- (void)removeLayer
{
[self.iphoneHalo removeFromSuperlayer];
[self.babyHalo removeFromSuperlayer];
}
@end
</pre><pre name="code" class="objc">// ZZCustomLayer.h
// JK_xuXuKou
//
// Created by ZZ_Macpro on 15/10/29.
// Copyright © 2015年 ZZ_Macpro. All rights reserved.
//
#import <QuartzCore/QuartzCore.h>
@interface ZZCustomLayer : CALayer
@property (nonatomic, assign) CGFloat radius; // default:60pt
@property (nonatomic, assign) NSTimeInterval animationDuration; // default:3s
@property (nonatomic, assign) NSTimeInterval pulseInterval; // default is 0s
@end
// ZZCustomLayer.m
// JK_xuXuKou
//
// Created by ZZ_Macpro on 15/10/29.
// Copyright © 2015年 ZZ_Macpro. All rights reserved.
//
#import "ZZCustomLayer.h"
@interface ZZCustomLayer ()
@property (nonatomic, strong) CAAnimationGroup *animationGroup;
@end
@implementation ZZCustomLayer
- (id)init {
self = [super init];
if (self) {
self.contentsScale = [UIScreen mainScreen].scale;
self.opacity = 0;
// default
self.radius = 180;
self.animationDuration = 2.5;
self.pulseInterval = 0;
self.backgroundColor = [[UIColor colorWithRed:77/255.0 green:255/255.0 blue:255/255.0 alpha:1] CGColor];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void) {
[self setupAnimationGroup];
if(self.pulseInterval != INFINITY) {
dispatch_async(dispatch_get_main_queue(), ^(void) {
[self addAnimation:self.animationGroup forKey:@"pulse"];
});
}
});
}
return self;
}
- (void)setRadius:(CGFloat)radius {
_radius = radius;
CGPoint tempPos = self.position;
CGFloat diameter = self.radius * 2;
self.bounds = CGRectMake(0, 0, diameter, diameter);
self.cornerRadius = self.radius;
self.position = tempPos;
}
- (void)setupAnimationGroup {
CAMediaTimingFunction *defaultCurve = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionDefault];
self.animationGroup = [CAAnimationGroup animation];
self.animationGroup.duration = self.animationDuration + self.pulseInterval;
self.animationGroup.repeatCount = INFINITY;
self.animationGroup.removedOnCompletion = NO;
self.animationGroup.timingFunction = defaultCurve;
CABasicAnimation *scaleAnimation = [CABasicAnimation animationWithKeyPath:@"transform.scale.xy"];
scaleAnimation.fromValue = @0.0;
scaleAnimation.toValue = @1.0;
scaleAnimation.duration = self.animationDuration;
CAKeyframeAnimation *opacityAnimation = [CAKeyframeAnimation animationWithKeyPath:@"opacity"];
opacityAnimation.duration = self.animationDuration;
opacityAnimation.values = @[@0.45, @0.45, @0];
opacityAnimation.keyTimes = @[@0, @0.2, @1];
opacityAnimation.removedOnCompletion = NO;
NSArray *animations = @[scaleAnimation, opacityAnimation];
self.animationGroup.animations = animations;
}
@end