我将如何实现将 UIView 从后面拖放UIPopoverController
到后面UIView
。
这是 Pages 在其插入媒体弹出窗口中提供的功能,您可以在其中将形状从其中拖出并将其UIPopoverController
拖放到主文档中。
我实际上对平底锅UIGestureRecognizers
以及它们将在哪里实施感到困惑。
谢谢,
乌梅尔
我将如何实现将 UIView 从后面拖放UIPopoverController
到后面UIView
。
这是 Pages 在其插入媒体弹出窗口中提供的功能,您可以在其中将形状从其中拖出并将其UIPopoverController
拖放到主文档中。
我实际上对平底锅UIGestureRecognizers
以及它们将在哪里实施感到困惑。
谢谢,
乌梅尔
根据 UIPopoverController 上的文档,当弹出框出现时,它会出现在一个特殊的“窗口”上。因此,仅向弹出视图控制器的内容视图控制器添加子视图不足以将视图拖到弹出视图控制器的视图之外。
这里最简单的解决方案是创建自己的窗口,在发生拖动时将可拖动视图添加到窗口中。在拖放期间使窗口可见,然后在完成后释放窗口。
如上所述,手势识别器 (GR) 最适合拖放功能。一旦 GR 的状态更改为“开始”,GR 将控制所有触摸,直到达到“结束”或“取消”状态,这使得它非常适合在视图控制器和窗口之间拖动视图:)
例子:
@interface MySplitViewController : UISplitViewController {
UIView *dragView;
UIWindow *dragWindow;
}
实现: 注意我们不需要在我们的窗口上调用“makeKeyAndVisible”。我们只需要设置它的“隐藏”属性
来自 Apple 关于 makeKeyAndVisible 方法:// 方便。大多数应用程序调用它来显示主窗口并使其成为关键。否则使用查看隐藏属性
-(void)dragBegan{
self.dragWindow = [[UIWindow alloc] initWithFrame:self.view.window.frame];
[self.dragWindow addSubview:self.dragView];
[self.dragWindow setHidden:NO];
}
在这里,我们处理手势识别器的“结束”或“取消”状态。 注意:当拖放完成时移除窗口很重要,否则您将失去与以下视图的用户交互性。
-(void)dragEnded{
[self.dragView removeFromSuperview];
[self.dragWindow setHidden:YES];
[self.dragWindow release];
[self.view addSubview:self.dragView];
}
您必须处理两个视图控制器,一个位于后台,称为 mainController,另一个使用UIPopoverViewController
称为 popoverController 呈现。您的 popoverController 可以添加一个UIPanGestureRecognizer
用户可以拖动的视图。手势识别器的动作目标可以是 popoverController 上的一个方法。
一旦用户开始拖动操作,您的操作方法就会被调用,并以gestureRecognizer 作为参数,而gestureRecognizer 的状态是UIGestureRecognizerStateBegan
。当放置失败时,您可以保存视图的当前帧以便能够将其动画化。可能有必要将视图移动到另一个超级视图(例如窗口),因为我不确定 UIPopoverViewController 是否剪辑了它的视图。
当用户拖动时,您的操作方法会在 state 中的gestureRecognizer 一遍又一遍地调用UIGestureRecognizerStateChanged
。使用translationInView:
on 方法UIPanGestureRecognizer
确定用户拖动了多少,并相应地更新拖动的视图中心/框架/变换。
一旦用户抬起手指,最后一次调用 action 方法,并将gestureRecoginzers 状态设置为UIGestureRecognizerStateEnded
。现在是时候看看拖动是否成功了。例如,popoverController 可以通过委托询问 mainController 视图当前位置下是否有放置目标,如果是,则 mainController 可以采取行动,否则 popoverController 会将拖动的视图动画化回原来的位置,并将其添加为子视图到它的视图。
我希望这在某种程度上是可以理解和有帮助的。