【IOS】关于处于表视图行单元 contentView 中的 UIButton 短按不产生高亮效果的

在做demo时, 发现 UITableViewCell 中的 UIButton 短按一次看不到默认的变灰效果, 停留稍长才能变灰, 比如twitter官方客户端用户头像, 微博的转评赞三按钮。 微博各类客户端的头像和其他按钮也是这样, 头像很多直接是imageView加手势。 这方面细节处理的最好的是 Instagram 不管短按长按都会灰, 这样才有打击感。

经一番搜索之后得知 UITableView 做为 UIScrollView 的子类,拥有 delaysContentTouches 的布尔属性, 且默认为 YES, 即延迟响应 UIScrollView 子视图中的事件, 在这个短暂的延迟中, 如果触摸发生了移动, 则响应为滚动事件, 若没有移动且子视图中有 UIControl 类型且触摸位置处于该控件的话则被立即传递并触发相应事件。 所以当短按 UIButton 时, 先被系统判断为不是滚动事件才被传给子视图控件, 但高亮效果的动画被绕过了, 事件被直接传递。 所以只有当手指停留稍长时间时, 才度过了延迟时间从而看到了高亮效果。

若想要让 UIButton 短按长按均可显示高亮特效的话, 就是去掉这个延迟。 在你创建完表视图对象的地方, 或其初始化方法中加入以下代码, 将其默认的值改为 NO 。

someTableViewObject.delaysContentTouches = NO;

但这个时候又会发现, 当手指以 UIButton 区域做为滚动操作的起始点的话, UIScrollView就不响应滚动的手势动作了。

如果希望 UITableView 上的所有地方总能响应滚动事件的话, 就需要子类化 UITableView 并重写其从父类 UIScrollView 继承来的如下方法了

// default returns YES if view isn‘t a UIControl
// Returns whether to cancel touches related to the content subview and start dragging.
- (BOOL)touchesShouldCancelInContentView:(UIView *)view{ 
       // 即使触摸到的是一个 UIControl (如子类:UIButton), 我们也希望拖动时能取消掉动作以便响应滚动动作
       return YES;
}

通过 UIScrollView 头文件中的注释, 以及苹果官方文档的说明可以得知, 因为其默认如果事件在 UIControl 或其子类响应时, 返回为 NO, 即 即使触摸发生移动, 也不响应为滚动事件。 所以让其始终返回 YES, 即 UIScrollView 在屏幕上显示的任何位置的触摸事件, 如果发生移动, 均可响应为滚动事件。

iOS 7 UITableViewCell 的结构变化

// iOS 6
    <UITableViewCell>
       | <UITableViewCellContentView>
// iOS 7
    <UITableViewCell>   
       | <UITableViewCellScrollView>
       |    | <UITableViewCellContentView>

iOS 7 的 UITableViewCellContentView 又多了一级父视图 UITableViewCellScrollView, 看名字带有 ScrollView , 但是其好像并不会再多一级事件响应的延迟了。

之前写错了,UITableViewCellScrollView 也要去掉延迟。

// 我是在 cell 的初始化方法中做的处理
for (UIView *currentView in self.subviews){
    if ([NSStringFromClass([currentView class]) isEqualToString:@"UITableViewCellScrollView"])
    {
        UIScrollView *sv = (UIScrollView *) currentView;
        [sv setDelaysContentTouches:NO];
        break;
     }
}
时间: 2024-10-06 02:08:37

【IOS】关于处于表视图行单元 contentView 中的 UIButton 短按不产生高亮效果的的相关文章

iOS 如何改变表视图分割线在iOS7中的默认偏移

- (void)viewDidLoad { [super viewDidLoad]; self.automaticallyAdjustsScrollViewInsets = NO; if ([self.tableView respondsToSelector:@selector(setSeparatorInset:)]) { [self.tableView setSeparatorInset:UIEdgeInsetsZero]; } if ([self.tableView respondsToS

IOS开发之表视图(UITableView)

IOS开发之表视图(UITableView)的基本介绍(一) (一):UITableView的基本概念 1.在IOS开发中,表视图的应用十分广泛和普及.因此掌握表视图的用法显得非常重要.一般情况下对于数据的展示 我们都会选择表视图,比如通讯录和一些数据列表. 2.我们可以选择创建表视图也可以创建表视图控制器. (二)UITableView基本样式如下(1:UITableViewStylePlain(普通表视图),2:UITableViewStyleGroup(分组表视图)): (三)UITabl

iOS开发高级分享 - iOS的可折叠表视图

导言 我曾经开发过一个iphone应用程序,它显示了大量的输入,这些输入分为不同的类别,在`UITableView`...若要更改其中一个输入的值,用户按下表视图中的对应行,并在出现的单独屏幕中更改该值.表视图为每个类别有一个节,每个节包含每个输入的表格单元格(行). 问题是输入的数量变得非常非常大,所以它没有给用户一个非常好的概述.从桌面滚动到底部甚至很乏味. 我们决定用户应该能够通过简单地按下节的标题来折叠和展开表中的部分(类别).我们要求实现这一目标的代码应该是可重用的,并且要求对现有代码

IOS 创建简单表视图

创建简单表视图 此实例主要实现UITableViewDataSource协议中必须要实现的两个方法tableView:numberOfRowsInSection: 和tableView:cellForRowAtIndexPath: 当表视图显示的时候会发出tableView:numberOfRowsInSection:消息询问当前节中的行数. 当表视图单元格显示的时候会发出tableView:cellForRowAtIndexPath:消息为单元格提供显示数据. 一.实现的时序图,如下: 二.示

IOS开发之表视图爱上CoreData

在接触到CoreData时,感觉就是苹果封装的一个ORM.CoreData负责在Model的实体和sqllite建立关联,数据模型的实体类就相当于Java中的JavaBean, 而CoreData的功能和JavaEE中的Hibernate的功能类似,最基本是两者都有通过对实体的操作来实现对数据库的CURD操作.CoreData中的上下文(managedObjectContext)就相当于Hibernate中的session对象, CoreData中的save操作就和Hibernate中的comm

ios开发(表视图)

1.在对象库中拖拉tableview至场景中.再拖拉tableviewcell作为原型单元格,注意要设置原型单元格标识符以备后面代码实现使用 2.设置tableVIEW属性(content:Dynamic Prototypes style:grouped),原型单元格属性(style:basic,image,identifier标识符,identation:1) 3.将tableview的输出口delegate和datasource链接至viewcontroller 4.实现逻辑(书本例子) 在

IOS学习之——表视图 给tableViewController添加悬浮窗口

前言 在IOS中,UITableViewController不如UIViewController用的方便,遇到了一个需求:在TableView中添加一个悬浮按钮,不随TableView滑动而滑动.这个需求在UIViewController里面很好实现,给self.view 添加子视图,再把子视图放到最上方即可.可是在表视图控制器中,就很难办,因为控制器中没有作为tableView的父视图的view存在,而把button作为tableView的子视图出现呢,则会随着table的滑动而滑动(⊙﹏⊙b

IOS 分节表视图

分节表视图 简单的表视图只有一个节,它实际上是分节表视图的一个特例.一个表可以有多个节,节也有头有脚,分节是添加索引和分组的前提. 索引的正确使用原则如所示: 1.索引标题不能与显示的标题完全一样.如果与要显示的标题一致,索引就变得毫无意义. 2.索引标题应具有代表性,能代表一个数据集合. 3.如果采用了索引列表视图,一般情况下就不再使用扩展视图.索引列表视图与扩展视图并存的时候,两者会存在冲突.当点击索引标题时,很容易点击到扩展视图. 正确的使用方式,如下图: 数据文件的格式,如下图: 效果图

IOS 带搜索栏表视图

带搜索栏表视图 此实例主要实现 Search Bar and Search Display Controller ,注意不是Search Bar控件. Search Bar and Search Display Controller的好处在于它可以把UISearchDisplayController也添加到搜索栏,并且将委托和数据源连线完毕. 一.结构图,如下: 二.样式说明图,如下: 三.效果图,如下: 源码为: 3.1 SearchbarSimpleTable 版权声明:本文为博主原创文章,