我如何实现将UIView从UIPopoverController
拖放到后面UIView
。
这是Pages在其插入媒体弹出窗口中提供的功能,您可以从UIPopoverController
拖出一个形状并将其放入主文档中。
我实际上对pan UIGestureRecognizers
感到困惑,以及它们将在何处实施。
谢谢,
乌默尔
答案 0 :(得分:7)
根据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];
}
答案 1 :(得分:6)
你必须处理两个视图控制器,一个在后台,名为mainController,使用名为popoverController的UIPopoverViewController
。您的popoverController可以向视图添加UIPanGestureRecognizer
,用户可以拖动。 gestureRecognizer的操作目标可以是popoverController上的一个方法。
一旦用户开始拖动操作,就会使用gestureRecognizer作为参数调用action方法,其中gestureRecognizer的状态为UIGestureRecognizerStateBegan
。您可以保存视图的当前帧,以便在丢弃失败时能够为其设置动画。可能有必要将视图移动到另一个superview(例如窗口),因为我不确定UIPopoverViewController是否剪切它的视图。
当用户拖动时,使用状态UIGestureRecognizerStateChanged
中的gestureRecognizer一遍又一遍地调用您的操作方法。使用translationInView:
上的UIPanGestureRecognizer
方法确定用户拖动的数量并相应地更新拖动的视图中心/框架/转换。
一旦用户抬起手指,最后一次调用action方法,并将gestureRecoginzers状态设置为UIGestureRecognizerStateEnded
。现在是时候找出拖动是否成功。例如,如果在视图当前位置下有一个放置目标,popoverController可以通过委托询问mainController,如果是这样,mainController可以采取行动,否则popoverController会将拖动的视图设置为动画,如果它来自,并将其添加回作为查看它的观点。
我希望这在某种程度上是可以理解和有用的。