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

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

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

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

someTableViewObject.delaysContentTouches = NO;

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

若是但愿 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;
     }
}
相关文章
相关标签/搜索