iOS 7 - 如何拖动按钮或 UIView 的快照而不是按钮本身

Posted

技术标签:

【中文标题】iOS 7 - 如何拖动按钮或 UIView 的快照而不是按钮本身【英文标题】:iOS 7 - how to drag the snapshot of the button or UIView instead of button itself 【发布时间】:2014-10-29 06:53:05 【问题描述】:

现在我可以使用此代码将UIButton 从一个位置拖到另一个位置。现在我正在拖动整个按钮本身。我真正想要的是拖动具有 0.5 alpha 效果的按钮快照。所以原来的按钮应该留在它的位置。我知道从 ios 7 开始,我们有了像 snapshotViewAfterScreenUpdates:YES 这样的新方法,但我的方法使用 UIControl。我应该如何更改我的快照以使用该快照?

我的另一个想法是在当前按钮之上创建第二个按钮,并将 alpha 设置为 0.5。并使用它进行拖放?但是如果我这样做,那么我在这个按钮下的按钮将无法点击:(

还有一个问题,我如何检测到用户已停止拖动,以便之后执行我的功能?我尝试在“dragged45”方法中调用我的函数,但是当按钮移动时,它会调用我的函数一百次。我只想在按钮通过屏幕中的某个点后调用我的函数。

这是我目前的代码:

从带有事件的按钮创建一个动作,并在选项内触摸拖动:

- (IBAction)dragged45:(id)sender forEvent:(UIEvent *)event;

移动按钮是这样完成的:

- (IBAction)dragged45:(id)sender forEvent:(UIEvent *)event 
 UIControl *control = sender;

 UITouch *t = [[event allTouches] anyObject];
 CGPoint pPrev = [t previousLocationInView:control];
 CGPoint p = [t locationInView:control];

 CGPoint center = control.center;
 center.x += p.x - pPrev.x;
 center.y += p.y - pPrev.y;
 control.center = center;
 NSLog(@"45 dragged!"); 

编辑:我能够检查我的按钮是否通过了视图中的某个“线”,然后停止拖动。

仍然对快照部分感到好奇。还有一种方法可以为按钮是否通过屏幕上的一条线以及用户是否在到达该线之前停止拖动设置动画?:

(IBAction)dragged45:(id)sender forEvent:(UIEvent *)event NSLog(@"45拖!");

UIControl *control = 发送者; 如果(控制中心.y

CGPoint center = control.center;
center.x += p.x - pPrev.x;
center.y += p.y - pPrev.y;
control.center = center;
NSLog(@"After dragging button's x %f",center.x);
NSLog(@"After dragging button's y %f",center.y);

【问题讨论】:

【参考方案1】:

UIButton是一个UIControl,它是一个UIView,所以你可以像这样使用函数。

UIView *buttonCopy = [button snapshotViewAfterScreenUpdates:NO];

然后在 buttonCopy 中添加一个 UIPanGestureRecognizer,当它的状态为 UIGestureRecognizerStateEnded 时,你就知道用户停止拖动视图了。

【讨论】:

谢谢!说得通!如果我想多次拖动按钮,我会怎么做?就像有一个容器,用户可以根据需要多次添加按钮。你也知道我将如何为运动制作动画吗?就像用户将其放到某一行之上(被接受)与如果他没有(在这种情况下它应该回到原来的位置) 容器大小比按钮大吗?你想拖动很多按钮分散在容器周围吗?您回到原始位置,将视图中心设置为原始中心,将其包装在 UIView 动画块中。和drop一样,让它框到drop zone frame。 是的,容器基本上是origin.y小于150的任何东西。我并没有真正将按钮放在容器中,它更像是用户添加越来越多“相同”的手势" 按钮进入容器。 你想达到什么目的?同一个按钮在容器上方并动画回到原来的位置? 按钮的“透明快照”可以拖放到容器中。但这可以多次完成。每次掉落时,计数器都会增加。如果按钮没有放在容器中(即,如果用户在拖动过程中改变主意并停止拖动),那么按钮的快照应该动画回到原来的位置。

以上是关于iOS 7 - 如何拖动按钮或 UIView 的快照而不是按钮本身的主要内容,如果未能解决你的问题,请参考以下文章

IOS 拖动、轻弹或轻弹 UIView

如何通过长按按钮然后拖动来移动 UIView?

iOS 接触开始

如何拖动 UIView 元素并更改位置?

在ios 7 xcode中单击滚动视图上方的按钮时,如何滚动滚动视图?

将 UIView 中可拖动按钮的位置保存到核心数据中