从 UIPopoverController 拖放到其他 UIView
-
01-10-2019 - |
题
我将如何实现从 UIPopoverController
到后面 UIView
.
这是 Pages 在其插入媒体弹出窗口中提供的功能,您可以在其中将形状从 UIPopoverController
并将其放入主文档中。
我其实对平底锅很困惑 UIGestureRecognizers
以及它们将在哪里实施。
谢谢,
乌梅尔
解决方案
您必须处理两个视图控制器,一个位于后台,称为 mainController,另一个使用 UIPopoverViewController
称为 popoverController。你的 popoverController 可以添加一个 UIPanGestureRecognizer
到用户可以拖动的视图。gestureRecognizer 的操作目标可以是 popoverController 上的方法。
一旦用户开始拖动操作,您的操作方法就会被调用,并以gestureRecognizer作为参数,假设gestureRecognizer的状态是 UIGestureRecognizerStateBegan
. 。您可以保存视图的当前帧,以便在放置失败时能够将其动画回来。可能有必要将视图移动到其他超级视图(例如窗口),因为我不确定 UIPopoverViewController 是否 ClipsToBounds 其视图。
当用户拖动时,您的操作方法会被一遍又一遍地调用,并且gestureRecognizer处于状态 UIGestureRecognizerStateChanged
. 。使用 translationInView:
方法上 UIPanGestureRecognizer
确定用户拖动的程度并相应地更新拖动的视图中心/框架/变换。
一旦用户抬起手指,最后一次调用操作方法,并将gestureRecoginzers状态设置为 UIGestureRecognizerStateEnded
. 。现在是时候看看拖动是否成功了。例如,popoverController 可以通过委托询问 mainController 在视图当前位置下是否有一个放置目标,如果是,则 mainController 可以采取行动,否则 popoverController 会将拖动的视图动画恢复到它的来源,并将其添加回作为它的视图的子视图。
我希望这在某种程度上是可以理解的并且有帮助的。
其他提示
根据UipopoverController上的文档,当弹出案件显示时,它会在特殊的“窗口”上呈现。因此,只需在弹出视图控制器的内容视图控制器中添加一个子视图就不足以拖动弹出视图控制器视图之外的视图。
这里最简单的解决方案是创建自己的窗口,在拖动时将拖动视图添加到窗口中。使窗口在拖放时间内可见,然后在完成时释放窗口。
如上所述,手势识别器(GR)最适合拖动/滴功能。一旦GR的状态更改为“开始”,GR将控制所有触摸,直到达到“结束”或“取消”状态,这使得它是在视图控制器和Windows之间拖动视图的理想选择:)
例子:
@interface MySplitViewController : UISplitViewController {
UIView *dragView;
UIWindow *dragWindow;
}
执行:笔记 我们不需要在窗口上称为“ makekeyandvisis visesible”。我们只需要设置其“隐藏”属性
从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];
}