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

时间:2013-06-21 19:19:27

标签: ios uitableview uiimageview uipangesturerecognizer

我有一个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应该移动到它自己最接近的那一行。这是我正在谈论的图像:

enter image description here

在此图像中,UIImageView比第2行更接近第1行,因此在用户移开他/她的手指后,UIImageView将向上移动一点,并覆盖第1行,使第1行成为“积极的行“可以这么说。

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

2 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分: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;
    }
}