UIButton on UITableViewCell

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

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

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

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

1
someTableViewObject.delaysContentTouches = NO;

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

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

1
2
3
4
5
6
7
// 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 中的处理

1
2
3
4
5
6
7
8
9
// 在初始化 Cell 的地方
for (id view in self.subviews) {
    if ([NSStringFromClass([view class]) isEqualToString:@"UITableViewCellScrollView"]) {
        UIScrollView *scrollView = (UIScrollView *) view;
        scrollView.delaysContentTouches = NO;
        break;
    }

}

** iOS 8 中还要增加的处理

1
2
3
4
5
6
7
8
9
10
11
// 在初始化 TableView 的地地方
for (id view in self.subviews) {
    if ([NSStringFromClass([view class]) isEqualToString:@"UITableViewCellScrollView"]) {
        if([view isKindOfClass:[UIScrollView class]])
        {
            UIScrollView *scrollView = (UIScrollView *) view;
            scrollView.delaysContentTouches = NO;
        }
        break;
    }
}
时间: 2024-11-02 05:18:13

UIButton on UITableViewCell的相关文章

UITableViewCell中添加多个UIButton实例

在项目中又遇到坑了.UITableViewCell中添加了2个UIButton.点击事件添加在Cell中.cell设置代理,TableViewController类接受代理,并执行相应的方法.根据superView 找到cell,根据cell找到相应的indexpath. 贴代码: - (void)editItem:(UIButton *)sender { UITableViewCell * cell = (UITableViewCell *)[[[sender superview] super

UITableView和UITableViewCell在不同iOS版本的层级关系

这是我人生中的第一篇博客,兴奋,激动,哈哈!!! UITableView时iOS中非常常用的一个控件,一般情况下那几个必须实现的代理方法就够我们实现一些简单的界面了.但有时候猛然遇到一个关于tableview的问题,也会令像我这种的小白不知所措. - (NSIndexPath *)GetIndexPath:(id)sender {  UIButton        *btn = ((UIButton *)sender); UITableViewCell *cell = (UITableViewC

IOS开发基础知识--碎片15

1:将自定义对象转化成NsData存入数据库 要转为nsdata自定义对象要遵循<NSCoding>的协议,然后实现encodeWithCoder,initwithcode对属性转化,实例如下: HMShop.h #import <Foundation/Foundation.h> @interface HMShop : NSObject <NSCoding> @property (nonatomic, copy) NSString *name; @property (n

从零开始学ios开发(十五):Navigation Controllers and Table Views(中)

这篇内容我们继续上一篇的例子接着做下去,为其再添加3个table view的例子,有了之前的基础,学习下面的例子会变得很简单,很多东西都是举一反三,稍稍有些不同的内容,好了,闲话少说,开始这次的学习. 如果没有上一篇的代码,可以从这里下载Nav_1 1)第三个subtableview:Controls on Table Rows这个例子,我们将为每个table view的每一行添加一个按钮,这个按钮将放在accessory icon的位置(之前我们使用过accessoryType,其实这也是一个

iOS开发-Alpha,Hidden与Opaque区别

UIView中的这三个属性用的比较多,尤其是Alpha和Opaque之间有的时候不是很好分别,稍微整理下: Alpha(不透明度) alpha是不透明度,属性为浮点类型的值,取值范围从0到1.0,表示从完全透明到完全不透明,其特性有当前UIView的alpha值会被其所有subview继承.alpha值会影响到UIView跟其所有subview,alpha具有动画效果.当alpha为0时,跟hidden为YES时效果一样,但是alpha主要用于实现隐藏的动画效果,在动画块中将hidden设置为Y

iOS:使用block代码块实现事件处理过程中的回调

block是什么,这里就不多加强调了,它的优点: 第一:执行效率高,速度快 第二:使用起来比代理简单,省却不少代码,增强代码美感 有一些小的知识点要强调一下: 第一点:它类似于一个匿名函数,也跟java中的匿名内部类相似,但是,记住,它是一种基本数据类型: 第二点:在类中声明block为属性时,如果使用assgin修饰,那么它被放到了栈中,方法已过就会被销毁,所以,尽量使用copy作为修饰词,这样一来block就被存放到了堆中,生命周期就会延长,保证block不会被立即销毁: 第三点:要防止循环

[BS-17] iOS开发-Alpha,Hidden和Opaque区别

iOS开发-Alpha,Hidden和Opaque区别 UIView控件都有Alpha,Hidden和Opaque这三个常见属性,UIView控件BackgroundColor是用RGBA表示的,故背景色也会有一个alpha(在Storyboard中调色板显示为opacity).这些属性使用时易混淆,尤其是Alpha和Opaque之间有的时候不是很好分别,稍微整理下: Alpha(不透明度) alpha是不透明度,属性为浮点类型的值,取值范围从0到1.0,表示从完全透明到完全不透明,其特性有当前

背景色默认值引出的一系列问题

刚看到代码中有大量的xx.backgroundColor = [UIColor clearColor]; (1)很好奇,默认的背景色是什么值? 官方给出的:默认为nil,此时背景是透明的.然后clearColor的备注也写明了:“0.0 white, 0.0 alpha”(白色,但alpha为0),所以我感觉代码中设置clearColor的代码可以去掉,除非此举是为了reset背景色. (2)结束了这个问题后,想到了UIView有个属性是opaque,如果此属性设置为YES,也就是不透明,但是默

iOS 为自定义tableView添加button点击事件后获取其序号

在自定义tableView中,为cell添加button点击事件后,如何获取其对应的序号? 1.创建tableView: 先创建一个成员变量: @interface MyCameraViewController ()<UITableViewDelegate,UITableViewDataSource> { UITableView *_tableView; }@end 在viewDidLoad中初始化 _tableView = [[UITableView alloc] initWithFrame