如何删除UITableViewCell滑动以删除弹跳

hgw*_*tle 5 uitableview uiscrollview ios ios7

iOS 7中新的"刷卡删除"外观增加了"反弹"效果,UITableViewCell在滑动后继续偏移.有没有办法禁用此反弹,以便一旦删除按钮完全可见,单元格会停止?

继续抵消的单元格:

即使拖动继续,我希望单元格停在此处:

在此输入图像描述

我在我的cellForRowAtIndexPath:方法中试过这个,但似乎没有任何改变.

for(UIView *subview in cell.subviews){
    if([subview isKindOfClass:[UIScrollView class]]){
        UIScrollView *theScrollView = (UIScrollView *)subview;
        theScrollView.bounces = NO;
    }
}
Run Code Online (Sandbox Code Playgroud)

hgw*_*tle 4

我想我终于找到了解决办法!使用自定义单元格,您可以将该单元格设置为 aUIScrollViewDelegate并实现该scrollViewDidScroll:方法。在该方法中,您可以强制 UIScrollView 的 contentOffset 保持在特定值以下(我使用它是82.0f因为这似乎是“删除”按钮完全可见时的 contentOffset)。像这样:

。H

@interface MyCustomCell : UITableViewCell <UIScrollViewDelegate>
Run Code Online (Sandbox Code Playgroud)

.米

-(void)awakeFromNib{
    [super awakeFromNib];

    for(UIView *subview in self.subviews){
        if([subview isKindOfClass:[UIScrollView class]]){
            UIScrollView *theScrollView = (UIScrollView *)subview;
            theScrollView.delegate = self;
        }
    }
}

#pragma mark - UIScrollViewDelegate

-(void)scrollViewDidScroll:(UIScrollView *)scrollView{
    static CGFloat kTargetOffset = 82.0f; 

    if(scrollView.contentOffset.x >= kTargetOffset){
        scrollView.contentOffset = CGPointMake(kTargetOffset, 0.0f);
    }
}
Run Code Online (Sandbox Code Playgroud)

这也可以在不使用自定义单元的情况下完成,只需将 ViewController 设置为 aUIScrollViewDelegate并设置 UIScrollView 的委托,如下tableView:cellForRowAtIndexPath所示:

。H

MyViewController : UIViewController <UITableViewDataSource, UITableViewDelegate, UIScrollViewDelegate>
Run Code Online (Sandbox Code Playgroud)

.米

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *cellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];

    if(cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:cellIdentifier];
    }

    for(UIView *subview in cell.subviews){
        if([subview isKindOfClass:[UIScrollView class]]){
            UIScrollView *theScrollView = (UIScrollView *)subview;
            theScrollView.delegate = self;
        }
    }

    return cell;
}

#pragma mark - UIScrollViewDelegate

-(void)scrollViewDidScroll:(UIScrollView *)scrollView{
    static CGFloat kTargetOffset = 82.0f;

    if(scrollView.contentOffset.x >= kTargetOffset){
        scrollView.contentOffset = CGPointMake(kTargetOffset, 0.0f);
    }
}
Run Code Online (Sandbox Code Playgroud)