解析UIControl
解析UIControl

从下图可以看出,UIControl继承自UIView,添加了响应事件功能.

UIButton之所以能响应各种各样的事件是因为继承自UIControl

使用UIControl可以精确的控制按钮事件,我用定制UIControlEventValueChanged来进行说明.
YXControl.h + YXControl.m
//
// YXControl.h
// UIControl
//
// Copyright (c) 2014年 Y.X. All rights reserved.
// #import <UIKit/UIKit.h> @interface YXControl : UIControl @property (nonatomic, strong) UIImage *yesImage;
@property (nonatomic, strong) UIImage *noImage; - (void)exchange; @end
//
// YXControl.m
// UIControl
//
// Copyright (c) 2014年 Y.X. All rights reserved.
// #import "YXControl.h" @interface YXControl () @property (nonatomic, strong) UIImageView *YesImageView;
@property (nonatomic, strong) UIImageView *NoImageView; @end @implementation YXControl #pragma mark - 重写 getter setter 方法
@synthesize yesImage = _yesImage;
@synthesize noImage = _noImage; - (UIImage *)yesImage
{
return _yesImage;
} - (void)setYesImage:(UIImage *)yesImage
{
_yesImage = yesImage;
_YesImageView.image = yesImage;
} - (UIImage *)noImage
{
return _noImage;
} - (void)setNoImage:(UIImage *)noImage
{
_noImage = noImage;
_NoImageView.image = noImage;
} #pragma mark - 初始化
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self)
{
_YesImageView = [[UIImageView alloc] initWithFrame:frame];
_NoImageView = [[UIImageView alloc] initWithFrame:frame]; [self addSubview:_YesImageView];
[self addSubview:_NoImageView];
}
return self;
} #pragma mark - UIControl事件
- (BOOL)beginTrackingWithTouch:(UITouch *)touch withEvent:(UIEvent *)event
{
// 获取触摸点坐标
CGPoint p = [touch locationInView:self];
NSLog(@"begin %@", NSStringFromCGPoint(p)); return YES;
} - (BOOL)continueTrackingWithTouch:(UITouch *)touch withEvent:(UIEvent *)event
{
// 获取触摸点坐标
CGPoint p = [touch locationInView:self];
NSLog(@"continue %@", NSStringFromCGPoint(p)); return YES;
} - (void)endTrackingWithTouch:(UITouch *)touch withEvent:(UIEvent *)event
{
// 获取触摸点坐标
CGPoint p = [touch locationInView:self];
NSLog(@"end %@", NSStringFromCGPoint(p)); // 判断触摸点是否超出了这个view的范围
if (p.x >= && p.x <= self.bounds.size.width &&
p.y >= && p.y <= self.bounds.size.height)
{
// 发送事件
[self sendActionsForControlEvents:UIControlEventValueChanged];
}
} - (void)cancelTrackingWithEvent:(UIEvent *)event
{ } - (void)exchange
{
[self bringSubviewToFront:self.subviews[]];
} @end
用于测试用的图片

结果如图下图所示:

//
// RootViewController.m
// UIControl
//
// Copyright (c) 2014年 Y.X. All rights reserved.
// #import "RootViewController.h"
#import "YXControl.h" @interface RootViewController () @end @implementation RootViewController - (void)viewDidLoad
{
[super viewDidLoad]; // 初始化UIControl
YXControl *controlView = [[YXControl alloc] initWithFrame:CGRectMake(, , , )];
controlView.backgroundColor = [UIColor blackColor];
controlView.center = self.view.center;
controlView.yesImage = [UIImage imageNamed:@"yes"];
controlView.noImage = [UIImage imageNamed:@"no"];
[self.view addSubview:controlView]; // 添加响应事件
[controlView addTarget:self
action:@selector(controlEvent:)
forControlEvents:UIControlEventValueChanged];
} - (void)controlEvent:(YXControl *)control
{
[control exchange];
} @end
以下三个方法非常重要:
beginTrackingWithTouch: 触摸事件刚刚开始时执行(1次)
continueTrackingWithTouch: 滑动手指后将会一直执行(多次)
endTrackingWithTouch: 松开手指后执行(1次)
以下两个地方也是需要注意的哦:
1. 发送UIControlEventValueChanged事件

2. 注册对应的UIControlEventValueChanged事件

只有这样子,两者之间才能通过addTarget:action:forControlEvents:联系起来.
以下这个小细节也是非常令人意外的,UIControlEventValueChanged这个值是非常独特的呢.

如果使用UIControlEventTouchUpInside,这个事件是UIControl自动发的,不需要你管哦(也就是说不需要你执行sendActionsForControlEvents:)

解析UIControl的更多相关文章
- 【原】iOS触摸事件深度解析
概述 本文主要解析从我们的手指触摸苹果设备到最终响应事件的整个处理机制.本质上讲,整个过程可以分为两个步骤: 步骤1:找目标.在iOS视图层次结构中找到触摸事件的最终接受者: 步骤2:事件响应.基于i ...
- 解析iOS开发中的FirstResponder第一响应对象
1. UIResonder 对于C#里所有的控件(例如TextBox),都继承于Control类.而Control类的继承关系如下: 代码如下: System.Object System.Marsha ...
- iOS触摸事件深度解析-备用
概述 本文主要解析从我们的手指触摸苹果设备到最终响应事件的整个处理机制.本质上讲,整个过程可以分为两个步骤: 步骤1:找目标.在iOS视图层次结构中找到触摸事件的最终接受者: 步骤2:事件响应.基于i ...
- UIButton 解析
IOS之按钮控件--Button全解析及使用 转载自:forget IOS开发中伴随我们始终的 最常用的几个空间之一 -- UIButton 按钮,对于button今天在此做一些浅析,并介绍下主流用 ...
- 烈焰遮天 cocos 手游mmo 源码 解析
引擎: cocos2.x 代码: c++ 混合 lua 游戏类型: mmo 工程结构: game : 游戏启动地方 gamelogic:接sdk相关,登陆支付统计等 libFramework:主要本游 ...
- iOS-UITextField 全面解析
iOS中UITextField 使用全面解析 建议收藏,用到的时候来这里一查就都明白了 //初始化textfield并设置位置及大小 UITextField *text = [[UITextField ...
- 【原】Android热更新开源项目Tinker源码解析系列之三:so热更新
本系列将从以下三个方面对Tinker进行源码解析: Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Android热更新开源项目Tinker源码解析系列之二:资源文件热更新 A ...
- .NET Core中的认证管理解析
.NET Core中的认证管理解析 0x00 问题来源 在新建.NET Core的Web项目时选择“使用个人用户账户”就可以创建一个带有用户和权限管理的项目,已经准备好了用户注册.登录等很多页面,也可 ...
- Html Agility Pack 解析Html
Hello 好久不见 哈哈,今天给大家分享一个解析Html的类库 Html Agility Pack.这个适用于想获取某网页里面的部分内容.今天就拿我的Csdn的博客列表来举例. 打开页面 用Fir ...
随机推荐
- InterView之PHP
PHP HTTP Keep-Alive的作用 作用 Keep-Alive:使客户端到服务器端的连接持续有效,当出现对服务器的后继请求时,Keep-Alive功能避免了建立或者重新建立连接.Web服务器 ...
- mysql数据库数据监测
#!/bin/bash MYSQL="mysql -h10.10.10.10 -P8036 -uusername -ppassword --default-character-set=utf ...
- Spring Boot 使用Redis
转载自:http://www.cnblogs.com/ityouknow/p/5748830.html Redis支持更丰富的数据结构,例如hashes, lists, sets等,同时支持数据持久化 ...
- 下拉加载dropload.js
使用下拉加载 使用需要引用的css <link rel="stylesheet" href="../dist/dropload.css"> 使用需要 ...
- SpringMVC源码阅读:Controller中参数解析
1.前言 SpringMVC是目前J2EE平台的主流Web框架,不熟悉的园友可以看SpringMVC源码阅读入门,它交代了SpringMVC的基础知识和源码阅读的技巧 本文将通过源码(基于Spring ...
- [转载]Jquery mobiscroll 移动设备(手机)wap日期时间选择插件以及滑动、滚动插件
Jquery Mobiscroll是一个用于触摸设备(Android phones, iPhone, iPad, Galaxy Tab)的日期和时间选择器jQuery插件.以及各种滑动插件 可以让用户 ...
- Java8新特性--流(Stream)
1.简介 Java 8是Java自Java 5(发布于2004年)之后的最重要的版本.这个版本包含语言.编译器.库.工具和JVM等方面的十多个新特性.在本文中我们一起来学习引入的一个新特性- ...
- 师范大学 e: skyscrapers
#include<iostream> #include<stdio.h> #include<cstring> #include<cstdlib> usi ...
- CSS之换行
在项目中,常常遇到一些问题,可以通过CSS来快速解决,比如受到布局影响会导致内容溢出,这个时候就可以使用CSS换行解决 自动换行: { word-wrap:break-word; } 强制不换行: { ...
- js面向对象设计之class中一些坑和技巧
this的指向 super 类工厂,类中定义方法名时,可以使用字符串,这就可以创建工厂函数(类似模板类) Generator 函数 静态属性和私有属性.私有方法 new.target