BaseControl按钮合集
BaseControl按钮合集

效果

源码
https://github.com/YouXianMing/Animations
//
// POPBaseControl.h
// Animations
//
// Created by YouXianMing on 16/5/26.
// Copyright © 2016年 YouXianMing. All rights reserved.
// #import <UIKit/UIKit.h>
@class POPBaseControl; @protocol POPBaseControlDelegate <NSObject> /**
* 缩放百分比事件
*
* @param controll PressControll对象
* @param percent 百分比
*/
- (void)POPBaseControl:(POPBaseControl *)controll currentPercent:(CGFloat)percent; /**
* 事件触发
*
* @param controll PressControll对象
*/
- (void)POPBaseControlEvent:(POPBaseControl *)controll; @end @interface POPBaseControl : UIView /**
* 代理
*/
@property (nonatomic, weak) id <POPBaseControlDelegate> delegate; /**
* 动画时间,默认值为0.4
*/
@property (nonatomic) CFTimeInterval animationDuration; /**
* 目标对象
*/
@property (nonatomic, weak) id target; /**
* 事件
*/
@property (nonatomic) SEL selector; /**
* 是否有效
*/
@property (nonatomic) BOOL enabled; /**
* 是否选中
*/
@property (nonatomic) BOOL selected; #pragma mark - Properties used by SubClass & Methods Overwrite by subClass. /**
* 容器view,用于子类添加控件
*/
@property (nonatomic, strong, readonly) UIView *contentView; /**
* 当前动画比例(子类继承的时候重载)
*
* @param percent 比例
*/
- (void)currentPercent:(CGFloat)percent; /**
* 事件激活了
*/
- (void)controllEventActived; @end
//
// POPBaseControl.m
// Animations
//
// Created by YouXianMing on 16/5/26.
// Copyright © 2016年 YouXianMing. All rights reserved.
// #import "POPBaseControl.h"
#import "POP.h" @interface POPBaseControl () @property (nonatomic, strong) UIView *absView;
@property (nonatomic, strong) UIButton *button;
@property (nonatomic, strong) UIView *contentView; @property (nonatomic) CGFloat percent; @end @implementation POPBaseControl - (void)layoutSubviews { [super layoutSubviews];
_button.frame = CGRectMake(, , self.frame.size.width, self.frame.size.height);
_contentView.bounds = CGRectMake(, , self.frame.size.width, self.frame.size.height);
} - (instancetype)initWithFrame:(CGRect)frame { if (self = [super initWithFrame:frame]) { // 动画时间
_animationDuration = 0.4f; // 隐身的view
_absView = [[UIView alloc] init];
_absView.userInteractionEnabled = NO;
_absView.backgroundColor = [UIColor clearColor];
[self addSubview:_absView]; // 容器View
_contentView = [[UIView alloc] initWithFrame:self.bounds];
_contentView.userInteractionEnabled = NO;
[self addSubview:_contentView]; // 按钮
_button = [[UIButton alloc] initWithFrame:self.bounds];
[self addSubview:_button]; // 按钮事件
[_button addTarget:self action:@selector(touchBeginOrTouchDragEnter) forControlEvents:UIControlEventTouchDown | UIControlEventTouchDragEnter];
[_button addTarget:self action:@selector(touchUpInside) forControlEvents:UIControlEventTouchUpInside];
[_button addTarget:self action:@selector(touchDragExitOrTouchCancel) forControlEvents:UIControlEventTouchDragExit | UIControlEventTouchCancel];
} return self;
} #pragma mark - Animations. - (void)touchUpInside { [self touchDragExitOrTouchCancel]; [self controllEventActived]; if (self.target && self.selector) { #pragma clang diagnostic push
#pragma clang diagnostic ignored "-Warc-performSelector-leaks"
[self.target performSelector:self.selector withObject:self];
#pragma clang diagnostic pop } if (self.delegate && [self.delegate respondsToSelector:@selector(POPBaseControlEvent:)]) { [self.delegate POPBaseControlEvent:self];
}
} - (void)touchDragExitOrTouchCancel { [_absView.layer pop_removeAllAnimations]; POPBasicAnimation *scaleAnimation = [POPBasicAnimation animationWithPropertyNamed:kPOPLayerOpacity];
scaleAnimation.toValue = @();
scaleAnimation.delegate = self;
scaleAnimation.duration = _animationDuration;
[_absView.layer pop_addAnimation:scaleAnimation forKey:nil];
} - (void)touchBeginOrTouchDragEnter { [_absView.layer pop_removeAllAnimations]; POPBasicAnimation *scaleAnimation = [POPBasicAnimation animationWithPropertyNamed:kPOPLayerOpacity];
scaleAnimation.toValue = @();
scaleAnimation.delegate = self;
scaleAnimation.duration = _animationDuration;
[_absView.layer pop_addAnimation:scaleAnimation forKey:nil];
} #pragma mark - POPAnimation's delegate. - (void)pop_animationDidApply:(POPAnimation *)anim { NSNumber *toValue = (NSNumber *)[anim valueForKeyPath:@"currentValue"];
_percent = (toValue.floatValue - [POPBaseControl calculateConstantWithX1: y1: x2: y2:]) / [POPBaseControl calculateSlopeWithX1: y1: x2: y2:]; [self currentPercent:_percent];
} #pragma mark - Overwrite by subClass. - (void)currentPercent:(CGFloat)percent { } - (void)controllEventActived { } #pragma mark - Math. + (CGFloat)calculateSlopeWithX1:(CGFloat)x1 y1:(CGFloat)y1 x2:(CGFloat)x2 y2:(CGFloat)y2 { return (y2 - y1) / (x2 - x1);
} + (CGFloat)calculateConstantWithX1:(CGFloat)x1 y1:(CGFloat)y1 x2:(CGFloat)x2 y2:(CGFloat)y2 { return (y1*(x2 - x1) - x1*(y2 - y1)) / (x2 - x1);
} #pragma mark - setter & getter. @synthesize enabled = _enabled; - (void)setEnabled:(BOOL)enabled { _button.enabled = enabled;
} - (BOOL)enabled { return _button.enabled;
} @synthesize selected = _selected; - (void)setSelected:(BOOL)selected { _button.selected = selected;
} - (BOOL)selected { return _button.selected;
} @end
说明
本人一共封装了3种按钮的基类控件,以上是一个示例演示,演示如何通过继承来实现想要的效果.

BaseControl按钮合集的更多相关文章
- Android 自定义View合集
自定义控件学习 https://github.com/GcsSloop/AndroidNote/tree/master/CustomView 小良自定义控件合集 https://github.com/ ...
- 不容错过的UI设计素材大合集
免费PSD素材 TETHR by InVision 这是出自InVision的8款PSD文件,其中包含了100个模板和超过500个UI控件.来自InVision和UI8的设计师一同协作完成了这套UI ...
- Android中的对话框AlertDialog使用技巧合集-转载
Android中的对话框AlertDialog使用技巧合集 文章来自:http://blog.csdn.net/blue6626/article/details/6641105 今天我用自 ...
- Web测试到底是在测什么(资料合集)
开始今晚的主题之前 先来看一张图, 这是老徐16年10月份,线上Web主题分享时整理的大纲 图片略模糊 看得清就好 Web测试, 进行抽离拆分,基本上就如上一些内容. 不管是测什么系统,什么功能,基本 ...
- FFmpeg示例程序合集-批量编译脚本
此前做了一系列有关FFmpeg的示例程序,组成了<最简单的FFmpeg示例程序合集>,其中包含了如下项目:simplest ffmpeg player: ...
- 【Oracle教程资源大合集】Oracle数据库免费学习资源汇总
Oracle的产品非常丰富,各类学习资源也五花八门,本文将介绍Oracle官方的免费教程与风哥整理的Oracle视频教程: 1.Oracle帮助中心 Oracle帮助中心也称为Oracle文档中心,这 ...
- 24个 CSS 高级技巧合集
上期入口:史上最全实用网络爬虫合集! 1.使用CSS复位 CSS复位可以在不同的浏览器上保持一致的样式风格.您可以使用CSS reset 库Normalize等,也可以使用一个更简化的复位方法: ** ...
- Power BI 3-4月功能更新培训合集
Power BI 3-4月功能更新培训合集 Power BI每月功能的更新,都有很多大咖精辟解读,我们一直也都是积极中期待,相信所有P友如是或更甚. 视频学习可以结合微软Power BI 3-4月文 ...
- 常用的js代码合集
!function(util){ window.Utils = util(); }( function(){ //document_event_attributes var DEA = "d ...
随机推荐
- Mockito 简明教程
什么是 Mock 测试 Mock 测试就是在测试过程中,对于某些不容易构造(如 HttpServletRequest 必须在Servlet 容器中才能构造出来)或者不容易获取比较复杂的对象(如 JDB ...
- MediatR 中介模式
使用MediatR完成基于内存级别的消息发布订阅 在微服务架构中领域驱动模型中处理领域事件的相关操作 在区分好领域模型后,就拿代码中来说嘛,用户领域中添加用户操作可能或存在跟用户相关的一些领域事件,在 ...
- 002.iSCSI服务端配置
一 iSCSI target的磁盘种类 大型文件 单一分区(partition) 磁盘 数组 RAID LVM 二 iSCSI创建步骤 建立用于共享的磁盘设备(分区/磁盘/文件) 创建后备磁盘 创建相 ...
- jvm在什么情况下会执行GC
jvm在什么情况下会执行GC?[五种情况] 对象没有引用 作用域发生未捕获异常 程序在作用域正常执行完毕 程序执行了System.exit() 程序发生意外终止(被杀进程等) 什么是没有对象引用?
- 【python学习-1】python环境设置与开发
开始学习python,打算把学习过程都记下来. 下载python,虽然推荐官网,但是感觉官网上面下载python太慢,所以我最后是在csdn上面下载的python版本(3.2.4 windows 64 ...
- BZOJ.1003.[ZJOI2006]物流运输(DP 最短路Dijkstra)
题目链接 容易看出是个最短路+DP.既然答案和天数有关,那么就令\(f[i]\)表示前\(i\)天最小成本. 这个转移很好想: \(f[i]=\min(f[i],\ f[j]+cost(j+1,i)+ ...
- BZOJ.3139.[HNOI2013]比赛(搜索 Hash)
题目链接 不会搜索了.. DFS()中两个参数,枚举每两个队伍的比赛结果(分配当前队伍的分数). 可以发现方案数量与具体哪只球队得了多少分无关,只与当前比赛的队伍数量和得分序列的组成有关.可以记忆化搜 ...
- POP3_收取QQ邮箱邮件的问题
今天纠结了一天的时间,使用pop3协议收取qq邮箱中邮件时,因为一个特别坑爹的问题重新写n次,最后发现是因为qq邮箱设置了独立邮箱密码,必须的用独立邮箱密码登陆才行,/(ㄒoㄒ)/~~!!!! 但今天 ...
- Chrome中使用老的标题栏界面
Chrome 69中启用了新的UI界面,看着更加秀气了. 但新UI一个不好用的地方是标签栏太高了,留给windows标题栏的空白太小,导致拖动窗口位置非常不方便,如下是一个解决方法: 在地址栏输入: ...
- C#后台调用LPT1端口实现小票机打印方法。
public class POSPrinter { const int OPEN_EXISTING = 3; string prnPort = "LPT1"; [DllImport ...