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

时间:2009-07-30 02:36:57

标签: iphone uitextview uimenucontroller

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

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

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

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

1 个答案:

答案 0 :(得分:2)

简短的回答是,你不能这样做。你有时可以,但不是很可靠。问题是“UITextView是一个非常特殊的情况,并且在iPhone OS 3.0中实际上不可能将其子类化以处理触摸。”*

解决这个问题的方法是将UIWindow子类化并覆盖其sendEvent方法,以便设置菜单的目标rect,然后显示菜单。

        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提交了一份增强请求。希望他们能在未来版本的OS中改变这一点。