首页 > 代码库 > 设计能长按并有动画效果且能触发事件的高级view
设计能长按并有动画效果且能触发事件的高级view
设计能长按并有动画效果且能触发事件的高级view
效果图:
源码:
LongTapAnimationView.h 与 LongTapAnimationView.m
//// LongTapAnimationView.h// YouXianMingClock//// Created by YouXianMing on 14-10-13.// Copyright (c) 2014年 YouXianMing. All rights reserved.//#import <UIKit/UIKit.h>@class LongTapAnimationView;@protocol LongTapAnimationViewDelegate <NSObject>/** * 长按百分比 * * @param percent 百分比 * @param view 自身 */- (void)longPressPercentage:(CGFloat)percent view:(LongTapAnimationView *)view;- (void)longPressCompleteWithView:(LongTapAnimationView *)view;@end@interface LongTapAnimationView : UIView/** * 代理 */@property (nonatomic, assign) id<LongTapAnimationViewDelegate> delegate;/** * 百分比 */@property (nonatomic, assign, readonly) CGFloat percent;/** * 缩放比例 */@property (nonatomic, assign) CGFloat scaleValue;/** * 时候允许按下(默认为YES) */@property (nonatomic, assign) BOOL canTouch;/** * 长按时间多长时间才能表示已经按下按钮激活事件 */@property (nonatomic, assign) NSTimeInterval completeDurationAfterLongPress;/** * 激活按钮事件 */- (void)activateButtonEffect;@end
//// LongTapAnimationView.m// YouXianMingClock//// Created by YouXianMing on 14-10-13.// Copyright (c) 2014年 YouXianMing. All rights reserved.//#import "LongTapAnimationView.h"#import "POP.h"@interface LongTapAnimationView ()<POPAnimationDelegate>@property (nonatomic, strong) UIButton *button;@end@implementation LongTapAnimationView- (instancetype)initWithFrame:(CGRect)frame{ self = [super initWithFrame:frame]; if (self) { // 完整显示按住按钮后的动画效果 _button = [[UIButton alloc] initWithFrame:self.bounds]; [self addSubview:_button]; // 按住按钮后没有松手的动画 [_button addTarget:self action:@selector(scaleToSmall) forControlEvents:UIControlEventTouchDown | UIControlEventTouchDragEnter]; // 按住按钮松手后的动画 [_button addTarget:self action:@selector(scaleAnimations) forControlEvents:UIControlEventTouchUpInside]; // 按住按钮后拖拽出去的动画 [_button addTarget:self action:@selector(scaleToDefault) forControlEvents:UIControlEventTouchDragExit]; _button.userInteractionEnabled = NO; } return self;}/** * 在设定frame值的时候也设置button的frame值 * * @param frame 当前view的frame值 */- (void)setFrame:(CGRect)frame { [super setFrame:frame]; _button.bounds = frame;}- (void)scaleToSmall{ CGFloat tmpScale = (_scaleValue > 0)? _scaleValue : 0.7f; // 变小尺寸 POPBasicAnimation *scaleAnimation = [POPBasicAnimation animationWithPropertyNamed:kPOPLayerScaleXY]; scaleAnimation.toValue = [NSValue valueWithCGSize:CGSizeMake(tmpScale, tmpScale)]; scaleAnimation.delegate = self; // 核心 [self.layer pop_addAnimation:scaleAnimation forKey:nil]; [self performSelector:@selector(performSelectorEvent) withObject:nil afterDelay:(_completeDurationAfterLongPress > 1.5 ? _completeDurationAfterLongPress : 1.5)];}- (void)scaleToDefault{ // 恢复尺寸 POPBasicAnimation *scaleAnimation = [POPBasicAnimation animationWithPropertyNamed:kPOPLayerScaleXY]; scaleAnimation.toValue = [NSValue valueWithCGSize:CGSizeMake(1.f, 1.f)]; scaleAnimation.delegate = self; // 核心 [self.layer pop_addAnimation:scaleAnimation forKey:nil]; [NSObject cancelPreviousPerformRequestsWithTarget:self];}- (void)scaleAnimations{ // 恢复尺寸 POPBasicAnimation *scaleAnimation = [POPBasicAnimation animationWithPropertyNamed:kPOPLayerScaleXY]; scaleAnimation.toValue = [NSValue valueWithCGSize:CGSizeMake(1.f, 1.f)]; scaleAnimation.delegate = self; // 核心 [self.layer pop_addAnimation:scaleAnimation forKey:nil]; [NSObject cancelPreviousPerformRequestsWithTarget:self];}- (void)performSelectorEvent{ if (_delegate) { [_delegate longPressCompleteWithView:self]; }}/** * POP动画代理 * * @param anim 执行动画的那个对象 */- (void)pop_animationDidApply:(POPAnimation *)anim{ NSValue *toValue = http://www.mamicode.com/(NSValue *)[anim valueForKeyPath:@"currentValue"]; CGSize size = [toValue CGSizeValue]; CGFloat tmpScale = (_scaleValue > 0)? _scaleValue : 0.7f; _percent = (size.height - calculateConstant(0, 1, 1, tmpScale))/calculateSlope(0, 1, 1, tmpScale); if (_delegate) { [_delegate longPressPercentage:_percent view:self]; }}CGFloat calculateSlope(CGFloat x1, CGFloat y1, CGFloat x2, CGFloat y2){ return (y2 - y1) / (x2 - x1);}CGFloat calculateConstant(CGFloat x1, CGFloat y1, CGFloat x2, CGFloat y2){ return (y1*(x2 - x1) - x1*(y2 - y1)) / (x2 - x1);}- (void)addSubview:(UIView *)view{ [super addSubview:view]; /** * 如果继承了这个类,则子类不会执行以下方法 */ if ([self class] == [LongTapAnimationView class]) { [self bringSubviewToFront:_button]; }}- (void)activateButtonEffect{ [self bringSubviewToFront:_button];}#pragma mark - 重写setter,getter方法@synthesize canTouch = _canTouch;- (void)setCanTouch:(BOOL)canTouch { _canTouch = canTouch; _button.userInteractionEnabled = canTouch;}- (BOOL)canTouch { return _canTouch;}@end
笔者设计这个类可谓用心良苦,Facebook是业界良心啊!以下是使用细节:
设计能长按并有动画效果且能触发事件的高级view
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。