从UIPopoverController拖放到其他UIView

时间:2010-06-30 11:34:41

标签: iphone ipad uiview uipopovercontroller uigesturerecognizer

我如何实现将UIView从UIPopoverController拖放到后面UIView

这是Pages在其插入媒体弹出窗口中提供的功能,您可以从UIPopoverController拖出一个形状并将其放入主文档中。

我实际上对pan UIGestureRecognizers感到困惑,以及它们将在何处实施。

谢谢,

乌默尔

2 个答案:

答案 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会将拖动的视图设置为动画,如果它来自,并将其添加回作为查看它的观点。

我希望这在某种程度上是可以理解和有用的。