button不在父试图中,但是需要响应点击事件

当button不在父试图的范围内时,是无法响应点击事件的。项目中涉及了这个部分,之后写了个小demo(点击按钮,向上弹出两个button,并且都能响应点击事件),如下:

自定义view:CUMoreView

//
//  CUMoreView.h
//

#import <UIKit/UIKit.h>

typedef void(^btnClickBlock)(UIButton *btn);

@interface CUMoreView : UIView

@property (nonatomic, copy) btnClickBlock  btnClock;

- (void)didClickButtonWithBlock:(btnClickBlock)btnClock;

@end

//
//  CUMoreView.m
//  animation
//

#import "CUMoreView.h"
#import "UIView+CU.h"

@interface CUMoreView()
@property (nonatomic, weak) UIButton *btn2;
@property (nonatomic, weak) UIButton *btn3;
@property (nonatomic, assign) BOOL isShow;
@end

@implementation CUMoreView

-(instancetype)initWithFrame:(CGRect)frame {
    self = [super initWithFrame:frame];
    self.isShow = NO;
    UIButton *btn1 = [[UIButton alloc]initWithFrame:CGRectMake(0, 0, 60, 30)];
    btn1.backgroundColor = [UIColor lightGrayColor];
    [btn1 setTitle:@"aaaa" forState:UIControlStateNormal];
    btn1.tag = 10001;
    [btn1 addTarget:self action:@selector(didClickButton:) forControlEvents:UIControlEventTouchUpInside];
    [self addSubview:btn1];
    
    UIButton *btn2 = [[UIButton alloc]initWithFrame:CGRectMake(0, -30, 60, 30)];
    btn2.backgroundColor = [UIColor lightGrayColor];
    [btn2 setTitle:@"bbbb" forState:UIControlStateNormal];
    btn2.userInteractionEnabled = YES;
    btn2.alpha = 1;
    btn2.tag = 10002;
    [btn2 addTarget:self action:@selector(didClickButton:) forControlEvents:UIControlEventTouchUpInside];
    self.btn2 = btn2;
    [self addSubview:btn2];
    
    UIButton *btn3 = [[UIButton alloc]initWithFrame:CGRectMake(0, -60, 60, 30)];
    btn3.backgroundColor = [UIColor lightGrayColor];
    [btn3 setTitle:@"cccc" forState:UIControlStateNormal];
    btn3.alpha = 1;
    btn3.tag = 10003;
    [btn3 addTarget:self action:@selector(didClickButton:) forControlEvents:UIControlEventTouchUpInside];
    self.btn3 = btn3;
    [self addSubview:btn3];
    return self;
}

-(void)didClickButton:(UIButton *)clickButton {
    NSInteger tag = clickButton.tag;

if (tag == 10001) {
        
        if (self.isShow == NO) {//展开
            
      [UIView animateWithDuration:0.25 animations:^{
          self.btn2.y = -30;
          self.btn3.y = - 60;
          self.btn2.alpha = 1;
          self.btn3.alpha = 1;
          self.isShow = YES;
      }];
        }else{//收缩
          [UIView animateWithDuration:0.25 animations:^{
              self.btn3.y = 0;
              self.btn3.alpha = 0;
              self.btn2.y = 0 ;
              self.btn2.alpha = 0;
              self.isShow = NO;
          }];
        }
    }
    
    else {
    
    if (self.btnClock) {
        self.btnClock(clickButton);
    }
    }
}

-(void)didClickButtonWithBlock:(btnClickBlock)btnClock {
    if (btnClock) {
        self.btnClock = btnClock;
    }
    
}

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
    UIView *view = [super hitTest:point withEvent:event];
    if (view == nil) {
        CGPoint tempoint = [self.btn2 convertPoint:point fromView:self];
        CGPoint tempoint2 = [self.btn3 convertPoint:point fromView:self];
        
        if (CGRectContainsPoint(self.btn2.bounds, tempoint))
        {
            view = self.btn2;
        }
        
        if (CGRectContainsPoint(self.btn3.bounds, tempoint2)) {
            view = self.btn3;
        }
        
    }
    return view;
}

@end

//
//  ViewController.m
//

#import "ViewController.h"
#import "CUMoreView.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    CUMoreView *moreView = [[CUMoreView alloc]initWithFrame:CGRectMake(200, 200, 60, 120)];
    [moreView didClickButtonWithBlock:^(UIButton *btn) {
        if (btn.tag == 10002) {
            
            NSLog(@"点击了中间的按钮");
            
        }else if (btn.tag == 10003) {
             NSLog(@"点击了上面的按钮");
        }
    }];
    
    [self.view addSubview:moreView];
    
    
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end

时间: 2024-09-29 03:57:55

button不在父试图中,但是需要响应点击事件的相关文章

[android篇]textview中片段响应点击事件(SpannableString)

项目需求 点击textView中的一小段文字,弹一个dialog框 失败解决方案 刚开始是用了两个textView水平布局,可想而知,当第一个textView快占满一行,还未换行时,第二个textView很可能出现换行排版问题 用spannableString的问题 小段文字有下划线 点击textView中的小段文字时,系统会当做url处理,给点击部分的text加一个蓝色的背景 解决方案 public class TouchableSpan extends ClickableSpan { pri

jQuery之防止冒泡事件,冒泡事件就是点击子节点,会向上触发父节点,祖先节点的点击事件。

冒泡事件就是点击子节点,会向上触发父节点,祖先节点的点击事件. 下面是html代码部分: <body> <div id="content"> 外层div元素 <span>内层span元素</span> 外层div元素 </div> <div id="msg"></div> </body> 对应的jQuery代码如下: <script type="text/

【转】Android - Button(按钮)的响应点击事件的4种写法

原文网址:http://www.yrom.net/blog/2011/12/12/android-4-onclicklistener-of-button/ Button控件setOnclickListener(View.OnClickListener listener)来接收一个点击事件的监听器 自定义一个点击事件监听器类让其实现View.OnClickListener的onClick(View v)方法 1 2 3 4 5 class MyOnClickListener implements

Android EditText中插入图片并响应点击事件

EditText中插入图片基本就是两种方法: 1,通过Html.fromHtml(..)来实现 [mw_shl_code=java,true]eText.append(Html.fromHtml("<img src='" + R.drawable.ohoh + "'/>", imageGetter, null));[/mw_shl_code] 2,通过ImageSpan与SpannableString/SpannableStringBuilder. [m

android开发里跳过的坑——button不响应点击事件

昨天遇到一个头疼的问题,在手机上按钮事件都很正常,但是在平板上(横屏显示的状态),button点击事件不响应,代码简化如下: public class Test extends Activity implements OnClickListener{ private Button testButton = null; @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated meth

view上添加点手势 button无法响应点击事件

在view 上添加手势 有的时候  会把Button的 点击事件盖掉,这个 时候 我们用UITapGestureRecognizer的代理方法 //手势的代理方法 - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch { // 过滤掉UIButton,也可以是其他类型 if ( [touch.view isKindOfClass:[UIButto

使用ClickableSpan轻松实现一段文本中的多个点击事件

项目需求需要实现如上布局:红圈内都有点击事件且颜色不一样. 1. 初始考虑用多个textview拼接,但是用普通线性和相对布局,无法实现换行,谷歌发现有现成的轮子自动换行布局android-flowlayout,使用发现此类布局空间都是通过计算当行剩余空间是否能够容下一个子view,如不能容下,另起一行去显示子view, 即,后面的空间如果不能容下发表内容,发表内容就会另起一行,这样布局很难看,可以有一个变通的方法就是内容分为两个textview,对于内容截取几个让第一个textview显示,剩

UIImageView上添加Button不能响应点击事件

UIImageView *backImageView = [[UIImageView alloc]initWithFrame:CGRectMake(0, self.view.frame.size.height-UITABBAR_HEIGHT-216-39, 320, 43) ]; [backImageView setUserInteractionEnabled:YES];//使添加其上的button有点击事件 [backImageView setImage:[UIImage imageNamed

vue中解决拖动和点击事件的冲突

BUG说明: 鼠标上下方向拖拽,如果松开时鼠标位于悬浮按钮上会默认执行click事件,经验证,click事件与mouse事件的执行顺序为onmousedown =>onmouseup =>onclick,意味着在click事件执行时会与与其相关的mouse事件冲突. 解决方案:因为click事件执行时间短,所以利用鼠标拖动的时间差作为标志,在拖拽事件中计算鼠标从onmousedown 到onmouseup 所用的时间差,与200ms作比较,作为全局变量.由于vue的directives自定义指