UIControl的使用
在开发当中,可能很多时候都需要做个点赞的需求,如果用按钮实现,按钮作为一个系统复合控件,外部是一个 View--》UIControl的容器,
内部包含了UILabel和UIImage,以及一些排版规则。用UIButton就很难去做一些在“赞”和“取消赞”切换时的效果。
可是我们又很需要UIButton似的事件响应机制。
怎么办?
对! 就是使用UIControl。
UIControl在这里有两个突出的优势:
1.作为UIButton的父控件,具有UIButton一样的事件响应机制
2.作为UIView的简单子控件,具有作为容器视图的潜质
设计思路:实现一个自定义控件,继承UIControl,里面包含一些视图,包含什么视图由你的需求决定,我的是两张图片。 然后在事件响应时,两张图片进行切换。切换动画可以自定义。这样就实现了一个切换效果自由度很大的点赞按钮哦!
参考代码如下:
- #import <UIKit/UIKit.h>
- typedef NS_ENUM(NSInteger, UIControlFlagMode) {
- FlagModelNO,
- FlagModelYES,
- FlagModelDefalt
- };
- @interface UIControlFlagView : UIControl
- @property (nonatomic, strong) UIImage*noStateImg;
- @property (nonatomic, strong) UIImage*yesStateImg;
- @property (nonatomic, strong) UIImage*defaultStateImg;
- @property (nonatomic, assign) UIControlFlagMode flag;
- - (void)setFlag:(UIControlFlagMode)flag withAnimation:(BOOL)animation;
- @end
m文件:
- #import "UIControlFlagView.h"
- @interface UIControlFlagView()
- @property (nonatomic, strong) UIImageView*noStateImgV;
- @property (nonatomic, strong) UIImageView*yesStateImgV;
- @property (nonatomic, strong) UIImageView*defaultStateImgV;
- @end
- @implementation UIControlFlagView
- - (id)initWithFrame:(CGRect)frame
- {
- self = [super initWithFrame:frame];
- if (self) {
- // Initialization code
- }
- return self;
- }
- - (void)setNoStateImg:(UIImage *)noStateImg
- {
- if (!self.noStateImgV)
- {
- self.noStateImgV = [[UIImageView alloc] initWithFrame:self.bounds];
- self.noStateImgV.contentMode = UIViewContentModeCenter;
- [self addSubview:self.noStateImgV];
- self.flag = FlagModelNO;//default style
- }
- self.noStateImgV.image = noStateImg;
- _noStateImg = noStateImg;
- }
- - (void)setYesStateImg:(UIImage *)yesStateImg
- {
- if (!self.yesStateImgV)
- {
- self.yesStateImgV = [[UIImageView alloc] initWithFrame:self.bounds];
- self.yesStateImgV.contentMode = UIViewContentModeCenter;
- [self addSubview:self.yesStateImgV];
- self.yesStateImgV.alpha = 0.0;
- }
- self.yesStateImgV.image = yesStateImg;
- _yesStateImg = yesStateImg;
- }
- - (void)setDefaultStateImg:(UIImage *)defaultStateImg
- {
- if (!self.defaultStateImgV)
- {
- self.defaultStateImgV = [[UIImageView alloc] initWithFrame:self.bounds];
- self.defaultStateImgV.contentMode = UIViewContentModeCenter;
- [self addSubview:self.defaultStateImgV];
- }
- self.defaultStateImgV.image = defaultStateImg;
- _defaultStateImg = defaultStateImg;
- }
- - (void)setFlag:(UIControlFlagMode)flag withAnimation:(BOOL)animation
- {
- if (animation)
- {
- //no-->yes
- if (_flag == FlagModelNO && flag == FlagModelYES)
- {
- self.yesStateImgV.transform = CGAffineTransformMakeScale(0.1f, 0.1f);
- [UIView animateWithDuration:0.3 animations:^{
- self.noStateImgV.alpha = 0.0;
- self.yesStateImgV.alpha = 1.0;
- self.yesStateImgV.transform = CGAffineTransformMakeScale(1.0f, 1.0f);
- self.noStateImgV.transform = CGAffineTransformMakeScale(2.0f, 2.0f);
- }
- completion:^(BOOL finished)
- {
- self.yesStateImgV.transform = CGAffineTransformMakeScale(1.0f, 1.0f);
- self.noStateImgV.transform = CGAffineTransformMakeScale(1.0f, 1.0f);
- }];
- }
- //yes-->no
- else if(_flag == FlagModelYES && flag == FlagModelNO)
- {
- self.noStateImgV.transform = CGAffineTransformMakeScale(0.1f, 0.1f);
- [UIView animateWithDuration:0.3 animations:^{
- self.noStateImgV.alpha = 1.0;
- self.yesStateImgV.alpha = 0.0;
- self.yesStateImgV.transform = CGAffineTransformMakeScale(2.0f, 2.0f);
- self.noStateImgV.transform = CGAffineTransformMakeScale(1.0f, 1.0f);
- }
- completion:^(BOOL finished)
- {
- self.yesStateImgV.transform = CGAffineTransformMakeScale(1.0f, 1.0f);
- self.noStateImgV.transform = CGAffineTransformMakeScale(1.0f, 1.0f);
- }];
- }
- }
- else
- {
- //no-->yes
- if (_flag == FlagModelNO && flag == FlagModelYES)
- {
- self.noStateImgV.alpha = 0.0;
- self.yesStateImgV.alpha = 1.0;
- self.yesStateImgV.transform = CGAffineTransformMakeScale(1.0f, 1.0f);
- self.noStateImgV.transform = CGAffineTransformMakeScale(1.0f, 1.0f);
- }
- //yes-->no
- else if(_flag == FlagModelYES && flag == FlagModelNO)
- {
- self.noStateImgV.alpha = 1.0;
- self.yesStateImgV.alpha = 0.0;
- self.yesStateImgV.transform = CGAffineTransformMakeScale(1.0f, 1.0f);
- self.noStateImgV.transform = CGAffineTransformMakeScale(1.0f, 1.0f);
- }
- }
- _flag = flag;
- }
- @end
这是一个简单的实现,最大的优势,也是这篇文章的目的,就是在切换效果上的自定义和自由度!
抛砖引玉,希望大家都能做出复合自己心中所想的点赞按钮!
UIControl的使用的更多相关文章
- 你真的了解UIControl吗?
一:首先查看一下关于UIControl的定义 NS_CLASS_AVAILABLE_IOS(2_0) @interface UIControl : UIView //控件默认是启用的YES.是否要禁用 ...
- iOS UIControl 详解
UIControl是UIView的子类,当然也是UIResponder的子类.UIControl是诸如UIButton,UISwitch,UItextField等控件的父类,它本身包含了一些属性和方法 ...
- iOS学习24之UIControl及其子类
1. UIControl初识 1> 概述 UIControl是有控制功能的视图( 如UIButton.UISlider.UISegmentedControl等)的父类 只要跟控制有关的控件都是继 ...
- IOS开发UI基础UIControl事件
UIControl事件1.UIControlEventTouchDown单点触摸按下事件:用户点触屏幕,或者又有新手指落下的时候. 2.UIControlEventTouchDownRepeat多点触 ...
- iOS - UIControl
前言 NS_CLASS_AVAILABLE_IOS(2_0) @interface UIControl : UIView @available(iOS 2.0, *) public class UIC ...
- iOS学习之UIControl
一.UIControl初识 1.UIControl是有控制功能的视图(比如UIButton.UISlider.UISegmentedControl等)的父类. 只要跟控制有关的控件都是继承于 ...
- iOS开发~视图(UIView)与控件(UIControl)
1.UIView类 1.什么是视图 看得见的都是视图 2.什么是控件 一种特殊的视图,都是UIControl的子类,不仅具有一定的显示外观,还能响应高级事件,与用户交互.严格意义上UILabel不是控 ...
- MATLAB中为控件(uicontrol)绑定Callback函数(回调函数)
笔者走了许多弯路,终于找到这个方法,分享给大家. 'callback',@(~,~)colormapeditor(h) 如果版本老不支持“~”这种写法,那就改成: 'callback',@(x,y)c ...
- ##DAY5 UIControl及其子类
##DAY5 UIControl及其子类 #pragma mark ———————UIControl——————————— UIControl初识: 1)UIControl是有控制功能的视图(比如UI ...
随机推荐
- 如何使用java调用DLL运行C++(初篇)
JNI:Java Native Interface,简称JNI,是Java平台的一部分,可用于让Java和其他语言编写的代码进行交互. 下面是从网上摘取的JNI工作示意图:
- javaSE基础之基本细节注解
1. 对于多行注释而言,不能进行嵌套注释.....! /* dada /* d adasdas */ */ 只是不被允许的.... 2.对于记事本编程......如果竹类是公有类,则必须保证类名和为 ...
- Android MotionEvent事件响应机制
在android中,事件主要包括点击.长按.拖曳.滑动等操作,这些构成了Android的事件响应,总体来说,所有的事件都由如下三个部分作为基础构成: 按下(action_down),移动(action ...
- 《JavaScript权威指南》读书笔记(四)
日期:2015-12-06 事件传播:1.捕捉阶段2.运行阶段3.起泡阶段cookie和客户端持久性::HTML5引入了web应用缓存.LocalStorage.SessionStorage:使用XM ...
- JSON Viewer
http://jsonviewer.codeplex.com/ jsoneditor https://github.com/josdejong/jsoneditor
- webform工程中aspx页面为何不能调用appcode文件夹下的类(ASP.NET特殊文件夹的用法)
App_code 只有website类型的工程才有效. App_Code 下创建的.cs文件仅仅是“内容”不是代码.你设置那个文件为“编译”就行了. 其他特殊文件夹 1. Bin文件夹 Bin文件夹包 ...
- Objective-C:模拟按钮点击事件理解代理模式
OC中的协议(Protocol)和和.NET中的接口(Interface)类似,简单来讲,就是一系列方法的列表,其中声明的方法可以被任何类实现.不同的是,在.NET中,如果某个类实现了一个接口,就必须 ...
- struts2视频学习笔记 11-12(动态方法调用,接收请求参数)
课时11 动态方法调用 如果Action中存在多个方法时,可以使用!+方法名调用指定方法.(不推荐使用) public String execute(){ setMsg("execute&q ...
- [转]连续创建多个Oracle触发器失败,单个创建才成功的解决方法
连续创建多个Oracle触发器失败,单个创建才成功的解决方法 1.当我连续执行创建多个触发器时,总是报编译通过,但存在警告或错误.如下: create or replace trigger t ...
- ASP.NET-遇到的错误汇总
错误:“未在本地计算机上注册“Microsoft.Jet.OLEDB.4.0”提供程序.” 在win7 64未上,读取Excel中的数据时报的错误, 解决方法:在生成"配置管理器中" ...