解析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 >= 0 && p.x <= self.bounds.size.width &&
        p.y >= 0 && p.y <= self.bounds.size.height)
    {
        // 发送事件
        [self sendActionsForControlEvents:UIControlEventValueChanged];
    }
}

- (void)cancelTrackingWithEvent:(UIEvent *)event
{

}

- (void)exchange
{
    [self bringSubviewToFront:self.subviews[0]];
}

@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(0, 0, 100, 100)];
    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

时间: 2024-11-05 19:34:09

解析UIControl的相关文章

UIButton 解析

IOS之按钮控件--Button全解析及使用 转载自:forget IOS开发中伴随我们始终的 最常用的几个空间之一 -- UIButton 按钮,对于button今天在此做一些浅析,并介绍下主流用法以及常见问题解决办法. 首先是继承问题,UIButton继承于UIControl,而UIControl继承于UIView. 那么UIButton自然继承了UIView的属性.比如frame,layer等 至于UIButton的创建 UIButton *button = [UIButton butto

UI第六讲.UISegmentControl的使用,UISliser的使用,UIImageView的使用,UIControl的作用

一.UISegmentedControl的使用(分段控件) UISegmentedControl是iOS中的分段控件. 每个segment都能被点击,相当于集成了若干个button.通常我们会点击不同的segment来切换不同的view. 示例图: 常用方法: 示例代码: 基本的UISegmentControl的用法,同时通过其addtarget/action方法实点击切换view背景色的效果 效果图:点击UISegmentControl的item,切换背景色 二.UISlider的使用(滑块控

iOS触摸事件深度解析-备用

概述 本文主要解析从我们的手指触摸苹果设备到最终响应事件的整个处理机制.本质上讲,整个过程可以分为两个步骤: 步骤1:找目标.在iOS视图层次结构中找到触摸事件的最终接受者: 步骤2:事件响应.基于iOS响应者链(Responder Chain)处理触摸事件 找目标 在找目标阶段所使用到的两大利器是UIView的 hitTest:withEvent: 以及 pointInside:withEvent: 方法.找目标的过程也称为hit-Testing.先来看一张图(注: 图来自MJ)比较直观: 下

[转]iOS中UITextField 使用全面解析

001//初始化textfield并设置位置及大小002  UITextField *text = [[UITextField alloc]initWithFrame:CGRectMake(20, 20, 130, 30)];003  004//设置边框样式,只有设置了才会显示边框样式 005  text.borderStyle = UITextBorderStyleRoundedRect;006 typedef enum {007    UITextBorderStyleNone,008   

iOS-UITextField 全面解析

iOS中UITextField 使用全面解析 建议收藏,用到的时候来这里一查就都明白了 //初始化textfield并设置位置及大小 UITextField *text = [[UITextField alloc]initWithFrame:CGRectMake(20, 20, 130, 30)]; //设置边框样式,只有设置了才会显示边框样式 text.borderStyle = UITextBorderStyleRoundedRect; typedef NS_ENUM(NSInteger,

烈焰遮天 cocos 手游mmo 源码 解析

引擎: cocos2.x 代码: c++ 混合 lua 游戏类型: mmo 工程结构: game : 游戏启动地方 gamelogic:接sdk相关,登陆支付统计等 libFramework:主要本游戏相关c++库 uicontrol: zpack:一个开源的打包文件工具 ----------------------------------------------------------------------------------------- 分析libFramework: base目录

【原】iOS触摸事件深度解析

概述 本文主要解析从我们的手指触摸苹果设备到最终响应事件的整个处理机制.本质上讲,整个过程可以分为两个步骤: 步骤1:找目标.在iOS视图层次结构中找到触摸事件的最终接受者: 步骤2:事件响应.基于iOS响应者链(Responder Chain)处理触摸事件 找目标 在找目标阶段所使用到的两大利器是UIView的 hitTest:withEvent: 以及 pointInside:withEvent: 方法.找目标的过程也称为hit-Testing.先来看一张图(注: 图来自MJ)比较直观: 下

C++工程编译之“error LNK2001: 无法解析的外部符号”

今天一整天都在折腾“error LNK2001: 无法解析的外部符号”,就在头疼不已的时候,总算是找到问题原因了:各个动态链接库的编译方式必须统一才行,要不然很容易对库函数的引用产生冲突.简单来说就是,如果使用的第三方函数库编译方式采用/MD,那么主工程也应该使用/MD.我使用了libevent,而主工程默认采用/MT,所以需要忽略一大堆的函数库,我还纳闷呢,怎么会这么奇怪!!今天总算是解决了长久以来的困惑了. 下面引用一篇文章的描述:[Z]VC运行库版本不同导致链接.LIB静态库时发生重复定义

防止恶意解析——禁止通过IP直接访问网站

一.什么是恶意解析 一般情况下,要使域名能访问到网站需要两步,第一步,将域名解析到网站所在的主机,第二步,在web服务器中将域名与相应的网站绑定.但是,如果通过主机IP能直接访问某网站,那么把域名解析到这个IP也将能访问到该网站,而无需在主机上绑定,也就是说任何人将任何域名解析到这个IP就能访问到这个网站.可能您并不介意通过别人的域名访问到您的网站,但是如果这个域名是未备案域名呢?一旦被查出,封IP.拔线甚至罚款的后果都是需要您来承担的.某些别有用心的人,通过将未备案域名解析到别人的主机上,使其