尝试从iOS中的panGestureDetected方法将UIImageView链接到UITableViewCell
我有一个UIImageView,我能够成功地移动到UITableView的顶部。这两个视图(即UIImageView和UITableView)都是viewController父视图的子视图。我正在移动的UIImageView使用UIPangestureRecognitor对象,该对象随后调用panGestureDetected方法。我的panGestureDetected方法如下所示:尝试从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
- (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
可以只是图像视图的中心更新答案,以使其更清晰,并在手势识别器处理程序的上下文中显示它。