如何在 iPhone SDK 的 UITextView 中控制粘贴菜单的放置

Posted

技术标签:

【中文标题】如何在 iPhone SDK 的 UITextView 中控制粘贴菜单的放置【英文标题】:How to control placement of paste menu in a UITextView in iPhone SDK 【发布时间】:2009-07-30 02:36:56 【问题描述】:

我在包含广告的视图下方放置了一个 UITextView,当用户尝试粘贴文本时,粘贴菜单会覆盖插入点上方的广告。我不想鼓励意外点击,所以我正在寻找一种方法使菜单显示在插入点下方而不是在其上方。或者也许有一种方法可以让菜单控制器认为文本视图已经在屏幕顶部。

我尝试在 sharedMenuController 上使用 setTargetRect:inView: 方法,但没有效果。显然文本视图不使用共享菜单控制器。

我尝试将以下行的变体添加到我的视图控制器的 textViewDidBeginEditing:textView 和 viewDidLoad 方法中,但没有成功。

[[UIMenuController sharedMenuController] setTargetRect: CGRectMake(140, 120, 5, 5) inView:self.view];

【问题讨论】:

【参考方案1】:

简短的回答是,你不能这样做。有时可以,但不是很可靠。问题是“UITextView 是一个非常特殊的情况,在 iPhone OS 3.0 中,为了处理触摸而对它进行子类化是不可能的。”*

解决这个问题的方法是继承 UIWindow 并覆盖其 sendEvent 方法,以便设置菜单的目标矩形,然后显示菜单。

        UIMenuController *menu = [UIMenuController sharedMenuController]; 
        CGRect selectionRect = CGRectMake(0, 0, 270, 100); 
        [theMenu setTargetRect:selectionRect inView:theTextView.superview]; 
        [menu setMenuVisible:YES animated:YES];

但是,有 4 种方法可以调出编辑菜单,这仅适用于菜单由触摸事件直接触发的情况。在其他情况下,菜单是通过触摸另一个 ui 元素(例如,选择或复制菜单项,或触摸蓝色选择点)而间接创建的。

由于我无法可靠地控制菜单的位置,我决定监听隐藏和显示通知,并为我的广告视图切换用户交互。但这也不起作用,因为这些通知仅在您执行 setMenuVisible 后显示菜单时才会触发。

如果用户在 UITextView 中按下并按住,则会出现一个圆形放大镜。当触摸结束时,会出现一个菜单。据我所知,对于这些菜单及其子菜单,不可能设置它们的 targetRect 或从它们那里获取通知。我放弃了。

我向 Apple 提交了增强请求。希望他们能在未来的操作系统版本中改变这一点。

参考:https://devforums.apple.com/message/83743#83743 *

【讨论】:

以上是关于如何在 iPhone SDK 的 UITextView 中控制粘贴菜单的放置的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 iOS 6 sdk 为 iPhone 4s 或 iPhone 4 制作视图控制器?

您如何在 iPhone 上为 PayPal 的电话 SDK 保护您的 PayPal 应用程序 ID?

如何使用最新的 SDK 为原始“iPhone”开发?

如何在 iphone sdk 中使用 openlayers

如何在 UItextView 中添加 placeHolder 文本?在 iphone sdk [重复]

如何使用 iphone sdk 在 ipAd 控制器中发布我们自己的 iphone 应用程序广告?