1

我有一个 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 重新附加到其超级视图之前将其返回到其原始比例,并且还没有完全弄清楚如何做到这一点。

感谢任何帮助,包括关于更好方法的建议,如果我在这里完全偏离轨道。(我知道在隔离投放目标和投放方面还有其他工作要做,但我想我知道那里需要做什么)。

感谢您的任何指导。

正则表达式

4

2 回答 2

2

好的,我得到了答案并认为我应该在这里发布以防其他人需要它。感谢之前的回复。我偶然发现了以下文章:

应用 CGAffineTransformRotate 后如何移动 UIImageView?

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

- (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 时,才需要将变换应​​用于触摸点。我曾在某一时刻将变换应用到接触点,但没有条件——在那种情况下,整个拖动操作开始不好,因为变换可能在接触点之前应用到接触点被移动。无论如何,上面的代码似乎已经解决了这个问题。

于 2013-02-20T17:59:42.187 回答
0

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

当拖放工作时,实现调整大小。首先是开始拖动,然后是放下。分步进行,这将使您对要实现的目标有更好的感觉。

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

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

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

于 2013-02-20T00:54:50.637 回答