尝试从iOS中的panGestureDetected方法将UIImageView链接到UITableViewCell

尝试从iOS中的panGestureDetected方法将UIImageView链接到UITableViewCell,ios,uitableview,uiimageview,uipangesturerecognizer,Ios,Uitableview,Uiimageview,Uipangesturerecognizer,我有一个UIImageView,我能够成功地移动到UITableView的顶部。这两个视图(即UIImageView和UITableView)都是viewController父视图的子视图。我正在移动的UIImageView使用UIPangestureRecognitor对象,该对象随后调用panGestureDetected方法。我的panGestureDetected方法如下所示: - (void)panGestureDetected:(UIPanGestureRecognizer *)re

我有一个UIImageView,我能够成功地移动到UITableView的顶部。这两个视图(即UIImageView和UITableView)都是viewController父视图的子视图。我正在移动的UIImageView使用UIPangestureRecognitor对象,该对象随后调用panGestureDetected方法。我的panGestureDetected方法如下所示:

- (void)panGestureDetected:(UIPanGestureRecognizer *)recognizer {

    _startLocation = [recognizer locationInView:_imageView];

    NSLog(@"The point is: %d", _startLocation);

    int selectedRow = [_table indexPathForSelectedRow].row;
    NSLog(@"The current row is: %d", selectedRow);

    CGPoint newCenter  = _imageView.center;

    newCenter.y = [recognizer locationInView:[_imageView superview]].y;
    _imageView.center = newCenter;


}
用户可以在UITableView顶部上下拖动UIImageView。但是,我想做的是让UIImageView与UIImageView覆盖的或最接近的UITableViewCell/行进行“链接”或“连接”。如果UIImageView位于两行之间,则UIImageView应自行移动到最接近的行。下面是我所说的图像:

在该图像中,UIImageView比第2行更靠近第1行,因此在用户移除手指后,UIImageView只会向上移动一点,并覆盖第1行,可以说第1行是“活动行”


目前,我的UIImageView和我的UITableView的移动是完全独立的,但是当用户拖动UIImageView时,我希望有一个连接。有人能告诉我怎么做吗?

您可以使用以下方法来帮助您

- (NSIndexPath *)indexPathForRowAtPoint:(CGPoint)point
- (CGRect)rectForRowAtIndexPath:(NSIndexPath *)indexPath
- (NSArray *)indexPathsForRowsInRect:(CGRect)rect

基本上,无论何时移动完imageview,我都建议使用图像视图的新中心抓取具有indexPathForRowAtPoint的单元格。然后,您可以使用rectForRowAtIndexPath抓取该单元格的帧,然后将图像视图居中放置在该帧中。

使用
UITableView
方法
indexPathForRowAtPoint:
确定用户停止移动图像的行。然后
cellforrowatinexpath
获取单元格,然后获取单元格的中心,然后将
UIImageView
中心设置为单元格中心。比如:

NSIndexPath *indexPath = [myTableView indexPathForRowAtPoint:touchPoint];
UITableViewCell *cell = [myTableView cellForRowAtIndexPath:indexPath];
myUIImageView.center = cell.contentView.center;
[UIView animateWithDuration:0.25 animations:^{
    myUIImageView.center = cell.contentView.center;
}];
您还可以设置最后一条语句的动画,使其平滑移动到单元格上方,而不是跳跃。比如:

NSIndexPath *indexPath = [myTableView indexPathForRowAtPoint:touchPoint];
UITableViewCell *cell = [myTableView cellForRowAtIndexPath:indexPath];
myUIImageView.center = cell.contentView.center;
[UIView animateWithDuration:0.25 animations:^{
    myUIImageView.center = cell.contentView.center;
}];
手势识别器处理程序内部:

-(void)myGestureRecognizerHandler:(UIPanGestureRecognizer *)gestureRecognizer{

    CGPoint touchPoint = [gestureRecognizer locationInView:myTableView];

    NSIndexPath *indexPath;
    UITableViewCell *cell;

    switch ([gestureRecognizer state]) {
        case UIGestureRecognizerStateBegan:
        // Do stuff for UIGestureRecognizerStateBegan...

        case UIGestureRecognizerStateChanged:
        // Do stuff for UIGestureRecognizerStateChanged, e.g.,
            myUIImageView.center = touchPoint;

        case UIGestureRecognizerStateEnded:

            indexPath = [myTableView indexPathForRowAtPoint:touchPoint];
            cell = [myTableView cellForRowAtIndexPath:indexPath];
        {
            [UIView animateWithDuration:0.25f animations:^{
                myUIImageView.center = cell.contentView.center;
            }];
        }
            break;

        case UIGestureRecognizerStateCancelled:
        case UIGestureRecognizerStateFailed:
        default:
        // Do stuff for cancelled/failed/...

            break;
    }
}

非常感谢您的及时回复!在我的方法中,我将把你的代码块放在哪里?再次感谢您不仅提供了代码,还提供了解释:-)您还可以详细说明变量getstureTableEndPoint和SourceIndexXPath是什么吗?再次感谢您的时间。您可以在
recognizer.state==UIgestureRecognitizerStateEnded
时将其放入手势识别器回调方法中,然后,如果您在平移过程中一直在更新图像视图的帧,您应该将图像视图帧捕捉到最近的单元格,因此,
gestureTableEndPoint
可以只是图像视图的中心更新答案,以使其更清晰,并在手势识别器处理程序的上下文中显示它。