我已经在我的tableviewcell中添加了一个水平UIPanGestureRecognizer来平移单元格的子视图,就像ios7邮件应用程序显示删除和更多选项的方式一样,这可以按预期工作
- (IBAction)slideCell:(UIPanGestureRecognizer *)sender
{
CGPoint locationOfPan = [sender locationInView:self.tableView];
NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:locationOfPan];
TestCell *cell = (TestCell *)[self.tableView cellForRowAtIndexPath:indexPath];
if (sender.state == UIGestureRecognizerStateChanged) {
CGPoint translation = [sender translationInView:self.tableView];
[cell.view setCenter:CGPointMake(cell.view.center.x + translation.x, cell.view.center.y)];
[sender setTranslation:CGPointMake(0, 0) inView:self.tableView];
}
}
我还想做的是添加一个带有锚点的UIAttachmentBehavior到我的每个UITableViewCells,这样当我横向平移cell.view
时我会感觉到一些阻力然后当我放开时,被淘汰的细胞弹回到它在x轴上的原始锚位置,这可能与UIDynamics有关吗?
我是否也可以将单元格的一侧设置为边界,以防止用户将包含的视图平移到其之外?
答案 0 :(得分:1)
所以这里有代码让这个工作,它仍然需要调整,以获得正确的感觉,但它都按预期工作
在TestCell UITableViewCell子类
中-(void)layoutSubviews{
[super layoutSubviews];
self.animator = [[UIDynamicAnimator alloc] initWithReferenceView:self];
self.attachmentBehavior = [[UIAttachmentBehavior alloc] initWithItem:self.topView attachedToAnchor:self.topView.center];
[self.attachmentBehavior setFrequency:4.5];
[self.attachmentBehavior setDamping:0.3];
UIGravityBehavior *gravityBehavior = [[UIGravityBehavior alloc] initWithItems:@[self.topView]];
//gravity direction: right
[gravityBehavior setGravityDirection:CGVectorMake(1.0, 0.0)];
UICollisionBehavior *collisionBehavior = [[UICollisionBehavior alloc] initWithItems:@[self.topView]];
[collisionBehavior addBoundaryWithIdentifier:@"rightBoundary" fromPoint:CGPointMake(320.0f, 0.0f) toPoint:CGPointMake(320.0f, self.contentView.frame.size.height)];
[self.animator addBehavior:gravityBehavior];
[self.animator addBehavior:collisionBehavior];
}
在我的tableViewController
中-(BOOL)gestureRecognizerShouldBegin:(UIPanGestureRecognizer *)gestureRecognizer {
CGPoint translation = [gestureRecognizer translationInView:self.view.superview];
// Check for horizontal gesture
if (fabsf(translation.x) > fabsf(translation.y)) {
return YES;
}else{
return NO;
}
}
- (IBAction)slideCell:(UIPanGestureRecognizer *)sender
{
CGPoint locationOfPan = [sender locationInView:self.tableView];
NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:locationOfPan];
TestCell *cell = (TestCell *)[self.tableView cellForRowAtIndexPath:indexPath];
if(sender.state == UIGestureRecognizerStateBegan){
[cell.attachmentBehavior setAnchorPoint:cell.topView.center];
[cell.animator addBehavior:cell.attachmentBehavior];
}
if (sender.state == UIGestureRecognizerStateChanged) {
CGPoint translation = [sender translationInView:self.tableView];
[cell.attachmentBehavior setAnchorPoint:CGPointMake(cell.topView.center.x + translation.x, cell.topView.center.y)];
[sender setTranslation:CGPointMake(0, 0) inView:self.tableView];
}
if (sender.state == UIGestureRecognizerStateEnded) {
//incase pan gesture has moved off the cell
for(TestCell *cell in [self.tableView visibleCells]){
[cell.animator removeBehavior:cell.attachmentBehavior];
}
}
}
希望这可以帮助其他人尝试做同样的事情,如果有人知道UIAttachmentBehavior的设置以获得与UIScrollview相同的感觉,你能不能让我知道,谢谢