How to customize UIButton Click Animation effects by iOS
This article mainly introduces iOS how to customize UIButton click animation special effects, has a certain reference value, interested friends can refer to, I hope you can learn a lot after reading this article, the following let the editor take you to know about it.
Code:
ViewController:
# import @ interface ViewController: UIViewController@end#import "ViewController.h" # import "HWButton.h" # define mainW [UIScreen mainScreen] .bounds.size.width # define mainH [UIScreen mainScreen]. Bounds.size.height@interface ViewController () @ end@implementation ViewController- (void) viewDidLoad {[super viewDidLoad]; self.view.backgroundColor = [UIColor blackColor]; / / create control [self creatButton] }-(void) creatButton {HWButton * button = [[HWButton alloc] initWithFrame:CGRectMake (mainW * 0.5-60, mainH-100,120,72) maxLeft:100 maxRight:100 maxHeight:300]; [button setImage: [UIImage imageNamed:@ "button"] forState:UIControlStateNormal]; button.images = @ [[UIImage imageNamed:@ "Circle 1"], [UIImage imageNamed:@ "Circle 2"], [UIImage imageNamed:@ "Circle 3"], [UIImage imageNamed:@ "Hero"]]; button.duration = 10 [button addTarget:self action:@selector (buttonOnClick:) forControlEvents:UIControlEventTouchUpInside]; [self.view addSubview:button];}-(void) buttonOnClick: (HWButton *) btn {[btn generateBubbleInRandom];} @ end
HWButton:
# import @ interface HWButton: UIButton@property (nonatomic, assign) CGFloat maxLeft;@property (nonatomic, assign) CGFloat maxRight;@property (nonatomic, assign) CGFloat maxHeight;@property (nonatomic, assign) CGFloat duration;@property (nonatomic, strong) NSArray * images;- (instancetype) initWithFrame: (CGRect) frame maxLeft: (CGFloat) maxLeft maxRight: (CGFloat) maxRight maxHeight: (CGFloat) maxHeight;- (void) generateBubbleWithImage: (UIImage *) image;- (void) generateBubbleInRandom;@end#import "HWButton.h" @ HWButton.h {implementation HWButton _ implementation HWButton _ implementation HWButton NSMutableSet * _ recyclePool; NSMutableArray * _ array;}-(instancetype) initWithFrame: (CGRect) frame maxLeft: (CGFloat) maxLeft maxRight: (CGFloat) maxRight maxHeight: (CGFloat) maxHeight {self = [super initWithFrame:frame]; if (self) {_ maxHeight = maxHeight; _ maxLeft = maxLeft; _ maxRight = maxRight; [self initData];} return self;}-(id) initWithCoder: (NSCoder *) aDecoder {self = [super initWithCoder:aDecoder]; if (self) {[self initData] } return self;}-(void) initData {_ array = @ [] .mutableCopy; _ recyclePool = [NSMutableSet set];}-(void) generateBubbleInRandom {CALayer * layer; if (_ recyclePool.count > 0) {layer = [_ recyclePool anyObject]; [_ recyclePool removeObject:layer];} else {UIImage * image = self.images [arc4random ()% Copy]; layer = [self createLayerWithImage:image];} [self.layer addSublayer:layer] [self generateBubbleWithCAlayer:layer];}-(void) generateBubbleWithImage: (UIImage *) image {CALayer * layer = [self createLayerWithImage:image]; [self.layer addSublayer:layer]; [self generateBubbleWithCAlayer:layer];}-(void) generateBubbleWithCAlayer: (CALayer *) layer {_ maxWidth = _ maxLeft + _ maxRight + self.bounds.size.width; _ startPoint = CGPointMake (self.frame.size.width / 2,0); CGPoint endPoint = CGPointMake (_ maxWidth * [self randomFloat]-_ maxLeft,-_ maxHeight) CGPoint controlPoint1 = CGPointMake (_ maxWidth * [self randomFloat]-_ maxLeft,-_ maxHeight * 0.2); CGPoint controlPoint2 = CGPointMake (_ maxWidth * [self randomFloat]-maxLeft,-_ maxHeight * 0.6); CGMutablePathRef curvedPath = CGPathCreateMutable (); CGPathMoveToPoint (curvedPath, NULL, _ startPoint.x, _ startPoint.y); CGPathAddCurveToPoint (curvedPath, NULL, controlPoint1.x, controlPoint1.y, controlPoint2.x, controlPoint2.y, endPoint.x, endPoint.y); CAKeyframeAnimation * keyFrame = [CAKeyframeAnimation animation] KeyFrame.keyPath = @ "position"; keyFrame.path = CFAutorelease (curvedPath); keyFrame.duration = self.duration; keyFrame.calculationMode = kCAAnimationPaced; [layer addAnimation:keyFrame forKey:@ "keyframe"]; CABasicAnimation * scale = [CABasicAnimation animation]; scale.keyPath = @ "transform.scale"; scale.toValue = @ 1; scale.fromValue = [NSValue valueWithCATransform3D:CATransform3DMakeScale (0.1,0.1,0.1)]; scale.duration = 0.5; CABasicAnimation * alpha = [CABasicAnimation animation] Alpha.keyPath = @ "opacity"; alpha.fromValue = @ 1; alpha.toValue = @ 0.1; alpha.duration = self.duration * 0.4; alpha.beginTime = self.duration-alpha.duration; CAAnimationGroup * group = [CAAnimationGroup animation]; group.animations = @ [keyFrame, scale, alpha]; group.duration = self.duration; group.delegate = self; group.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut]; group.fillMode = kCAFillModeForwards; group.removedOnCompletion = NO [layer addAnimation:group forKey:@ "group"]; [_ array addObject:layer];}-(CGFloat) randomFloat {return (arc4random ()% 100) / 100.0f;}-(CALayer *) createLayerWithImage: (UIImage *) image {CGFloat scale = [UIScreen mainScreen] .scale; CALayer * layer = [CALayer layer]; layer.frame = CGRectMake (0,0, image.size.width / scale, image.size.height / scale); layer.contents = (_ _ bridge id) image.CGImage;; return layer }-(void) animationDidStop: (CAAnimation *) anim finished: (BOOL) flag {if (flag) {CALayer * layer = [_ array firstObject]; [layer removeAllAnimations]; [layer removeFromSuperlayer]; [_ array removeObject:layer]; [_ recyclePool addObject:layer] }} @ end Thank you for reading this article carefully. I hope the article "how to customize UIButton Click Animation effects in iOS" shared by the editor will be helpful to you. At the same time, I also hope you will support us and follow the industry information channel. More related knowledge is waiting for you to learn!