如何让 UIMenuController 为自定义视图工作?
我试图让以下代码工作:
UIMenuController * menu = [UIMenuController sharedMenuController];
[menu setTargetRect: CGRectMake(100, 100, 100, 100) inView: self.view];
[menu setMenuVisible: YES animated: YES];
菜单实例已准备就绪,但未显示 - 宽度始终为零。
或者这个 UIPasteboard/UIMenuController
主题有一些示例代码吗?
I'm trying to get the following code work:
UIMenuController * menu = [UIMenuController sharedMenuController];
[menu setTargetRect: CGRectMake(100, 100, 100, 100) inView: self.view];
[menu setMenuVisible: YES animated: YES];
The menu instance is ready but it doesn't show - the width is always zero.
Or is there some sample code on this UIPasteboard/UIMenuController
topic?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(9)
即使我阅读了您的所有答案,我也无法使其正常工作。 我正在提供适用于每个人的现成代码。
假设我们有一个名为 Controller 的控制器类。 您可以简单地将以下代码粘贴到该控制器中,以使菜单在其视图上工作:
为了使菜单工作,必须做的是第一个响应者(在我们的例子中是我们的控制器 - 请参见[self一成为FirstResponder]行)能够成为第一响应者(覆盖方法 canBecomeFirstResponder 导致默认实现返回 NO)以及
- (BOOL) canPerformAction:(SEL)selector withSender:(id) sender
,它应该对任何操作返回 YES可以由firstResponder
执行I was not able to get it working even when I read all of your answers. I'm presenting ready code that will work for everyone.
Let's say we have a controller class named Controller. You can simply paste the following code to this controller to have the menu working on its view:
What has to be done in order for menu to work is that the firstResponder(in our case our controller - see line with [self becomeFirstResponder]) has to be able to become first responder (override method canBecomeFirstResponder cause default implementation returns NO) as well as
- (BOOL) canPerformAction:(SEL)selector withSender:(id) sender
which should return YES to any action that can be performed byfirstResponder
如果您正在实现自定义视图并且该视图应该是响应者(而不是其他视图,例如 UITextField),则需要覆盖视图中的 canBecomeFirstResponder 函数并返回 YES:
然后,当您显示菜单时,您应该执行如下操作:
If you're implementing a custom view and that view is supposed to be the responder (as opposed to some other view, like a UITextField), you need to override the canBecomeFirstResponder function in your view and return YES:
then, when you're displaying the menu, you should do something like the following:
如果有人仍然遇到问题:我的菜单曾经可以工作,有一天却奇迹般地停止工作了。 我的应用程序中的其他所有内容仍然有效。 现在我已经从
application:didFinishLaunchingWithOptions:
方法中删除了[window makeKeyAndVisible]
方法,虽然其他一切仍然有效,但这会破坏UIMenuController
!我这边犯了愚蠢的错误,很难找到罪魁祸首......
In case somebody still has problems: My menu used to work and some day stopped working miraculously. Everything else in my app still worked. Now I had removed the
[window makeKeyAndVisible]
method fromapplication:didFinishLaunchingWithOptions:
method, and while everything else still worked, this breaksUIMenuController
!Stupid error on my side, difficult to find the culprit...
要显示 UIMenuController 必须添加以下内容
to display UIMenuController one has to add following
我认为 Cam 是对的,需要覆盖 canPerformAction 和 canBecomeFirstResponder
I think Cam is right, need override both canPerformAction and canBecomeFirstResponder
您需要在 canPerformAction:withSender: 中添加更多代码 - 它应该检查粘贴板和您的选择状态。 Apple 的 iPhone 应用程序编程指南提供了几个代码片段。
You need to add more code in canPerformAction:withSender: - it should check the pasteboard and your selection state. Apple's iPhone Application Programming Guide provide several code snippets.
您不需要将 UIMenuController* 菜单添加到主视图或子视图 EG
self.view
吗?我认为它类似于
[self.view addSubView:menu.view];
或者我错过了你的问题的要点。 您可能还想设置菜单视图的框架。Don't you have to add the
UIMenuController* menu
to the main or subview, E.G.self.view
?I think it's something like
[self.view addSubView:menu.view];
Or am I missing the point of your question. You might also want to set the frame of the menu's view.UIMenuController 没有视图。 我刚刚从苹果的 iPhone 应用程序编程中搜索了一些代码指南:事件处理:
UIMenuController doesn't have a view. I just searched some code from apple's iPhone Application Programming Guide: Event Handling:
我按照下面的方式做到了。 只需在 init 中经过很短的延迟后调用显示菜单的方法即可。 我不想从视图控制器调用它,也没有找到指示我的自定义视图出现并且我已准备好显示菜单的事件。 所以从我的角度来看,这样就可以了。 延迟可以更短,但这取决于你。
I did it in the following way below. Just call the method that shows the menu after very short delay in init. I didn't want to call it from View Controller and also didn't find an event that indicates that my custom view appeared and i'm ready to show menu. So this way OK from my perspective. Delay can be less, but its up to you.