首页 > 代码库 > 解析UIControl

解析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 >= 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:)