1

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

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

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

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

4

1 回答 1

2

简短的回答是,你不能这样做。有时可以,但不是很可靠。问题是“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 *
于 2009-08-26T01:19:26.790 回答