`
mmdev
  • 浏览: 12916522 次
  • 性别: Icon_minigender_1
  • 来自: 大连
文章分类
社区版块
存档分类
最新评论

IOS---UIView添加点击事件

 
阅读更多
============================================================
博文原创,转载请声明出处
============================================================
IOS的view没有点击功能,又是和Android 的一大差别,没办法,自定义一个,本来是想自己写一个的,逛了一下github,发现有同行已经写好了,我也不需要在重复了,这里只是记录一下吧:
这里我们为UIViuew定义了Category,如下:
UIView+WhenTappedBlocks.h
#if NS_BLOCKS_AVAILABLE

#import <UIKit/UIKit.h>

typedef void (^JMWhenTappedBlock)();

@interface UIView (JMWhenTappedBlocks) <UIGestureRecognizerDelegate>

- (void)whenTapped:(JMWhenTappedBlock)block;
- (void)whenDoubleTapped:(JMWhenTappedBlock)block;
- (void)whenTwoFingerTapped:(JMWhenTappedBlock)block;
- (void)whenTouchedDown:(JMWhenTappedBlock)block;
- (void)whenTouchedUp:(JMWhenTappedBlock)block;

@end

#endif
UIView+WhenTappedBlocks.m
#if NS_BLOCKS_AVAILABLE

#import "UIView+WhenTappedBlocks.h"
#import <objc/runtime.h>

@interface UIView (JMWhenTappedBlocks_Private)

- (void)runBlockForKey:(void *)blockKey;
- (void)setBlock:(JMWhenTappedBlock)block forKey:(void *)blockKey;

- (UITapGestureRecognizer*)addTapGestureRecognizerWithTaps:(NSUInteger) taps touches:(NSUInteger) touches selector:(SEL) selector;
- (void) addRequirementToSingleTapsRecognizer:(UIGestureRecognizer*) recognizer;
- (void) addRequiredToDoubleTapsRecognizer:(UIGestureRecognizer*) recognizer;

@end

@implementation UIView (JMWhenTappedBlocks)

static char kWhenTappedBlockKey;
static char kWhenDoubleTappedBlockKey;
static char kWhenTwoFingerTappedBlockKey;
static char kWhenTouchedDownBlockKey;
static char kWhenTouchedUpBlockKey;

#pragma mark -
#pragma mark Set blocks

- (void)runBlockForKey:(void *)blockKey {
    JMWhenTappedBlock block = objc_getAssociatedObject(self, blockKey);
    if (block) block();
}

- (void)setBlock:(JMWhenTappedBlock)block forKey:(void *)blockKey {
    self.userInteractionEnabled = YES;
    objc_setAssociatedObject(self, blockKey, block, OBJC_ASSOCIATION_COPY_NONATOMIC);
}

#pragma mark -
#pragma mark When Tapped

- (void)whenTapped:(JMWhenTappedBlock)block {
    UITapGestureRecognizer* gesture = [self addTapGestureRecognizerWithTaps:1 touches:1 selector:@selector(viewWasTapped)];
    [self addRequiredToDoubleTapsRecognizer:gesture];
    
    [self setBlock:block forKey:&kWhenTappedBlockKey];
}

- (void)whenDoubleTapped:(JMWhenTappedBlock)block {
    UITapGestureRecognizer* gesture = [self addTapGestureRecognizerWithTaps:2 touches:1 selector:@selector(viewWasDoubleTapped)];
    [self addRequirementToSingleTapsRecognizer:gesture];
    
    [self setBlock:block forKey:&kWhenDoubleTappedBlockKey];
}

- (void)whenTwoFingerTapped:(JMWhenTappedBlock)block {
    [self addTapGestureRecognizerWithTaps:1 touches:2 selector:@selector(viewWasTwoFingerTapped)];
    
    [self setBlock:block forKey:&kWhenTwoFingerTappedBlockKey];
}

- (void)whenTouchedDown:(JMWhenTappedBlock)block {
    [self setBlock:block forKey:&kWhenTouchedDownBlockKey];
}

- (void)whenTouchedUp:(JMWhenTappedBlock)block {
    [self setBlock:block forKey:&kWhenTouchedUpBlockKey];
}

#pragma mark -
#pragma mark Callbacks

- (void)viewWasTapped {
    [self runBlockForKey:&kWhenTappedBlockKey];
}

- (void)viewWasDoubleTapped {
    [self runBlockForKey:&kWhenDoubleTappedBlockKey];
}

- (void)viewWasTwoFingerTapped {
    [self runBlockForKey:&kWhenTwoFingerTappedBlockKey];
}

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    [super touchesBegan:touches withEvent:event];
    [self runBlockForKey:&kWhenTouchedDownBlockKey];
}

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
    [super touchesEnded:touches withEvent:event];
    [self runBlockForKey:&kWhenTouchedUpBlockKey];
}

#pragma mark -
#pragma mark Helpers

- (UITapGestureRecognizer*)addTapGestureRecognizerWithTaps:(NSUInteger)taps touches:(NSUInteger)touches selector:(SEL)selector {
    UITapGestureRecognizer* tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:selector];
    tapGesture.delegate = self;
    tapGesture.numberOfTapsRequired = taps;
    tapGesture.numberOfTouchesRequired = touches;
    [self addGestureRecognizer:tapGesture];
    
    return [tapGesture autorelease];
}

- (void) addRequirementToSingleTapsRecognizer:(UIGestureRecognizer*) recognizer {
    for (UIGestureRecognizer* gesture in [self gestureRecognizers]) {
        if ([gesture isKindOfClass:[UITapGestureRecognizer class]]) {
            UITapGestureRecognizer* tapGesture = (UITapGestureRecognizer*) gesture;
            if (tapGesture.numberOfTouchesRequired == 1 && tapGesture.numberOfTapsRequired == 1) {
                [tapGesture requireGestureRecognizerToFail:recognizer];
            }
        }
    }
}

- (void) addRequiredToDoubleTapsRecognizer:(UIGestureRecognizer*) recognizer {
    for (UIGestureRecognizer* gesture in [self gestureRecognizers]) {
        if ([gesture isKindOfClass:[UITapGestureRecognizer class]]) {
            UITapGestureRecognizer* tapGesture = (UITapGestureRecognizer*) gesture;
            if (tapGesture.numberOfTouchesRequired == 2 && tapGesture.numberOfTapsRequired == 1) {
                [recognizer requireGestureRecognizerToFail:tapGesture];
            }
        }
    }
}

@end

#endif


分享到:
评论

相关推荐

    ios-Swift使用闭包实现类似于BlocksKit添加点击事件功能.zip

    一行代码为UIView及其子类添加点击事件响应。 详情请看:https://github.com/britzlieg/ClosuresKit

    ios-hitText点击事件.zip

    将 UIScrollView 和 UIView 都添加到 Controller 的 view 上,可以拖动 UIView, UIScrollView 也可以滚动

    Swift 2.1 为 UIView 添加点击事件和点击效果

    本文主要介绍 Swift UIView,这里给大家提供代码示例作为参考为UIView 添加点击事件和点击效果,希望能帮助IOS开发的同学

    ios-自定义弹框 抽屉.zip

    完善了上次代码 使用: 把CZDrawerView的两个文件拉入项目 用 - (id)initWithParentView:(UIView *)parentView DefaultColor:(UIColor *)... 添加了点击弹出show 若想添加滑动动画 创建时执行addPanForView

    ios-Button蒙板效果.zip

    对UIView及子类添加触摸动画, 点击手势和长按手势触发, 可设置图层颜色,可设置动画开始时图层中心是y轴居中还是在触摸点。 github地址:https://github.com/TwOq/LQRippleAnimation.git

    ios-FTYCustomSetting.zip

    点击cell做一些操作 */ @property (copy, nonatomic) FTYSettingItemBlock settingBlock; // 初始化一个组,一组要多少行,就初始化多少个FTYSettingModel,然后添加到settingModels就可以了 FTYSettingGroupModel ...

    iOS为移动中的UIView(UIButton )添加点击事件

     接到需求之后我的首先想法是用button实现不久可以了,多简单点事情,结果实践之后知道自己多么的无知了,在移动中的button根本没有办法接收点击事件。  然后同事给出了一种解决办法,通过手势获取点击的位置,...

    给UIView及其子类添加Touch事件

    点击事件 _myView.tap = [LNTouchTap tapWithTouchBlock:^(id sender) { NSLog(@"[%@]:view的点击事件",[sender class]); }]; 长按事件 _myView.longPress = [LNTouchLongPress longPressWithTouchBlock:^(id ...

    UIView添加上炫酷通知图标

    这个源码案例是RKNotificationHub快速给UIView 添加上炫酷通知图标,源码RKNotificationHub,快速给UIView 添加上炫酷通知图标,点击Increment,图标右上角数字将增加。

    ios开发小技巧

    39.实现点击图片进行跳转的代码:生成一个带有背景图片的button,给button绑定想要的事件! UIButton *imgButton=[[UIButton alloc]initWithFrame:CGRectMake(0, 0, 120, 120)]; [imgButton setBackgroundImage:...

    iOS开发添加新手引导效果

    用户通过点击引导按钮可响应页面附带按钮的点击事件。 // // gzhGuideView.h // GuideView // // Created by 郭志贺 on 2020/5/29. // Copyright :copyright: 2020 郭志贺. All rights reserved. // #import NS_...

    UIKit+Foundation比较实用的category方法

    B、UIView添加设置位置的快捷操作方法 C、UIDevice可以快速获取硬件型号、磁盘可用空间等属性 D、UIApplation常用存储路径的快速访问 E、UIImage的快速初始化和UIImageView的点击事件等 F、16进制颜色的初始化 2、...

    ios常用动画封装类

    view:(UIView *)theView { /** CATransition * * @see http://www.dreamingwish.com/dream-2012/the-concept-of-coreanimation-programming-guide.html * @see http://geeklu.com/2012/09/animation-in-ios/ *...

    JSPatch学习笔记-UI基础

    代码中是JSPatch学习笔记的UI基础部分,其中包括以下内容: 1. 项目环境配置 2. 变量 * 局部变量 * 全局变量 * 使用OC中的枚举类型 `Objective-C 里的常量不能直接在 JS 上使用,可以直接在 ... * 监听按钮点击事件

    ios开发记录

    //索引为0表示先添加的子视图,跟子视图的tag没有关系 //交换两个子视图的先后位置 [self.window exchangeSubviewAtIndex:0 withSubviewAtIndex:1]; exchange交换 Subview 代替 //remove 移除 from 从 superview ...

    类似于BlocksKit添加点击事件功能

    作者britzlieg,源码ClosuresKit,这是Swift使用闭包实现类似于BlocksKit添加点击事件功能,一行代码为UIView及其子类添加点击事件响应。

    RMActionController:这是一个iOS控件,用于以类似UIAlertController的方式呈现任何UIView

    另外,它允许您在呈现的视图周围添加行为,这些行为的行为类似于按钮,并且可以由用户点击。 结果非常类似于带有特殊UIView和某些UIActions的UIActionSheet或UIAlertController 。 RMActionController还包含两个...

    iOS实现点击微信头像(放大、缩放、保存)效果

    如果需要模糊背景,可以在自定义的 UIView 中先添加模糊背景,再添加 UIScrollView,继而在 UIScrollView 中添加图片容器,这个容器就是要显示的图片的 superView,代码一目了然: - (void)setup { self.frame = ...

    iOS动画效果和实现

    UIKit只用UIView来展示动画,动画支持UIView下面的这些属性改变:下面是点击改变后的效果(两种):动画的常量有一下四种[self.viewexchangeSubviewAtIndex:1 withSubviewAtIndex:0];先添加两个view,一个redview一个...

    iOS自定义水平滚动条、进度条

    iOS自定义水平滚动条、进度条,继承UIView,可点击轨道、滑动滑块交互。 先看一下效果图: 简单说一下逻辑,新建一个继承UIView的类,分别给轨道、滑块添加UITapGestureRecognizer点击、UIPanGestureRecognizer滑动...

Global site tag (gtag.js) - Google Analytics