0

我有一个 UIImageView,我能够成功地移动到 UITableView 之上。两个视图(即 UIImageView 和 UITableView)都是 viewController 的父视图的子视图。我使用 UIPanGestureRecognizer 对象移动的 UIImageView,然后调用方法 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 的这种移动时,我希望有一个连接。谁能告诉我如何做到这一点?

4

2 回答 2

0

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

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

基本上,每当您完成移动图像视图时,我建议您使用图像视图的新中心抓取一个带有 indexPathForRowAtPoint 的单元格。然后您可以使用 rectForRowAtIndexPath 抓取该单元格的框架,然后将您的 imageView 居中在该框架中。

于 2013-06-21T20:03:51.937 回答
0

使用该UITableView方法indexPathForRowAtPoint:确定用户在哪一行停止移动图像。然后cellForRowAtIndexPath获取单元格,然后是单元格的中心,然后将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;
}];

在手势识别器处理程序内部:

-(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;
    }
}
于 2013-06-21T20:05:30.337 回答