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 ...
随机推荐
- Centos7下yum安装zabbix-server的部署(一)
一.环境准备 OS:CentOS 7.2 64bit Zabbix版本:3.0.12 MySQL版本:5.6 hostname ip 主机用途zabbix-server 10.0.0.44 服务端 z ...
- DDD领域模型企业级系统(三)
相关代码: public static void ShowArray() { //数据源 int[] arrayas = new int[] { 1, 2, 3, 4 }; //创建查询 var qu ...
- List集合去除重复对象及equals()、hashCode()方法的作用
原文:https://blog.csdn.net/freelander_j/article/details/52211010 在java中,要将一个集合中重复的对象除去,如果这个集合中的数据类型是基本 ...
- 【LOJ】#2270. 「SDOI2017」天才黑客
题解 显然要记录每个点来的状态,这样会扩充出点度的平方条边,就gg了 删掉所有的点,把每个边拆成两个点,连一条边权为c 这个时候我们考虑对于原先的每个点,将所有与其相连边所需要的节点(不管是进入还是出 ...
- 如何快速的打开当前文件夹的dos命令窗口
一.常规方法: 1.使用 “window + R” 组合键,输入cmd回车.如下图所示: 2.如果你要定位到指定的文件夹,那么需要用cd等命令来处理.如下图所示: 二.快速方法: 按住“shift”键 ...
- Sqoop的安装及简单使用
SQOOP是用于对数据进行导入导出的. (1)把MySQL.Oracle等数据库中的数据导入到HDFS.Hive.HBase中 (2)把HDFS.Hive.HBase中的数据导出到MySQL.Or ...
- Chrome浏览器被hao123劫持,浏览器主页会被篡改为 hao123等
先放一个知乎帖子: https://www.zhihu.com/question/21883209 我就只放几个有效解决办法了,具体的可以看上边那个帖子 方案一: 删掉桌面上的chrome图标 ...
- WinSCP命令行操作
WinSCP命令行操作 WinSCP是一个Windows环境下使用SSH的开源图形化SFTP客户端.同时支持SCP协议.它的主要功能就是在本地与远程计算机间安全的复制文件. 直接在cmd下输入 ...
- 洛谷P2261 [CQOI2007] 余数求和 [数论分块]
题目传送门 余数求和 题目背景 数学题,无背景 题目描述 给出正整数n和k,计算G(n, k)=k mod 1 + k mod 2 + k mod 3 + … + k mod n的值,其中k mod ...
- Java日期时间类
日期时间类有三种: 一.java.util.Date:一般用于声明日期时间类型的变量. 二.java.sql.Date:一般用于数据库日期时间的映射. 三.java.util.Calendar:一般用 ...