首页 > 代码库 > 解析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:)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。