IOS拖拽;掉落与缩放

时间:2013-02-20 00:04:22

标签: ios drag-and-drop

我有一个UIView子类,包含几个子视图,我想拖动它们。放入UICollectionView中包含的其他几个UIView之一。当拖动开始时,我想将拖动的视图从其当前大小缩放到拖动持续时间内的较小值(原件太大而不能方便地选择放置目标而不先将其缩小)到目前为止,我有这个:

- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    [self.superview bringSubviewToFront:self];
    self.transform = CGAffineTransformMakeScale(0.3f, 0.3f);
    startLocation = ([[touches anyObject] locationInView:self]);
    startLocation = CGPointApplyAffineTransform(startLocation, self.transform);
}

- (void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{  
    CGPoint pt = [[touches anyObject] locationInView:self];
    float dx = pt.x - startLocation.x;
    float dy = pt.y - startLocation.y;
    CGPoint newCenter = CGPointApplyAffineTransform (CGPointMake(self.center.x + dx, self.center.y + dy), self.transform);
    self.center = newCenter;
}

这是一个开始,因为它按照我想要的方式缩放拖动的UIView,并允许我拖动它;但是,拖动的UIView不会直接用鼠标指针移动(我在模拟器上运行)。当图像靠近模拟器屏幕的左上角时,鼠标指针&拖动的视图在一起;但是当我离开屏幕的右上角时,视图不再直接用鼠标指针移动;鼠标指针似乎以大约2:1的比例移动到拖动的UIView的移动。

第二个问题是,当拖动结束时,如果项目没有被删除,我需要将UIView返回到其原始比例,然后再将其重新连接到其超级视图,并且还没有完全弄清楚如何执行此操作。

感谢任何帮助,包括有关更好方法的建议,如果我完全偏离此处的话。 (我知道在分离掉落目标和丢弃时还有其他的工作要做,但我想我知道需要做什么)。

感谢任何指导。

正则表达式

2 个答案:

答案 0 :(得分:2)

好的,我得到了答案&以为我应该发布在这里以防其他人需要它。谢谢你早些时候的回复。我看到了以下文章:

How to move a UIImageView after applying CGAffineTransformRotate to it?

这让我想到了以下解决方案。在我的原始代码中,我将变换应用于起始位置,但我没有将其应用于触摸点。所以,这就是我最终解决问题的方法:

- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    [self.superview bringSubviewToFront:self];
    self.transform = CGAffineTransformMakeScale(0.2f, 0.2f);
    startLocation = ([[touches anyObject] locationInView:self]);
    startLocation = CGPointApplyAffineTransform(startLocation, self.transform);
}

- (void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
    CGPoint pt = [[touches anyObject] locationInView:self];
    if (!CGAffineTransformIsIdentity(self.transform))
        pt = CGPointApplyAffineTransform(pt, self.transform);
    float dx = pt.x - startLocation.x;
    float dy = pt.y - startLocation.y;
    CGPoint newCenter = CGPointMake(self.center.x + dx, self.center.y + dy);
    self.center = newCenter;
}

因此,当且仅当变换已应用于UIView时,才需要将变换应​​用于触摸点。我曾经在某一点上将变换应用到触摸点,但是没有条件 - 在那个例子中,整个拖动操作都开始了一个糟糕的开始,因为变换在点均匀之前可能应用于触摸点被感动了无论如何,上面的代码似乎已经解决了这个问题。

答案 1 :(得分:0)

似乎touchesmoved仍在使用旧尺寸。作为一个建议,我首先开始没有调整大小,只是实现拖放。

拖放工作时执行调整大小。首先是开始拖动然后是下降。这样做可以让你更好地感受到你想要实现的目标。

关于2:1的比例,我感觉它是关于变换你没有总体调整视图,但我可能是错的。但请确保使拖动视图更小,中间指向拖动点。

一些可能有用的参考资料是:

http://www.edumobile.org/iphone/iphone-programming-tutorials/simple-drag-and-drop-on-iphone/ http://bynomial.com/blog/?p=77