swift 使用 uiswipegesturerecognizer 更新 uitableviewcell 的框架

swift update frame of uitableviewcell with uiswipegesturerecognizer

我在我的 tableviewcell 中添加了一个 UISwipeGestureRecogniser。现在我想为我的 tableviewcell 添加实时幻灯片效果。如果我目前在单元格上滑动,什么也不会发生。单元格应该是可滑动的。

我的代码:

var originalCenter = CGPoint()

var rightSwipe = UISwipeGestureRecognizer(target: self, action: Selector("handleSwipes:"))
rightSwipe.direction = .Right
self.addGestureRecognizer(rightSwipe)

func handleSwipes(recogniser:UISwipeGestureRecognizer) {

    let location : CGPoint = recogniser.locationInView(self)

    if (recogniser.direction == .Right) {

        if recogniser.state == .Began {

            // when the gesture begins, record the current center location
            originalCenter = center
        }

        if recogniser.state == .Changed {

            let translation = recogniser.locationInView(self)
            center = CGPointMake(originalCenter.x + translation.x, originalCenter.y)
        }

        if recogniser.state == .Ended {

        }

        println("Swipe Right")
    }
}

您可以通过子classing UIPanGestureRecognizer 轻松地做您想做的事。但是不要。不要添加手势识别器,而是将您的单元格变成 UIScrollView。现在您可以设置它的 contentSize 和边界原点,以便它只能从左向右滚动。这里的优点是您使用的是内置界面 class,可以自动拖动。如果需要,您可以使用委托方法来跟踪用户的操作。

我在以前的项目中实现了自定义单元格滑动...您需要将这些东西设置为动画,使其看起来与在通知绘制消息滑动中工作的滑动完全一样。我可以在 Objective-C 中给你片段。您应该能够轻松地将其翻译成 swift ;)

-(void)handleLeftCellSwipe:(UISwipeGestureRecognizer *)recognizer{
     CGPoint location = [recognizer locationInView:self.localTableView];
     NSIndexPath *swipedIndexPath = [self.localTableView indexPathForRowAtPoint:location];
     UITableViewCell *swipedCell  = [self.localTableView cellForRowAtIndexPath:swipedIndexPath];
     if(swipedCell){
          [UIView animateWithDuration:0.3 delay:0.0 usingSpringWithDamping:0.7 initialSpringVelocity:1.0 options:UIViewAnimationOptionCurveEaseIn animations:^{
          [swipedCell.contentView setFrame:CGRectMake(swipedCell.contentView.frame.origin.x - 40, swipedCell.contentView.frame.origin.y, swipedCell.contentView.frame.size.width, swipedCell.contentView.frame.size.height)];
          } completion:^(BOOL finished){
              // Do whatever you need to do after animation completes
          }];
     }
}