• Button加在UITableViewHeaderFooterView的self.contentView上导致不能响应点击


    你有没有遇到过Button加在UITableViewHeaderFooterView的self.contentView上导致不能响应点击的情况,下面记录一下我遇到的原因和解决方法:

    代码如下:

    - (instancetype)initWithReuseIdentifier:(NSString *)reuseIdentifier {
        if (self = [super initWithReuseIdentifier:reuseIdentifier]) {
            
            self.titleLabel = [[UILabel alloc]init];
            self.titleLabel.textColor = [UIColor redColor];
            self.titleLabel.font = [UIFont systemFontOfSize:16];
            [self.contentView addSubview:self.titleLabel];

            self.titleLabel.frame = CGRectMake(10, 15, 50, 20);

             self.cleckBtn = [UIButton buttonWithType:UIButtonTypeCustom];

            [self.cleckBtn setTitleColor:[UIColor blackColor] forState:(UIControlStateNormal)];
            self.cleckBtn.titleLabel.font = [UIFont systemFontOfSize:14];
            [self.cleckBtn    addTarget:self action:@selector(cleckTouchBtn:) forControlEvents:UIControlEventTouchUpInside];
            [self.contentView addSubview:self.cleckBtn];
        }
        return self;
    }
    - (void)cleckTouchBtn:(UIButton *)button{
        
        if (self.block) {
            self.block(self.titleLabel.text,self.cleckBtn);
        }
    }
    -(void)layoutSubviews{
        
        self.cleckBtn.frame = CGRectMake(100 , 10, 100 , 30);
    
    }

    分析:

    UIButton不能响应点击事件的原因大概有以下三种:

    1. UIButton的userInteractionEnabled默认YES,如果设置NO,UIButton就不会有响应点击事件,同时如果 UIButton的父视图的userInteractionEnabled属性为NO,UIButton也会受到影响,不会有响应。

    从UIButton的父视图和UIButton的userInteractionEnabled统统设置YES,这个问题仍然无法解决,所以不是这个问题。

    2. 另外就是button本身的frame问题,或者有没有一层视图盖住了button导致按钮无响应,简单来说就是按钮本身和按钮他爹(父视图)的问题。

    3. UIButton不能响应点击事件的另一个原因是和UIButton的父视图有关系。如果父视图frame是CGRectZero,或者UIButton超出父视图,UIButton还是会显示的,但诡异的是UIButton是不会响应点击事件的,所以要调整父视图的frame或者UIButton位置。

    依次排除...

    最后发现,原因如下:

    -(void)layoutSubviews{

     

    self.cleckBtn.frame = CGRectMake(100 , 10, 100 , 30);

    }

    在该方法中,我没有调用父类方法,意味着放弃了里面其他子视图的布局,只布局这一个按钮.导致frame造成不能点击响应.

     

    解决方法:

    1>方法一:

    -(void)layoutSubviews{
    	
        [super layoutSubviews];
        self.titleLabel.frame = CGRectMake(10, 15, 50, 20);
    	self.cleckBtn.frame = CGRectMake(100 , 10, 100 , 30);
    }
    

    2>方法二:

    直接把子控件加在self上就可以了,不需要加载self.contentView也是可以的.

     

  • 相关阅读:
    5分钟速成C++14多线程编程
    Vue+element UI穿梭框使用
    element后台项目列表删除最后一项显示无数据
    vue+element 列表一列条件渲染
    百分比布局实现div自动换行
    store.js(一款好用的本地存储插件)的使用
    Vue开发h5或者小程序由px转换rem
    Vue中使用android和ios手机打开相机并选择相册功能和图片旋转问题
    js正则表达身份证姓名和身份证号码
    Vue中h5三个下拉框实现省级联动
  • 原文地址:https://www.cnblogs.com/pengsi/p/6862557.html
Copyright © 2020-2023  润新知