用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

细节

时间: 2024-08-30 21:45:38

用UIControl封装Button的相关文章

IOS开发之自定义Button(集成三种回调模式)

前面在做东西的时候都用到了storyboard,在今天的代码中就纯手写代码自己用封装个Button.这个Button继承于UIView类,在封装的时候用上啦OC中的三种回调模式:目标动作回调,委托回调,Block回调.具体的内容请参考之前的博客:"Objective-C中的Block回调模式","Target-Action回调模式","Objective-C中的委托(代理)模式".在接下来要封装的button中将要用到上面的知识点.之前在做新浪微

c#封装jmail的pop3收邮件

jmail|封装|收邮件 *w3 JMail v4.4 Professional 的获取请自行 google!或参阅 http://community.csdn.net/Expert/TopicView.asp?id=3739405w3 JMail v4.4 Professional 是一个 COM 的组件,我用 C# 把其 POP3 COM 类封装成一个用于收取邮件的 .Net 组件:实现了 //同步事件  public event MessagesEventHandler MessageRe

跳出封装剖析ASP.NET脚本回调的原理

asp.net|封装|脚本      [注:此段与标题内容无关,可略过] 在看完两集Stargate并且洗了一个澡之后,我终于决定要开始写这篇文章.这是我第一篇真正意义上的原创技术文章,不管技术含量如何,我总算是迈出了这一步.博客其实开过不少,从最早的校园大巴,到博客园,以及我那个用来发牢骚的新浪博客,其实开博客最初的目的就是用来在写程序的同时,记录一下自己的学习的过程.但是后来演变成了用来发牢骚的东西,这也算是我一直以来不能专心钻研的恶果吧,不过所谓亡羊补牢为时未晚,就从这篇文章开始,变得专注

学Silverlight 2系列(8):使用样式封装控件观感

本文为系列文章第八篇,主要介绍在Silverlight中使用Style元素封装控件 观感 Silverlight 支持一种 Style 机制,它允许我们把控件的属性值封装成可重 用的资源.我们可以把这些样式声明保存在独立于页面的其他文件中,然后就可 以在一个应用程序中跨控件和页面重用(甚至跨多个应用程序重用).在做一些 基本定制的场景下,概念上类似于在 HTML 中重用 CSS. 内联样式 内联样式这个概念其实跟我们在HTML中指定元素的样式一样,在XAML中通过 属性来设置,如下面这段XAML

jQuery封装的tab选项卡插件分享

    本文给大家分享的是个人封装的tab选项卡特效的插件,十分的简单实用,附上用法和示例,有需要的小伙伴可以参考下. 在网站开发中经常会用到选项卡功能,为了节省一下写代码时间,封装了一下tab插件,方便调用. 创建选项卡组件 使用方法: html结构 ? 1 2 3 4 5 6 7 8 9 10 <div id="tabs"> <ul> <li><a href="#tabs-1">tab-1</a><

浅析js封装和作用域

在编写web软件时,遇到一些可以共用js的情况,于是就想着如何封装js代码.基本需求很简单,其实就是根据不同的情况封装js代码   基本的代码如下 复制代码 代码如下: <html xmlns="http://www.w3.org/1999/xhtml"> <head><title>  </title> <script src="jquery-1.4.4.min.js" type="text/javas

封装好的一个万能检测表单的方法

 这篇文章主要介绍了一个封装好的万能检测表单的方法,非常的好用,使用也很方便,这里推荐给小伙伴们.     检测表单中的不能为空(.notnull)的验证 作用:一对form标签下有多个(包括一个)表单需要提交时,使用js准确的判断当前按钮对那些元素做判断 用法:在form标签下 找到当前 表单的容器 给予class="form",当前表单的提交按钮给予 class="check" 需要验证为空的元素给予class="notnull" nullm

jquery自动将form表单封装成json的具体实现

 这篇文章主要介绍了jquery自动将form表单封装成json的具体实现,需要的朋友可以参考下 前端页面:  代码如下: <span style="font-size:14px;"> <form action="" method="post" id="tf">  <table width="100%" cellspacing="0" cellpadding

自己封装的javascript事件队列函数版

 这篇文章主要介绍了自 己封装的javascript事件队列函数版,兼容了大部份浏览器,需要的朋友可以参考下 背景 javascript中使用addEventListener()或attachEvent()绑定事件时会有几个小问题: 一.使用addEventListener()或attachEvent()添加的匿名函数无法移除. var oBtn = document.getElementById('btn'); oBtn.addEventListener('click',function(){