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 ...
随机推荐
- js对字符串函数之charAt()
var str="012345"; 字符串下标的index从0开始: charAt(index)返回指定位置的字符如果index不在0-str.length之间,返回一个空字符串: ...
- arguments的基本用法
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 第二周 SCRUM站立会议
站立会议是成员间每个人面对面站立着说出自己的进展,不是会议,不是写报告.是为了更好的沟通和协调,本质上是为了工程方面的团队交流. scrum站立会议的要求如下: 1.成员间都是平等的,发言没有经理和程 ...
- ThinkPHP框架如何修改X-Powered-By
以前用ThinkPHP框架开发了一个小网站,前几天查询页面HTTP状态发现,里面有一项: X-Powered-By: ThinkPHP 2.0 这样虽然没什么,但感觉如果别有用心的人查询会知道你是用这 ...
- poj----(1470)Closest Common Ancestors(LCA)
Closest Common Ancestors Time Limit: 2000MS Memory Limit: 10000K Total Submissions: 15446 Accept ...
- 转载 浅谈C/C++中的static和extern关键字
浅谈C/C++中的static和extern关键字 2011-04-21 16:57 海子 博客园 字号:T | T static是C++中常用的修饰符,它被用来控制变量的存贮方式和可见性.ext ...
- Ubuntu 设置su密码
如果之前安装时没有设置root密码,可以如下设置: 命令窗口中输入:sudo passwd [sudo] password for 用户名: 这里输入你sudo 的密码输入新的 UNIX 密码: 重 ...
- 为什么要使用 F#?
对于小部分 .NET 程序员来说,学习一门 .NET Framework 函数化语言无疑将使自己在编写功能强大软件方面前进一大步.而对其他程序员来说,学习 F# 的理由就因人而异了.F# 能为开发 ...
- 计算excel列的名字
#include <iostream> using namespace std; int main() { unsigned int column; cin>> ...
- POJ 2632 Crashing Robots 模拟 难度:0
http://poj.org/problem?id=2632 #include<cstdio> #include <cstring> #include <algorith ...