IOS拖放与缩放

Posted

技术标签:

【中文标题】IOS拖放与缩放【英文标题】:IOS Drag & Drop With Scaling 【发布时间】:2013-02-04 20:55:21 【问题描述】:

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

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

感谢您的指导。

正则表达式

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

【参考方案2】:

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

当拖放工作时,实施调整大小。首先是开始拖动,然后是放下。分步进行,这会让你对你想要达到的目标有更好的感觉。

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

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

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

【讨论】:

好的,我明白了,我想我会发布我最终得到的代码,以防其他人需要它。我在这里找到了另一篇有类似问题的文章:

以上是关于IOS拖放与缩放的主要内容,如果未能解决你的问题,请参考以下文章

nstableview 拖放与自定义单元格视图

如何使用 jQuery 拖放与段落元素

拖放与物理行为

如何让 jQueryUI 拖放与触摸设备一起使用

AngularJS - 将拖放与流程图相结合

QListWidget 拖放与通过 setItemWidget 设置的自定义小部件