Ios 在UITableview单元格上滑动手势,就像Whtsapp对“的滑动手势一样;回复一条消息;

Ios 在UITableview单元格上滑动手势,就像Whtsapp对“的滑动手势一样;回复一条消息;,ios,objective-c,gesture,swipe-gesture,Ios,Objective C,Gesture,Swipe Gesture,如何在tableview单元格上实现滑动手势,并在手指从左向右移动时移动tableview单元格 我可以添加滑动手势,但移动单元格是我想要实现的 Whatsapp在回复消息时实现了相同的功能,并希望获得相同的动画效果 任何帮助都将不胜感激 谢谢我已经为此制作了一个演示。你可以用 目标C: 我已将PanGesture添加到Tableviewcell中: - (nonnull UITableViewCell *)tableView:(nonnull UITableView *)tableView c

如何在tableview单元格上实现滑动手势,并在手指从左向右移动时移动tableview单元格

我可以添加滑动手势,但移动单元格是我想要实现的

Whatsapp
在回复消息时实现了相同的功能,并希望获得相同的动画效果

任何帮助都将不胜感激


谢谢

我已经为此制作了一个演示。你可以用

目标C:

我已将PanGesture添加到Tableviewcell中:

- (nonnull UITableViewCell *)tableView:(nonnull UITableView *)tableView cellForRowAtIndexPath:(nonnull NSIndexPath *)indexPath {
    UITableViewCell *cell = (UITableViewCell *)[tableView dequeueReusableCellWithIdentifier:@"Cell"];
    UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc]initWithTarget:self action:@selector(panGestureCellAction:)];
    pan.delegate = self;
    [cell.contentView addGestureRecognizer:pan];
    return cell;
}

- (IBAction)panGestureCellAction:(UIPanGestureRecognizer *)recognizer {
    CGPoint translation = [recognizer translationInView:self.view];
    if (recognizer.view.frame.origin.x < 0) { return; }
    recognizer.view.center = CGPointMake(recognizer.view.center.x+ translation.x,
                                         recognizer.view.center.y );
    [recognizer setTranslation:CGPointMake(0, 0) inView:self.view];
    if(recognizer.view.frame.origin.x > [UIScreen mainScreen].bounds.size.width * 0.9)
    {
        [UIView animateWithDuration:0.25 delay:0 options:UIViewAnimationOptionCurveEaseOut animations:^{
            [recognizer.view setFrame: CGRectMake(0, recognizer.view.frame.origin.y, recognizer.view.frame.size.width, recognizer.view.frame.size.height)];
        } completion:nil];
    }
    if (recognizer.state == UIGestureRecognizerStateEnded)
    {
        int x = recognizer.view.frame.origin.x;
        [UIView animateWithDuration:0.25 delay:0 options:UIViewAnimationOptionCurveEaseOut animations:^{
            [recognizer.view setFrame: CGRectMake(0, recognizer.view.frame.origin.y, recognizer.view.frame.size.width, recognizer.view.frame.size.height)];
        } completion:^(BOOL finished) {
            if (x > recognizer.view.frame.size.width / 2) {
                [_txtField becomeFirstResponder];
            }
        }];
    }
}
- (BOOL)gestureRecognizerShouldBegin:(UIPanGestureRecognizer *)panGestureRecognizer {
    CGPoint velocity = [panGestureRecognizer velocityInView:_tblView];
    if (velocity.x < 0) {
        return false;
    }
    return fabs(velocity.x) > fabs(velocity.y);
}
-(非空UITableViewCell*)tableView:(非空UITableView*)tableView cellForRowAtIndexPath:(非空NSIndexPath*)indexPath{
UITableViewCell*单元格=(UITableViewCell*)[tableView dequeueReusableCellWithIdentifier:@“cell]”;
UIPanGestureRecognizer*pan=[[UIPanGestureRecognizer alloc]initWithTarget:self action:@selector(panGestureCellAction:)];
pan.delegate=self;
[cell.contentView addgesturecognizer:pan];
返回单元;
}
-(iAction)panGestureCellAction:(UIPangestureRecognitor*)识别器{
CGPoint translation=[识别器translationView:self.view];
if(recognizer.view.frame.origin.x<0){return;}
recognizer.view.center=CGPointMake(recognizer.view.center.x+translation.x,
识别器.view.center.y);
[识别器setTranslation:CGPointMake(0,0)inView:self.view];
if(recognizer.view.frame.origin.x>[UIScreen mainScreen].bounds.size.width*0.9)
{
[UIView animateWithDuration:0.25延迟:0选项:UIView动画选项CurveeAseOut动画:^{
[recognizer.view setFrame:CGRectMake(0,recognizer.view.frame.origin.y,recognizer.view.frame.size.width,recognizer.view.frame.size.height)];
}完成:无];
}
if(recognizer.state==UIgestureCongnizerStateEnded)
{
intx=recognizer.view.frame.origin.x;
[UIView animateWithDuration:0.25延迟:0选项:UIView动画选项CurveeAseOut动画:^{
[recognizer.view setFrame:CGRectMake(0,recognizer.view.frame.origin.y,recognizer.view.frame.size.width,recognizer.view.frame.size.height)];
}完成:^(布尔完成){
如果(x>recognizer.view.frame.size.width/2){
[_txtField成为第一响应者];
}
}];
}
}
-(BOOL)手势识别器应开始:(UIPanGestureRecognizer*)panGestureRecognizer{
CGPoint velocity=[PangestureRecognitor VelocityView:_-tblView];
if(速度x<0){
返回false;
}
返回fabs(velocity.x)>fabs(velocity.y);
}
斯威夫特:

public func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell : UITableViewCell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
    let panGestureRecognizer = UIPanGestureRecognizer(target: self, action: #selector(panGestureCellAction))
    cell.contentView.addGestureRecognizer(panGestureRecognizer)
    return cell
}

func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool {
    let velocity : CGPoint = gestureRecognizer.location(in: tblView)
    if velocity.x < 0 {
        return false
    }
    return abs(Float(velocity.x)) > abs(Float(velocity.y))
}

@objc func panGestureCellAction(recognizer: UIPanGestureRecognizer)  {
    let translation = recognizer.translation(in: tblView)
    if recognizer.view?.frame.origin.x ?? 0 < 0 {
        return
    }
    recognizer.view?.center = CGPoint(
        x: (recognizer.view?.center.x ?? 0) + translation.x,
        y: (recognizer.view?.center.y ?? 0))
    recognizer.setTranslation(CGPoint(x: 0, y: 0), in: view)
    if (recognizer.view?.frame.origin.x ?? 0) > UIScreen.main.bounds.size.width * 0.9 {
        UIView.animate(withDuration: 0.25, delay: 0, options: .curveEaseOut, animations: {
            recognizer.view?.frame = CGRect(x: 0, y: recognizer.view?.frame.origin.y ?? 0, width: recognizer.view?.frame.size.width ?? 0, height: recognizer.view?.frame.size.height ?? 0)
        })
    }
    if recognizer.state == .ended {
        let x = recognizer.view?.frame.origin.x ?? 0
        UIView.animate(withDuration: 0.25, delay: 0, options: .curveEaseOut) {
            recognizer.view?.frame = CGRect(x: 0, y: recognizer.view?.frame.origin.y ?? 0, width: recognizer.view?.frame.size.width ?? 0, height: recognizer.view?.frame.size.height ?? 0)
        } completion: { (finished) in
            if x > ((recognizer.view?.frame.size.width ?? 0) / 2) {
                self.txtChat.becomeFirstResponder()
            }
        }
    }
}
public func tableView(\utableview:UITableView,cellForRowAt indexath:indexPath)->UITableView单元格{
let cell:UITableViewCell=tableView.dequeueReusableCell(带有标识符:“cell”,for:indexath)
让panGestureRecognizer=UIPanGestureRecognizer(目标:自我,动作:#选择器(panGestureCellAction))
cell.contentView.AddgestureRecognitizer(PangestureRecognitizer)
返回单元
}
func gestureRecognizer应该开始(uGestureRecognizer:UIGestureRecognizer)->Bool{
让速度:CGPoint=手势识别器。位置(in:tblView)
如果速度.x<0{
返回错误
}
返回abs(浮动(速度x))>abs(浮动(速度y))
}
@objc func panGestureCellAction(识别器:UIPangEstureRecognitor){
let translation=recognizer.translation(in:tblView)
如果识别器.view?.frame.origin.x±0<0{
返回
}
识别器.view?.center=CGPoint(
x:(识别器.view?.center.x±0)+translation.x,
y:(识别器.view?.center.y±0))
设置转换(CGPoint(x:0,y:0),in:view)
if(recognizer.view?.frame.origin.x±0)>UIScreen.main.bounds.size.width*0.9{
UIView.animate(持续时间:0.25,延迟:0,选项:.curveEaseOut,动画:{
识别器.view?.frame=CGRect(x:0,y:recognizer.view?.frame.origin.y±0,宽度:recognizer.view?.frame.size.width±0,高度:recognizer.view?.frame.size.height±0)
})
}
如果识别器.state==.end结束{
设x=识别器.view?.frame.origin.x??0
UIView.animate(持续时间:0.25,延迟:0,选项:.curveEaseOut){
识别器.view?.frame=CGRect(x:0,y:recognizer.view?.frame.origin.y±0,宽度:recognizer.view?.frame.size.width±0,高度:recognizer.view?.frame.size.height±0)
}完成:{(完成)在
如果x>((识别器.视图?.frame.size.width±0)/2){
self.txtChat.becomeFirstResponder()
}
}
}
}

您好,用swift。我不能执行。“-(BOOL)GestureRecognitizer shouldBegin:(UIPangestureRecognitizer*)PangestureRecognitizer”始终是“GestureRecognitizer shouldBegin(uugestureRecognitizer:UIGestureRecognitizer)->BOOL”@famfam我添加了swift代码。请核实。