按钮和手势无效问题及解决方案

简介: 按钮和手势无效问题及解决方案

按钮和手势无效问题

一般有四种情况:

1.父类或本身userInteractionEnabled设置了NO。置正确userInteractionEnabled就可以。

2.被上层的组件的事件拦截。如上面有一个文本输出框,虽然你把这个文本输入框设置了userInteractionEnabled为NO。替换不会交互的组件如UILabel。

3.被其它手势事件拦截。如对父视图设置了手势,那么它上面的表格行事件就会无效。参考:《点击UICollectionViewCell和UICollectionView空白处事件响应》。

4.不在感应区内。

本问主要介绍下空间不在感应区的情况。

有人说可以通过view来响应事件来解决,经过实践,确实能不解决该类问题,但是它只能解决父视图和该组件是直接父子关系的情况。我遇到的是正常的父视图和该组件隔了一个有相同问题的view,导致该方法无效。

//返回一个view来响应事件
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event{
    UIView *view = [super hitTest:point withEvent:event];
    if (view == nil){
        //转换坐标
        CGPoint tempPoint = [self.calendarFootView convertPoint:point fromView:self];
       //判断点击的点是否在按钮区域内
        if (CGRectContainsPoint(self.calendarFootView.bounds, tempPoint)){
            //返回按钮
            return self.calendarFootView;
        }
    }
    return view;
}

下面看我的问题分析和解决方案。不在感应区主要分三种情况:

1.它的父视图的frame设置的过小,该组件在它的视图外面。这个是代码错误,把父视图的frame设置正确就可以。通过View UI Hierarchy直接可以看到父视图和它的frame大小。这个是常见的错误。

2.自己修改了自己的frame,没有在父视图里修改frame。若本组件不想有响应,你自己修改自己的frame没有问题;若需要想有响应事件,需要通过block传递到父视图,让父视图修改frame。

    self.calendarView = [[BGCalendarView alloc] initWithIsEnabledSelect:NO icon:[UIImage imageNamed:@"返回 拷贝(1)"] selectedIcon:[UIImage imageNamed:@"返回 拷贝"] selectColor:BGColorHex(FF7648) isHiddenLine:NO lineColor:BGColorHex(F8F8F8) isUnfold:NO frame:CGRectMake(0, kNavBarAndStatusBarHeight, sCommonUnitFullWidth(), (10+15+10+12+5+(sCalendarCellInterval+12+sCalendarCellInterval)+10))];
    @weakify(self);
    self.calendarView.selectBlock = ^(BOOL isSelectContent) {
        @strongify(self);
        self.model.isUnfold = isSelectContent;
        if(isSelectContent)
        {
            self.calendarView.frame = CGRectMake(0, kNavBarAndStatusBarHeight, sCommonUnitFullWidth(), (10+15+10+12+5+(sCalendarCellInterval+12+sCalendarCellInterval)*5+10));
            self.tabview.frame = CGRectMake(0, kNavBarAndStatusBarHeight+(10+15+10+12+5+(sCalendarCellInterval+12+sCalendarCellInterval)*5+10)-BG_1PX, kUIScreenWidth, FULL_HEIGHT -(kNavBarAndStatusBarHeight+(10+15+10+12+5+(sCalendarCellInterval+12+sCalendarCellInterval)*5+10)+kBottomSafeHeight)+BG_1PX);
            [self.tabview reloadData];
        }
        else
        {
            self.calendarView.frame = CGRectMake(0, kNavBarAndStatusBarHeight, sCommonUnitFullWidth(), (10+15+10+12+5+(sCalendarCellInterval+12+sCalendarCellInterval)+10));
            self.tabview.frame = CGRectMake(0, kNavBarAndStatusBarHeight+(10+15+10+12+5+(sCalendarCellInterval+12+sCalendarCellInterval)+10)-BG_1PX, kUIScreenWidth, FULL_HEIGHT -(kNavBarAndStatusBarHeight+(10+15+10+12+5+(sCalendarCellInterval+12+sCalendarCellInterval)+10)+kBottomSafeHeight)+BG_1PX);
            [self.tabview reloadData];
        }
    };

3.在父视图里修改了组件的位置,但是没有修改组件的frame。 若本组件不想有响应,你父视图里修改了组件的位置没有问题;若需要想有响应事件,需要通过block传递到父视图,让父视图修改frame。

-(void)setupCommonCollectionViewCellView
{
//    self.contentView.backgroundColor = [UIColor whiteColor];
//    [self.contentView addSubview:self.bgBtn];
//    [self.contentView addSubview:self.decribeImageView];
//    [self.decribeImageView addSubview:self.describeTitleLabel];
//    [self.decribeImageView addSubview:self.subDescribeTitleLabel];
//    [self.decribeImageView addSubview:self.iconImageView];
//    [self unitsCommonCollectionViewCellSdLayout];
    self.commonSelectView =  [[BGCommonSelectView alloc] initWithFrame:CGRectMake(0, 0, sCommonUnitFullWidth(), 43)];
    @weakify(self);
    self.commonSelectView.hitBlock = ^(NSInteger row) {
        @strongify(self);
        if(1==row)
        {
            [self showShopGoodsDetailParamsSelectView];
        }
        else
        {
            [self showShopGoodsDetailSelectView];
        }
    };
    [self.contentView addSubview:self.commonSelectView];
}

-(void)showShopGoodsDetailParamsSelectView{
    if(isCommonUnitEmptyArray(self.model.goods_param))
    {
        return;
    }
    self.shopGoodsDetailParamsSelectView = [[CBPShopGoodsDetailParamsSelectView alloc]initWithFrame:CGRectMake(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT) bottomViewHeight:(kBottomSafeHeight +self.model.goods_param.count*42+55+45+BG_1PX*2) model:self.model];
    [[[PPSingleObject sharedInstance] getLevelNormalWindwow] addSubview:self.shopGoodsDetailParamsSelectView];
    [UIView animateWithDuration:0.3 animations:^{
        self.shopGoodsDetailParamsSelectView.bottomView.centerY = FULL_HEIGHT - (kBottomSafeHeight+55+45 +self.model.goods_param.count*42)/2;
    } completion:^(BOOL finished) {
        
    }];
}

-(void)showShopGoodsDetailSelectView{
    if(isCommonUnitEmptyArray(self.model.spec_list))
    {
        return;
    }
    self.shopGoodsDetailSelectView = [[CBPShopGoodsDetailSelectView alloc]initWithFrame:CGRectMake(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT) bottomViewHeight:(60+75+kBottomSafeHeight +self.model.spec_list.count*(15+12+10+32)+30+30+45+15+BG_1PX+self.model.spec_list.count*BG_1PX) model:self.model];
    @weakify(self);
    self.shopGoodsDetailSelectView.keyboardChangeBlock = ^(CGFloat keyboardHeight) {
        @strongify(self);
        self.shopGoodsDetailSelectView.bottomView.frame = CGRectMake(0, FULL_HEIGHT - (keyboardHeight+60+75+kBottomSafeHeight +self.model.spec_list.count*(15+12+10+32)+30+30+45+15+BG_1PX+self.model.spec_list.count*BG_1PX), SCREEN_WIDTH, (60+75+kBottomSafeHeight +self.model.spec_list.count*(15+12+10+32)+30+30+45+15+BG_1PX+self.model.spec_list.count*BG_1PX));
//        self.shopGoodsDetailSelectView.bottomView.centerY = FULL_HEIGHT - (60+75+kBottomSafeHeight +self.model.spec_list.count*(15+12+10+32)+30+30+45+15+BG_1PX+self.model.spec_list.count*BG_1PX)/2-keyboardHeight;
    };
    [[[PPSingleObject sharedInstance] getLevelNormalWindwow] addSubview:self.shopGoodsDetailSelectView];
    [UIView animateWithDuration:0.3 animations:^{
//        self.shopGoodsDetailSelectView.bottomView.centerY = FULL_HEIGHT - (60+75+kBottomSafeHeight +self.model.spec_list.count*(15+12+10+32)+30+30+45+15+BG_1PX+self.model.spec_list.count*BG_1PX)/2;
        self.shopGoodsDetailSelectView.bottomView.frame = CGRectMake(0, FULL_HEIGHT - (60+75+kBottomSafeHeight +self.model.spec_list.count*(15+12+10+32)+30+30+45+15+BG_1PX+self.model.spec_list.count*BG_1PX), SCREEN_WIDTH, (60+75+kBottomSafeHeight +self.model.spec_list.count*(15+12+10+32)+30+30+45+15+BG_1PX+self.model.spec_list.count*BG_1PX));
    } completion:^(BOOL finished) {
        
    }];
}
目录
相关文章
|
Linux Python Windows
Centos7 下安装python3及卸载
Centos7 下安装python3及卸载
1462 0
Centos7 下安装python3及卸载
|
2月前
|
人工智能 缓存 Kubernetes
几大AI知识库致命坑点:避开它们,少走3个月弯路!
本文详解AI知识库在企业中的应用,涵盖架构设计、文档处理、工作流优化与性能调优等核心技术,结合实际案例帮助读者避开落地过程中的常见陷阱,适合希望提升AI应用能力的技术人员阅读。
230 1
|
5月前
|
JSON API 开发者
淘宝天猫商品详情API接口攻略
淘宝天猫商品详情API接口是电商开发的重要工具,支持获取商品主图、价格、标题、销量及属性等详细信息。该接口广泛应用于电商数据分析与自动化购物领域。开发者可通过注册淘宝开放平台账号、申请权限并按照流程调用接口,实现商品基础信息、详情描述、图片视频资源、SKU属性及评价数据的查询。示例代码展示了如何使用Python调用此API,帮助快速上手开发。
145 13
|
3月前
|
监控 数据安全/隐私保护 Python
微信自动抢红包免费版,2025微信抢红包神器,微信红包挂苹果版【python仅供学习】
这个模拟项目包含5个模块:核心监控逻辑、用户界面、配置管理、实用工具和主程序入口
|
11月前
|
数据采集 Web App开发 JavaScript
爬虫策略规避:Python爬虫的浏览器自动化
爬虫策略规避:Python爬虫的浏览器自动化
|
11月前
|
算法 数据可视化 PyTorch
IoU已经out了,试试这几个变体:GIoU、DIoU和CIoU介绍与对比分析
本文探讨了目标检测中常用的交并比(IoU)及其变体,包括广义交并比(GIoU)、距离交并比(DIoU)和完全交并比(CIoU)。这些指标不仅提高了模型在处理不重叠、距离较远或形状差异大的边界框时的表现,还为模型的学习过程提供了更深入的洞察。文章详细解释了各指标的计算方法及应用场景,并提供了相应的代码示例,帮助读者更好地理解和应用这些先进的评估指标。
828 7
IoU已经out了,试试这几个变体:GIoU、DIoU和CIoU介绍与对比分析
WK
|
11月前
|
C++ 开发者 iOS开发
C++跨平台框架
C++跨平台框架使开发者能够编写一次代码,在多个操作系统和硬件平台上运行,提高开发效率和软件可扩展性。常见的框架包括Qt、wxWidgets、SDL、JUCE等,它们各自具有丰富的功能和特点,适用于不同的应用场景。选择框架时需考虑目标平台、功能需求、学习曲线和社区支持等因素。
WK
382 0
|
8月前
|
安全 云栖大会 UED
阿里云×用友 | 用友BIP超级版On阿里云联合方案全新发布,共启数智化新未来
阿里云×用友 | 用友BIP超级版On阿里云联合方案全新发布,共启数智化新未来
|
12月前
|
JavaScript 前端开发 安全
TypeScript无缝衔接ArkTS:快速入门鸿蒙ArkTS基本语法
【10月更文挑战第12天】TypeScript无缝衔接ArkTS:快速入门鸿蒙ArkTS基本语法
863 0
TypeScript无缝衔接ArkTS:快速入门鸿蒙ArkTS基本语法
|
12月前
|
前端开发 JavaScript API
2025年前端框架是该选vue还是react?有了大模型-例如通义灵码辅助编码,就不用纠结了!vue用的多选react,react用的多选vue
本文比较了Vue和React两大前端框架,从状态管理、数据流、依赖注入、组件管理等方面进行了详细对比。当前版本和下载量数据显示React更为流行,但Vue在国内用户量增长迅速。Vue 3通过组合式API提供了更灵活的状态管理和组件逻辑复用,适合中小型项目;React则更适合大型项目和复杂交互逻辑。文章还给出了选型建议,强调了多框架学习的重要性,认为技术问题已不再是选型的关键,熟悉各框架的最佳实践更为重要。
6933 1