UIControl 是继承与 UIView的。而 UIView继承与UIResponder的。然后 UIResponder 继承与 NSObject的。图形解释如下:
// ZSJButton.h
// 基础(一)
// Created by 周双建 on 16/4/5.
// Copyright © 2016年 周双建. All rights reserved.
#import
@interface ZSJButton : UIControl{
@public
//标题
UILabel * ZSJButtonTitle;
//图片
UIImageView * ZSJButtonImageView;
}
@end
// ZSJButton.m
// 基础(一)
// Created by 周双建 on 16/4/5.
// Copyright © 2016年 周双建. All rights reserved.
#import "ZSJButton.h"
@implementation ZSJButton
-(instancetype)initWithFrame:(CGRect)frame{
if (self == [super initWithFrame:frame]) {
self.backgroundColor = [[UIColor whiteColor]colorWithAlphaComponent:1.0f];
self.layer.borderWidth = 0.5f;
self.layer.borderColor = [[UIColor lightGrayColor] CGColor];
self->ZSJButtonTitle = [[UILabel alloc]initWithFrame:CGRectMake(4.0f, 4.0f, frame.size.width-8.0f, frame.size.height - 8.0f)];
self->ZSJButtonTitle.text = @"ZSJButton";
self->ZSJButtonTitle.textColor = [[UIColor blackColor] colorWithAlphaComponent:1.0f];
self->ZSJButtonTitle.font = [UIFont systemFontOfSize:20.0f];
self->ZSJButtonTitle.textAlignment = NSTextAlignmentCenter;
[self addSubview:self->ZSJButtonTitle];
}
return self;
}
// 这是开始启用跟踪事件
-(BOOL)beginTrackingWithTouch:(UITouch *)touch withEvent:(UIEvent *)event{
if (touch.timestamp == 2.0f) {
// 设置点击多长时间,才触发事件
}
if (touch.tapCount == 3) {
// 设置点击的次数,连续点击
}
return [super beginTrackingWithTouch:touch withEvent:event];
}
// 这个是当控件被点击后并在空间上移动,所调用的方法(只要你点击,不放手一直移动,它就会一直调用这个方法,哪怕已经移除控件的大小。)
-(BOOL) continueTrackingWithTouch:(UITouch *)touch withEvent:(UIEvent *)event{
/*
* CGRectInset
* CGRectInset(<#CGRect rect#>, <#CGFloat dx#>, <#CGFloat dy#>)
* 该结构体的应用是以原rect为中心,再参考dx,dy,进行缩放或者放大。
*/
CGRect InRect = CGRectInset(self.bounds, -30.f, -30.f);
/*
* CGRectContainsPoint
* CGRectContainsPoint(<#CGRect rect#>, <#CGPoint point#>)
* 判断给定的点是否被一个CGRect包含
*/
BOOL InView = !CGRectContainsPoint(InRect, [touch locationInView:self]);
if (InView) {
/*
* previousLocationInView
* 该方法记录了前一个坐标值,函数返回也是一个CGPoint类型的值
*/
BOOL OutView = CGRectContainsPoint(InRect, [touch previousLocationInView:self]);
if (OutView) {
[self sendAction:@selector(Tap:withEvent:) to:self forEvent:event];
// you can write your code.(Condition or special function)
}else{
NSLog(@"我已经远离控件了");
// 传递所有的事件
[self sendActionsForControlEvents:event];
// you can write your code.(Condition or special function)
}
}
return [super continueTrackingWithTouch:touch withEvent:event];
}
-(void)Tap:(id)mytap withEvent:(UIEvent*)event{
NSLog(@"我被移动30px出去了");
}
// 这是跟踪事件的结束的时候,调用的方法
-(void)endTrackingWithTouch:(UITouch *)touch withEvent:(UIEvent *)event{
/*
* 事件的类型
typedef NS_ENUM(NSInteger, UIEventType) {
* 手指事件
UIEventTypeTouches,
* 摇动手势
UIEventTypeMotion,
* 远程事件
UIEventTypeRemoteControl,
* 按压事件
UIEventTypePresses NS_ENUM_AVAILABLE_IOS(9_0),
};
*/
switch (event.type) {
case UIEventTypeTouches:
{
//your codes
}
break;
case UIEventTypeMotion:
{
//your codes
}
break;
case UIEventTypeRemoteControl:
{
//your codes
}
break;
case UIEventTypePresses:
{
//your codes
}
break;
default:
break;
}
// 这里可以处理远程事件
switch (event.subtype) {
/*
typedef NS_ENUM(NSInteger, UIEventSubtype) {
// 不包含任何子事件类型
UIEventSubtypeNone = 0,
// 摇晃事件(从iOS3.0开始支持此事件)
UIEventSubtypeMotionShake = 1,
//远程控制子事件类型(从iOS4.0开始支持远程控制事件)
//播放事件【操作:停止状态下,按耳机线控中间按钮一下】
UIEventSubtypeRemoteControlPlay = 100,
//暂停事件
UIEventSubtypeRemoteControlPause = 101,
//停止事件
UIEventSubtypeRemoteControlStop = 102,
//播放或暂停切换【操作:播放或暂停状态下,按耳机线控中间按钮一下】
UIEventSubtypeRemoteControlTogglePlayPause = 103,
//下一曲【操作:按耳机线控中间按钮两下】
UIEventSubtypeRemoteControlNextTrack = 104,
//上一曲【操作:按耳机线控中间按钮三下】
UIEventSubtypeRemoteControlPreviousTrack = 105,
//快退开始【操作:按耳机线控中间按钮三下不要松开】
UIEventSubtypeRemoteControlBeginSeekingBackward = 106,
//快退停止【操作:按耳机线控中间按钮三下到了快退的位置松开】
UIEventSubtypeRemoteControlEndSeekingBackward = 107,
//快进开始【操作:按耳机线控中间按钮两下不要松开】
UIEventSubtypeRemoteControlBeginSeekingForward = 108,
//快进停止【操作:按耳机线控中间按钮两下到了快进的位置松开】
UIEventSubtypeRemoteControlEndSeekingForward = 109,
};
*/
case UIEventSubtypeNone:
{
// your codes
}
break;
case UIEventSubtypeMotionShake:
{
// your codes
}
break;
case UIEventSubtypeRemoteControlPlay:
{
// your codes
}
break;
case UIEventSubtypeRemoteControlPause:
{
// your codes
}
break;
case UIEventSubtypeRemoteControlStop:
{
// your codes
}
break;
case UIEventSubtypeRemoteControlTogglePlayPause:
{
// your codes
}
break;
case UIEventSubtypeRemoteControlNextTrack:
{
// your codes
}
break;
case UIEventSubtypeRemoteControlPreviousTrack:
{
// your codes
}
break;
case UIEventSubtypeRemoteControlBeginSeekingBackward:
{
// your codes
}
break;
case UIEventSubtypeRemoteControlEndSeekingBackward:
{
// your codes
}
case UIEventSubtypeRemoteControlBeginSeekingForward:
{
// your codes
}
case UIEventSubtypeRemoteControlEndSeekingForward:
{
// your codes
}
break;
default:
break;
}
}
/*
// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
- (void)drawRect:(CGRect)rect {
// Drawing code
}
*/
@end
// ViewController.m
// 基础(一)
// Created by 周双建 on 16/4/5.
// Copyright © 2016年 周双建. All rights reserved.
#import "ViewController.h"
#import "ZSJButton.h"
@interface ViewController ()
@property(nonatomic,assign) ZSJButton * MyBtn;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
ZSJButton * Btn = [[ZSJButton alloc]initWithFrame:CGRectMake(100, 100, 100, 50)];
_MyBtn = Btn;
// enabled 是控制控件是否可用或者从新绘制等,默认是 YES
Btn.enabled = YES;
// 获取控件是否可用的状态,只读特性
NSLog(@" 按钮的状态:%d",Btn.isEnabled);
// selected 是设置控件的选中或者不选中
Btn.selected = YES;
//这是控件是否进行事件的跟踪
// 这是 UIControl方法 给控件添加点击方法
[Btn addTarget:self action:@selector(ButClick:) forControlEvents:UIControlEventTouchUpInside];
[Btn addTarget:self action:@selector(ButClick1:) forControlEvents:UIControlEventTouchUpInside];
[Btn addTarget:self action:@selector(ButClick2) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:Btn];
// 获取控件上所有的 Target
NSLog(@"AA:%@",[Btn allTargets]);
// 获取 指定 tager 上的 所有同一类事件的所有方法
/*
2016-04-05 14:40:01.470 基础(一)[3622:266503] BB:(
"ButClick:",
"ButClick1:",
ButClick2
)
从输出的结果看出。方法的写法不同,输出的结果也是不同的。
*/
NSLog(@"BB:%@",[Btn actionsForTarget:self forControlEvent:UIControlEventTouchUpInside]);
// Do any additional setup after loading the view, typically from a nib.
}
-(void)ButClick:(UIButton*)Btn{
_MyBtn->ZSJButtonTitle.text = @"Tap_One";
_MyBtn.highlighted = YES;
// 这个方法是移除,添加的一些方法
[_MyBtn removeTarget:self action:@selector(ButClick:) forControlEvents:UIControlEventTouchUpInside];
NSLog(@" 按钮是否开启跟踪状态:%d",Btn.isTracking);
}
-(void)cancelTrackingWithEvent:(UIEvent *)event{
}
-(void)ButClick1:(id) temp{
}
-(void)ButClick2{
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end