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