自定义可以响应事件的控件(继承自UIControl)

.h

//
//  SHButton.h
//  工具类集成
//
//  Created by 邵瑞波 on 16/2/6.
//  Copyright © 2016年 邵瑞波. All rights reserved.
//

#import <UIKit/UIKit.h>

@interface SHButton : UIControl

@end

.m

//
//  SHButton.m
//  工具类集成
//
//  Created by 邵瑞波 on 16/2/6.
//  Copyright © 2016年 邵瑞波. All rights reserved.
//

#import "SHButton.h"

@implementation SHButton

/*
// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
- (void)drawRect:(CGRect)rect {
    // Drawing code
}
*/

- (void)setSelected:(BOOL)selected {
    [super setSelected:selected];
    NSLog(@"%s", __FUNCTION__);
    
}

// 当用户点击到当前控件bounds时,会调用该方法,返回值决定了当前控件是否响应该事件
- (BOOL)beginTrackingWithTouch:(UITouch *)touch withEvent:(nullable UIEvent *)event {
//    NSLog(@"%s-touch=[%@]-event=[%@]", __FUNCTION__, touch, event);
    NSLog(@"state=[%zd]", self.state);
    return YES;
//    return NO;
//    return [super beginTrackingWithTouch:touch withEvent:event]; // 返回系统默认处理
}

// 如果 beginTrackingWithTouch 返回值 为YES,则以下方法 会在 点击手机屏幕移动 时 调用,如果这里返回值为YES,则继续移动会多次调用。
// 如果 返回 NO,则 即使 继续移动也不会再调用当前方法了。
- (BOOL)continueTrackingWithTouch:(UITouch *)touch withEvent:(nullable UIEvent *)event {
//    NSLog(@"%s-touch=[%@]-event=[%@]", __FUNCTION__, touch, event);
    NSLog(@"state=[%zd]", self.state);
    
    // 这里发送 点击 事件时,外部会调用 对应的事件处理方法
//    [self sendActionsForControlEvents:UIControlEventTouchUpInside];
    
    return YES;
//    return NO;
//    return [super beginTrackingWithTouch:touch withEvent:event];  // 返回系统默认处理
}

// 当点击屏幕释放时,调用该方法
- (void)endTrackingWithTouch:(nullable UITouch *)touch withEvent:(nullable UIEvent *)event {
//    NSLog(@"%s-touch=[%@]-event=[%@]", __FUNCTION__, touch, event);
    NSLog(@"state=[%zd]", self.state);
    [super endTrackingWithTouch:touch withEvent:event];  // 系统默认处理
}

// 取消时会调用,如果当前视图被移除。或者来电
- (void)cancelTrackingWithEvent:(nullable UIEvent *)event {
//    NSLog(@"%s-event=[%@]", __FUNCTION__, event);
    NSLog(@"state=[%zd]", self.state);
    [super cancelTrackingWithEvent:event];  // 系统默认处理
}

@end

控制器 .m

//
//  SHPlayerViewController.m
//  工具类集成
//
//  Created by 邵瑞波 on 16/2/6.
//  Copyright © 2016年 邵瑞波. All rights reserved.
//

#import "SHPlayerViewController.h"
#import <MediaPlayer/MediaPlayer.h>
#import "SHButton.h"

@interface SHPlayerViewController ()
@property (nonatomic, strong)  MPMoviePlayerViewController *moviePlayerVC; // 视屏播放控制器
@property (nonatomic, weak) SHButton *button; // 按钮
@end

@implementation SHPlayerViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    self.view.backgroundColor = [UIColor cyanColor];
    
    SHButton *btn = [[SHButton alloc] initWithFrame:CGRectMake(10, 250, 50, 20)];
    
    btn.backgroundColor = [UIColor redColor];
    
    _button = btn;
    [btn addTarget:self action:@selector(btnClick:) forControlEvents:UIControlEventTouchUpInside];
    
    [self.view addSubview:btn];
}

- (void)btnClick:(SHButton *)sender {
    
    NSLog(@"btnClick = [%@]", sender);
}



/*
#pragma mark - Navigation

// In a storyboard-based application, you will often want to do a little preparation before navigation
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    // Get the new view controller using [segue destinationViewController].
    // Pass the selected object to the new view controller.
}
*/

@end

说明:

    其实可以根据逻辑需要,在适当的时候 主动发送 事件响应。这样会触发外部 addTarget 时对应所发事件类型的方法。


你可能感兴趣的:(ios,uicontrol,自定义响应事件控件)