用UIControl封装Button

简介:

用UIControl封装Button

 

效果

 

说明

UIControl在处理超出触摸范围的触摸事件时有bug

 

源码

基础类


//
//  BaseControl.h
//  BaseControl
//
//  Created by YouXianMing on 15/8/26.
//  Copyright (c) 2015年 YouXianMing. All rights reserved.
//

#import <UIKit/UIKit.h>

@interface BaseControl : UIControl

/**
 *  ==== 由子类重写 ====
 *
 *  开始触发事件
 */
- (void)beginTouch;

/**
 *  ==== 由子类重写 ====
 *
 *  结束触发事件
 *
 *  @param outRange 是否超出操作范围
 */
- (void)endTouchOutOfRange:(BOOL)outRange;

@end


//
//  BaseControl.m
//  BaseControl
//
//  Created by YouXianMing on 15/8/26.
//  Copyright (c) 2015年 YouXianMing. All rights reserved.
//

#import "BaseControl.h"

@interface BaseControl ()

@property (nonatomic) CGPoint  endPoint;

@end

@implementation BaseControl

#pragma mark - 
- (void)beginTouch {

}

- (void)endTouchOutOfRange:(BOOL)outRange {

}

#pragma mark - UIControl事件
- (BOOL)beginTrackingWithTouch:(UITouch *)touch withEvent:(UIEvent *)event {
    
    [self beginTouch];
    
    return YES;
}

- (BOOL)continueTrackingWithTouch:(UITouch *)touch withEvent:(UIEvent *)event {
    
    return YES;
}

- (void)endTrackingWithTouch:(UITouch *)touch withEvent:(UIEvent *)event {
    
    self.endPoint = [touch locationInView:self];
}

- (void)cancelTrackingWithEvent:(UIEvent *)event {
    
    [super cancelTrackingWithEvent:event];
}

- (void)sendAction:(SEL)action to:(id)target forEvent:(UIEvent *)event {
    
    CGPoint point = self.endPoint;
    if (point.x >= 0 && point.x <= self.bounds.size.width && point.y >= 0 && point.y <= self.bounds.size.height) {

        [self endTouchOutOfRange:NO];
        [super sendAction:action to:target forEvent:event];
        
    } else {
    
        [self endTouchOutOfRange:YES];
        [super sendAction:action to:target forEvent:event];
    }
}

@end


//
//  ColorButton.h
//  BaseControl
//
//  Created by YouXianMing on 15/8/26.
//  Copyright (c) 2015年 YouXianMing. All rights reserved.
//

#import "BaseControl.h"

@interface ColorButton : BaseControl

@end


//
//  ColorButton.m
//  BaseControl
//
//  Created by YouXianMing on 15/8/26.
//  Copyright (c) 2015年 YouXianMing. All rights reserved.
//

#import "ColorButton.h"

@implementation ColorButton

- (void)beginTouch {

    [UIView animateWithDuration:0.4f delay:0.f usingSpringWithDamping:1.f initialSpringVelocity:0.f options:0 animations:^{
        
        self.backgroundColor = [UIColor redColor];
        
    } completion:^(BOOL finished) {
        
    }];
}

- (void)endTouchOutOfRange:(BOOL)outRange {

    [UIView animateWithDuration:0.4f delay:0.f usingSpringWithDamping:1.f initialSpringVelocity:0.f options:0 animations:^{
        
        self.backgroundColor = [UIColor whiteColor];
        
    } completion:^(BOOL finished) {
        
    }];
}

@end


//
//  ViewController.m
//  BaseControl
//
//  Created by YouXianMing on 15/8/26.
//  Copyright (c) 2015年 YouXianMing. All rights reserved.
//

#import "ViewController.h"
#import "ColorButton.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    
    [super viewDidLoad];

    ColorButton *control      = [[ColorButton alloc] initWithFrame:CGRectMake(0, 0, 100, 100)];
    control.center            = self.view.center;
    control.layer.borderWidth = 1.f;
    [self.view addSubview:control];
    
    [control addTarget:self action:@selector(buttonEvent:) forControlEvents:UIControlEventTouchUpInside];
}

- (void)buttonEvent:(id)sender {

}

@end

细节


目录
相关文章
|
2月前
|
设计模式 JavaScript 前端开发
addEventlistener和正常的onclick=()=> 的区别
【10月更文挑战第29天】`addEventListener` 是一种更推荐的添加事件处理函数的方式,它提供了更好的灵活性、可维护性和代码结构,能够满足复杂的事件处理需求,而 `onclick` 属性则更适合简单的、一次性的事件绑定场景,且在现代的JavaScript开发中,应尽量避免在HTML中直接使用 `onclick` 属性,以提高代码的质量和可维护性。
|
7月前
|
iOS开发 UED 开发者
UIControl 功能和用法
UIControl 功能和用法
|
存储 C++ 开发者
QListWidget和QListView的使用和item点击事件
QListWidget和QListView的使用和item点击事件
|
前端开发 JavaScript 开发者
Element scrollbar 使用封装
最近进行 Element UI 组件封装,在之前的项目中经常用到 el-scrollbar这个内置组件,这次单独封装时遇到点写法上的小问题,做个记录和分享,希望能帮到相关的开发者。
196 0
Element scrollbar 使用封装
|
数据可视化
UGUI系列-Button绑定事件的多种实现
今天分享一下UGUI Button绑定事件的几种方法,以及优点和缺点 有哪些地方不懂的小伙伴也可以联系我的QQ,我的QQ就在博客链接中隐藏着,看能不能找到咯
|
内存技术 数据格式 XML