我有一个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的这个移动时,我希望有一个连接。谁能告诉我怎么做?
答案 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;
}
}