iphone – 如何选择文本时如何替换UIMenuController与我自己的视图?

iphone – 如何选择文本时如何替换UIMenuController与我自己的视图?,第1张

概述当选择文本时,默认情况下,UIMenuController会d出剪切/复制/粘贴等。 我想用我自己的自定义视图替换它(类似的看法,但是两倍高,以便我可以有两行按钮/自定义视图)。我该怎么做? 我知道没有简单的方法。我期待如果有一个简单的解决方案,它不会非常优雅。代码也不能使用任何私有API。 我真的真的不需要实现我自己的文本视图,重新实现文本选择和输入,并重新实现放大视图,这样我可以编写自己的U 当选择文本时,默认情况下,UIMenuController会d出剪切/复制/粘贴等。

我想用我自己的自定义视图来替换它(类似的看法,但是两倍高,以便我可以有两行按钮/自定义视图)。我该怎么做?

我知道没有简单的方法。我期待如果有一个简单的解决方案,它不会非常优雅。代码也不能使用任何私有API。

我真的真的不需要实现我自己的文本视图,重新实现文本选择和输入,并重新实现放大视图,这样我可以编写自己的UIMenuController克隆,如果有任何方法来避免它。对于应用程序的界面来说,我可以替换UIMenuController非常重要,所以如果没有其他答案,那么我可能会这样做。如果有人可以拯救我一个体面的时间,我会非常感激,并提出另一个更容易的方法!

解决方法 在开始之前,您必须先了解以下三件重要事项:

1)您必须编写自定义菜单控制器视图,但我猜想你有这样的想法。我只知道一个commercial实现的自定义菜单控制器,但这不应该太难了。

2)在名为-canPerformAction的UIResponder中有一个有用的方法:withSender:。在UIResponder Class Reference中了解更多信息。您可以使用该方法来确定您的文本视图是否支持特定的标准 *** 作(在UIResponderStandardEditActions协议中定义)。
当您决定在自定义菜单控制器中显示哪些项目时,这将非常有用。例如,只有当用户的粘贴板包含要粘贴的字符串时,才会显示“粘贴”菜单项。

3)您可以通过监听UIMenuControllerWillShowMenuNotification通知来检测UIMenuController何时显示。

现在你知道所有这一切,这是我如何开始解决的:

1)当文本视图是第一个响应者时,收听UIMenuControllerWillShowMenuNotifications

- (voID)textVIEwDIDBeginEditing:(UITextVIEw *)textVIEw {    [[NSNotificationCenter defaultCenter] addobserver:self selector:@selector(menuWillBeShown:) name:UIMenuControllerWillShowMenuNotification object:nil];}- (voID)textVIEwDIDEndEditing:(UITextVIEw *)textVIEw {    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIMenuControllerWillShowMenuNotification object:nil];}

2)显示您的自定义菜单控制器,而不是默认的UIMenuController

- (voID)menuWillBeShown:(NSNotification *)notification {    CGRect menuFrame = [[UIMenuController sharedMenuController] menuFrame];    [[UIMenuController sharedMenuController] setMenuVisible:NO animated:NO]; // Don't show the default menu controller    CustomMenuController *controller = ...;    controller.menuItems = ...;    // additional stuff goes here    [controller setTargetRectWithMenuFrame:menuFrame]; // menuFrame is in screen coordinates,so you might have to convert it to your menu's presenting vIEw/window/whatever    [controller setMenuVisible:YES animated:YES];}

杂项。 1)您可以使用全屏UIWindow来显示自定义菜单,以便它可以与状态栏重叠。

UIWindow *presentingWindow = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];presentingWindow.windowLevel = UIWindowLevelStatusbar + 1;presentingWindow.backgroundcolor = [UIcolor clearcolor];[presentingWindow addSubvIEw:controller];[presentingWindow makeKeyAndVisible];

杂项。 2)要确定哪些菜单项可以显示,可以使用所提到的-canPerformAction:withSender:

BOol canPaste = [textVIEw canPerformAction:@selector(paste:) withSender:nil];BOol canSelectAll = [textVIEw canPerformAction:@selector(selectAll:) withSender:nil];

杂项。 3)您必须通过在展示窗口上使用UITapGestureRecognizer来处理自己的菜单。

这不容易,但它是可行的,我希望它适用于你。祝你好运!

更新:
今天在cocoacontrols.com上d出一个新的菜单实现,您可能需要查看:https://github.com/questbeat/QBPopupMenu

更新2:
如this answer所述,您可以使用-caretRectForposition:获取文本视图的所选文本的框架。

总结

以上是内存溢出为你收集整理的iphone – 如何选择文本时如何替换UIMenuController与我自己的视图?全部内容,希望文章能够帮你解决iphone – 如何选择文本时如何替换UIMenuController与我自己的视图?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1086927.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-27
下一篇 2022-05-27

发表评论

登录后才能评论

评论列表(0条)

保存