2016-10-14 11:01:36 COOL_BEAR_XX 阅读数 4739

在iOS开发中会遇到一些设计样式,需要把按钮一部分悬空在父视图的上面,但是当我们点击该按钮时,超出了父视图的悬空部分不会响应该按钮的点击事件。

原理就是iOS的touch事件的相应是从最下方的父视图开始的,系统判断点击的坐标点上没有子视图,所以不再响应,该原理可参见之前写过的这篇文章,超出俯视图的点击响应原理

效果图如下,写评论这个按钮需要做处理。



然后,分析一下代码,这里主要说一下核心代码吧。在自定义的UIView视图类中,我们重写点击视图的方法,

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event

{

    UIView * view = [super hitTest:point withEvent:event];

    if (view == nil) {

        // 转换坐标系

        CGPoint newPoint = [commentImageView convertPoint:point fromView:self];

        // 判断触摸点是否在button

        if (CGRectContainsPoint(commentImageView.bounds, newPoint)) {

            view = commentImageView;

        }

    }

    return view;

}

commentImageView是这悬空的按钮视图,这里用的是一个UIImageView,因为外包美工做的图Px大小有问题,不然肯定用的UIButton。该方法就是在点击悬空按钮悬空部分时,判断该点上有没有响应的子视图,如果没有,就再判断一下该点是不是在点击的这个按钮的视图坐标范围内,是的话就把这个按钮视图返回。这样我们的点击事件就有反应了。



2018-03-21 10:33:15 u014621518 阅读数 321

iOS 11开发教程(二十一)iOS11应用视图美化按钮之实现按钮的响应(1)

按钮主要是实现用户交互的,即实现响应。按钮实现响应的方式可以根据添加按钮的不同分为两种:一种是编辑界面添加按钮实现的响应;另一种是使用代码添加按钮实现的响应。

1.编辑界面添加按钮实现的响应

使用编辑界面添加按钮可以使用拖动的方式来实现按钮的响应,它也是最简单的一种实现响应的方式。

【示例2-4】以下将实现轻拍按钮,改变主视图背景颜色的功能。具体的操作步骤如下:

(1)创建一个Single View App模板类型的项目,命名为UIButton-response。

(2)打开Main.storyboard文件,从视图库中拖动按钮控件到主视图中,将Title设置为Tap me,Change View Color。

(3)使用设置编辑器的三个视图方式的图标,将Xcode的界面调整为如图2.5所示的效果。这一过程在前面的章节中讲解过。


图2.5  调整Xcode的界面

(4)按住Ctrl键拖动界面中的按钮对象,这时会出现一个蓝色的线条,将这个蓝色的线条拖动到ViewController.swift文件的空白处中,如图2.6所示。


图2.6  按住Ctrl键拖动界面中的按钮对象

(5)松开鼠标后,会弹出声明关联插座变量一起进行的对话框(在前面章节中讲解过),如图2.7所示。


图2.7  弹出声明关联插座变量一起进行的对话框

(6)将Connection选项设置为Action,表示关联的是一个动作;将Name设置为tapButton,表示关联的动作名为tapButton,如图2.8所示。


图2.8  填写对话框

注意:这里的Name可以是任意的。

(7)单击Connect按钮,会在ViewController.swift文件中看到如图2.9所示的代码。


图2.9  动作

2016-09-07 16:22:07 wlaizff 阅读数 2117

iOS开发中按钮多次响应问题解决方案

本文主要介绍在iOS开发中, 关于按钮多次快速点击, 响应多次的问题, 其实大多数时候我们希望按钮的响应事件只执行一次, 尽管我们快速点击按钮, 但是还是希望只响应一次, 那么在这种情况下, 就需要我们人为控制, 本文给出一种合理的解决方案, 希望对大家有帮助。

其实,遇到关于按钮的事件, 我主要介绍以下两种情况:
1. 存在网络请求的按钮事件(网络延迟)
2. 页面路由相关的跳转事件(界面跳转,push, present等)


存在网络请求的按钮事件

首先, 介绍关于存在网络请求的按钮事件, 这种事件应该在开发中是经常遇到的,
例如:登录按钮事件,如果我们快速多次点击按钮, 会不会多次触发登录请求?第一次登录请求结果未返回之前,再次点击登录按钮, 要不要触发下次登录请求?

这种情况下,解决方案其实很简单:那就是在按钮点击之后, 将按钮设置为不可用, 等到网络请求的结果返回后, 重新设置按钮为可用状态。

这里的实现方案很简单, 其实有个小细节就是:我们是使用enabled属性还是userInteractionEnabled属性来设置可用状态, 对于button而言, 如果使用enabled属性, 会发现button的样式发生了变化, 而userInteractionEnabled属性则不会产生任何变化, 建议uiview子类使用userInteractionEnabled来设置可用状态, 而像buttonItem这种就可以使用enabled来设置。


页面路由相关的跳转事件

至于这种情况, 其实不想button点击事件那样容易发现, 例如我们点击按钮push下个界面, 如果我们快速点击多次, 会发现push出来多个相同的界面, 显然这个不是我们想要的结果, 这种问题的解决思路其实也和上面一样, 只是处理方法不太一样,因为这里涉及到界面的跳转, 相对比较麻烦。

先说一下, 我在项目中的处理思路, 因为我们界面跳转方式大致就是push,pop,present,dismiss等, 因此我们在UIViewController的分类统一定义了这几种跳转方式, 大致是以下几个方法, 其实跟之前不太一样的就是多了一个sender的参数, 这个其实就是触发事件的载体,在方法体中我们需要控制sender的可用状态。

这里还有一点需要提到的是,当我们使用present方式展现的时候, 有时候需要在外面包装一个navigationController, 这里也一并处理了。

#pragma mark - 页面跳转

- (void)presentPage:(UIViewController *)viewController embededInNav:(BOOL)embeded sender:(id)sender animated:(BOOL)animated completion:(void (^)(void))completion;
- (void)pushPage:(UIViewController *)viewController sender:(id)sender animated:(BOOL)animated;

- (void)closePageWithSender:(id)sender animated:(BOOL)animated;
- (void)dismissPageWithSender:(id)sender animated:(BOOL)animated completion:(void (^)(void))completion;
- (void)popPageWithSender:(id)sender animated:(BOOL)animated;

关于具体的内部实现, 大家可以自行处理, 这里只是提供解决思路。

总结

到这里两种情况就介绍完了, 这也是我在项目中使用到的解决方法, 希望对大家有帮助, 有什么不足的地方, 也欢迎纠正补充。

2015-09-20 11:10:39 weichuang_1 阅读数 6285

今天写iOS项目时,发现虽然为按钮添加了点击事件,但是点击后却无法响应,搜索后才解决了问题:按钮的所在的父控件如果不能交互的话,那么这个按钮也无法交互,当然,可以将父控件的userInteractionEnabled属性设置为YES

我这个项目所在的按钮是添加在UIImageView上的,所以按钮无法进行交互。解决办法:

imageView.userInteractionEnabled=YES;
            UIButton* start=[[UIButton alloc] init];
            start.frame=CGRectMake(kWidth/2-50, kHeight-200, 100, 40);
            [imageView addSubview:start];
            [start addTarget:self action:@selector(startGame) forControlEvents:UIControlEventTouchUpInside];

这样,问题就解决了。

ios 按钮点击事件

阅读数 93

没有更多推荐了,返回首页