============================================================
博文原创,转载请声明出处
============================================================
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
分享到:
相关推荐
一行代码为UIView及其子类添加点击事件响应。 详情请看:https://github.com/britzlieg/ClosuresKit
将 UIScrollView 和 UIView 都添加到 Controller 的 view 上,可以拖动 UIView, UIScrollView 也可以滚动
本文主要介绍 Swift UIView,这里给大家提供代码示例作为参考为UIView 添加点击事件和点击效果,希望能帮助IOS开发的同学
完善了上次代码 使用: 把CZDrawerView的两个文件拉入项目 用 - (id)initWithParentView:(UIView *)parentView DefaultColor:(UIColor *)... 添加了点击弹出show 若想添加滑动动画 创建时执行addPanForView
对UIView及子类添加触摸动画, 点击手势和长按手势触发, 可设置图层颜色,可设置动画开始时图层中心是y轴居中还是在触摸点。 github地址:https://github.com/TwOq/LQRippleAnimation.git
点击cell做一些操作 */ @property (copy, nonatomic) FTYSettingItemBlock settingBlock; // 初始化一个组,一组要多少行,就初始化多少个FTYSettingModel,然后添加到settingModels就可以了 FTYSettingGroupModel ...
接到需求之后我的首先想法是用button实现不久可以了,多简单点事情,结果实践之后知道自己多么的无知了,在移动中的button根本没有办法接收点击事件。 然后同事给出了一种解决办法,通过手势获取点击的位置,...
点击事件 _myView.tap = [LNTouchTap tapWithTouchBlock:^(id sender) { NSLog(@"[%@]:view的点击事件",[sender class]); }]; 长按事件 _myView.longPress = [LNTouchLongPress longPressWithTouchBlock:^(id ...
这个源码案例是RKNotificationHub快速给UIView 添加上炫酷通知图标,源码RKNotificationHub,快速给UIView 添加上炫酷通知图标,点击Increment,图标右上角数字将增加。
39.实现点击图片进行跳转的代码:生成一个带有背景图片的button,给button绑定想要的事件! UIButton *imgButton=[[UIButton alloc]initWithFrame:CGRectMake(0, 0, 120, 120)]; [imgButton setBackgroundImage:...
用户通过点击引导按钮可响应页面附带按钮的点击事件。 // // gzhGuideView.h // GuideView // // Created by 郭志贺 on 2020/5/29. // Copyright :copyright: 2020 郭志贺. All rights reserved. // #import NS_...
B、UIView添加设置位置的快捷操作方法 C、UIDevice可以快速获取硬件型号、磁盘可用空间等属性 D、UIApplation常用存储路径的快速访问 E、UIImage的快速初始化和UIImageView的点击事件等 F、16进制颜色的初始化 2、...
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基础部分,其中包括以下内容: 1. 项目环境配置 2. 变量 * 局部变量 * 全局变量 * 使用OC中的枚举类型 `Objective-C 里的常量不能直接在 JS 上使用,可以直接在 ... * 监听按钮点击事件
//索引为0表示先添加的子视图,跟子视图的tag没有关系 //交换两个子视图的先后位置 [self.window exchangeSubviewAtIndex:0 withSubviewAtIndex:1]; exchange交换 Subview 代替 //remove 移除 from 从 superview ...
作者britzlieg,源码ClosuresKit,这是Swift使用闭包实现类似于BlocksKit添加点击事件功能,一行代码为UIView及其子类添加点击事件响应。
另外,它允许您在呈现的视图周围添加行为,这些行为的行为类似于按钮,并且可以由用户点击。 结果非常类似于带有特殊UIView和某些UIActions的UIActionSheet或UIAlertController 。 RMActionController还包含两个...
如果需要模糊背景,可以在自定义的 UIView 中先添加模糊背景,再添加 UIScrollView,继而在 UIScrollView 中添加图片容器,这个容器就是要显示的图片的 superView,代码一目了然: - (void)setup { self.frame = ...
UIKit只用UIView来展示动画,动画支持UIView下面的这些属性改变:下面是点击改变后的效果(两种):动画的常量有一下四种[self.viewexchangeSubviewAtIndex:1 withSubviewAtIndex:0];先添加两个view,一个redview一个...
iOS自定义水平滚动条、进度条,继承UIView,可点击轨道、滑动滑块交互。 先看一下效果图: 简单说一下逻辑,新建一个继承UIView的类,分别给轨道、滑块添加UITapGestureRecognizer点击、UIPanGestureRecognizer滑动...