博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
解析UIControl
阅读量:6704 次
发布时间:2019-06-25

本文共 3696 字,大约阅读时间需要 12 分钟。

解析UIControl

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

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

使用UIControl可以精确的控制按钮事件,我用定制UIControlEventValueChanged来进行说明.

YXControl.h + YXControl.m

////  YXControl.h//  UIControl////  Copyright (c) 2014年 Y.X. All rights reserved.//#import 
@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:)

转载地址:http://lnzlo.baihongyu.com/

你可能感兴趣的文章
CentOS安装和配置Apache(httpd)
查看>>
华为/H3C Syslog配置
查看>>
23.C++- 继承的多种方式、显示调用父类构造函数、父子之间的同名函数、virtual虚函数...
查看>>
如何查看Isilon的节点的CPU的信息?
查看>>
C# if为false仍然进入方法体,==和qeual结果不一致
查看>>
MongoDB简单使用 —— 驱动
查看>>
WPF——TargetNullValue(如何在绑定空值显示默认字符)
查看>>
给 iOS 开发者的 RxSwift(一)
查看>>
Excel2013 破解(编辑工作表受保护)密码
查看>>
Python基础-变量作用域
查看>>
php课程 6-21 HTML标签相关函数
查看>>
Spring Boot的Tomcat 启动详解
查看>>
Elasticsearch 2.3.3 JAVA api说明文档
查看>>
zTree怎么判断树有节点展开或者完全关闭的
查看>>
如何删除一个标签,但是保留里面的内容?
查看>>
设计模式-行为型模式,python访问者模式
查看>>
命令模式
查看>>
如何自定义长连接策略
查看>>
平衡二叉树与自平衡二叉树(红黑树)的区别
查看>>
读取JPG图片的Exif属性(一) - Exif信息简介
查看>>