【问题标题】:How to remove UITableViewCell swipe to delete bounce如何删除 UITableViewCell 滑动删除弹跳
【发布时间】:2013-10-02 20:37:54
【问题描述】:

iOS 7 中新的“滑动删除”外观添加了“反弹”效果,UITableViewCell 在滑动后继续偏移。有什么方法可以禁用这种反弹,以便在删除按钮完全可见时单元格会硬停止?

继续偏移的单元格:

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

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

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

【问题讨论】:

  • 你搞定了吗?如果您查看集成的天气应用程序,它的功能与您想要的相同,我一直在寻找如何做到这一点,但现在仍然一无所获。
  • @AlexSaidani - 不。我一直在尝试,但仍然没有解决方案。你是对的!我知道我在某个地方见过它,但不记得在哪里。

标签: ios uitableview uiscrollview ios7


【解决方案1】:

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

.h

@interface MyCustomCell : UITableViewCell <UIScrollViewDelegate>

.m

-(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);
    }
}

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

.h

MyViewController : UIViewController <UITableViewDataSource, UITableViewDelegate, UIScrollViewDelegate>

.m

- (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);
    }
}

【讨论】:

    【解决方案2】:

    【讨论】:

      【解决方案3】:

      我不认为有这样的选择,但也许你可以做的是子类化你的单元格,在didTransitionToState: 中你可以检测到删除确认状态。

      现在我不完全确定你可以做些什么来防止滚动,但我希望这能让你朝着正确的方向前进。

      也许您可以在这种状态下禁用单元格的手势识别器?

      【讨论】:

        猜你喜欢
        • 2014-07-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-10
        • 2014-11-18
        • 2014-11-23
        • 1970-01-01
        • 2020-03-02
        相关资源
        最近更新 更多