gpt4 book ai didi

iphone - 选择文本时如何用我自己的 View 替换 UIMenuController?

转载 作者:IT王子 更新时间:2023-10-29 08:01:05 25 4
gpt4 key购买 nike

选择文本时,默认情况下,uimenucontroller弹出了剪切/复制/粘贴等。

enter image description here

我想用我自己的自定义 View 替换它(外观相似,但高两倍,以便我可以有两行按钮/自定义 View )。我该怎么做?

我知道没有简单的方法。我希望如果有一个简单的解决方案,它不会很优雅。该代码也不能使用任何私有(private) API。

我真的,真的宁愿不必实现我自己的 TextView ,重新实现文本选择和输入,并重新实现放大 View ,这样我就可以编写自己的 UIMenuController 克隆(如果有任何方法可以避免的话)。我可以替换 UIMenuController 对应用程序的界面非常重要,所以如果没有其他答案,那么我可能最终会这样做。如果有人能为我节省大量时间并提出另一种更简单的方法,我将不胜感激!

最佳答案

在开始之前,您必须了解三件重要的事情:

1) 您必须编写自定义菜单 Controller View ,但我猜您有点预料到了。我只知道一个commercial自定义菜单 Controller 的实现,但这应该不会太难。

2) UIResponder 上有一个有用的方法,叫做 -canPerformAction:withSender:。在 UIResponder Class Reference 中阅读更多相关信息.您可以使用该方法来确定您的 TextView 是否支持特定的标准操作(在 UIResponderStandardEditActions 协议(protocol)中定义)。
这在决定在您的自定义菜单 Controller 中显示哪些项目时非常有用。例如,只有当用户的粘贴板包含要粘贴的字符串时,才会显示粘贴菜单项。

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

现在您已经了解了所有这些,这就是我开始处理该问题的方式:

1) 当 TextView 是第一响应者时监听 UIMenuControllerWillShowMenuNotification

- (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) 显示您的自定义菜单 Controller 而不是默认的 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 上弹出了一个新的菜单实现,您可能想看看:https://github.com/questbeat/QBPopupMenu

更新 2:
this answer 中所述您可以使用 -caretRectForPosition: 获取 TextView 的选定文本的框架。

关于iphone - 选择文本时如何用我自己的 View 替换 UIMenuController?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14595587/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com