【问题标题】:Drag-n-Drop from UIPopoverController to other UIView从 UIPopoverController 拖放到其他 UIView
【发布时间】:2011-03-10 02:15:59
【问题描述】:

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

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

我实际上对 pan UIGestureRecognizers 以及它们将在哪里实施感到困惑。

谢谢,

乌默尔

【问题讨论】:

  • 老兄我很困惑..什么是 UIPopoverController 和 UIGestureRecognizers?肯定不是 UIKit 组件。您是指一些自定义视图……还是您想要的某种功能……?
  • @lukya UIPopovercontroller 和 UIGestureRecognizers 都是 Ipad 的 UIKit 的一部分(Uigesturerecognizer 也适用于 iPhone)
  • @Daniel 对对象的结构有何想法?
  • 不熟悉所有类型的手势识别器,但即使没有它们,我也会使用石英核心和核心动画来为视图拖动动画,方法是跟随用户触摸以及当用户放下某种消息时被发送到 uiviewcontroller 来设置视图

标签: iphone ipad uiview uipopovercontroller uigesturerecognizer


【解决方案1】:

根据 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];
}

【讨论】:

    【解决方案2】:

    您必须处理两个视图控制器,一个位于后台,称为 mainController,另一个使用称为 popoverController 的UIPopoverViewController 呈现。您的 popoverController 可以将 UIPanGestureRecognizer 添加到用户可以拖动的视图中。手势识别器的动作目标可以是 popoverController 上的一个方法。

    一旦用户开始拖动操作,您的操作方法就会以gestureRecognizer 作为参数调用,如果gestureRecognizer 的状态为UIGestureRecognizerStateBegan。当放置失败时,您可以保存视图的当前帧以便能够将其动画化。可能有必要将视图移动到另一个超级视图(例如窗口),因为我不确定 UIPopoverViewController 是否可以剪辑它的视图。

    当用户拖动时,您的动作方法会被一次又一次地调用,其中的手势识别器处于状态UIGestureRecognizerStateChanged。在UIPanGestureRecognizer 上使用translationInView: 方法来确定用户拖动了多少,并相应地更新拖动的视图中心/框架/变换。

    一旦用户抬起手指,最后一次调用 action 方法,并将gestureRecoginzers 状态设置为UIGestureRecognizerStateEnded。现在是时候看看拖动是否成功了。例如,popoverController 可以通过委托询问 mainController 视图当前位置下是否有放置目标,如果是,则 mainController 可以采取行动,否则 popoverController 会将拖动的视图动画化回原来的位置,并将其添加为子视图到它的视图。

    我希望这在某种程度上可以理解并有所帮助。

    【讨论】:

    • 非常感谢您的详细回答。我想我现在明白了。在 UIGestureRecognizerStateBegan 我将添加一个新的 UIView 到窗口,最后调整 UIGestureRecognizerStateEnded 中的所有内容并从窗口中删除 UIView 将是我的方法。再次感谢。
    猜你喜欢
    • 1970-01-01
    • 2011-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-19
    • 2016-10-19
    相关资源
    最近更新 更多