Как управлять размещением меню вставки в UITextView в iPhone SDK

У меня есть UITextView, размещенный чуть ниже представления, содержащего рекламу, и когда пользователь пытается вставить текст, меню вставки перекрывает рекламу, которая находится чуть выше точки вставки. Я не хочу поощрять случайные клики, поэтому я ищу способ сделать так, чтобы меню отображалось под точкой вставки, а не над ней. Или, может быть, есть способ обмануть контроллер меню, заставив его думать, что текстовое представление уже находится в верхней части экрана.

Я пробовал использовать метод setTargetRect:inView: для sharedMenuController, но это не дало результата. По-видимому, текстовое представление не использует общий контроллер меню.

Я безуспешно пытался добавить варианты следующей строки в методы textViewDidBeginEditing:textView и viewDidLoad моего контроллера представления.

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


person Dawn    schedule 30.07.2009    source источник


Ответы (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 способа вызвать меню редактирования, и это работает только в том случае, если меню вызывается непосредственно событием касания. В других случаях меню создается косвенно в результате прикосновения к другому элементу пользовательского интерфейса (например, выбор или копирование пунктов меню или прикосновение к синей точке выбора).

Поскольку я не могу надежно контролировать расположение меню, я решил прослушивать скрытие и отображение уведомлений и переключать взаимодействие с пользователем для просмотра рекламы. Но это тоже не работает, поскольку эти уведомления срабатывают только в том случае, если меню было отображено в результате выполнения вами setMenuVisible.

Если пользователь нажимает в UITextView и удерживает, появляется круглое увеличительное стекло. Когда касание заканчивается, появляется меню. Для этих меню и их дочерних элементов, насколько я могу судить, невозможно установить их targetRect или получать от них уведомления. Я сдаюсь.

Я подал запрос на улучшение в Apple. Надеюсь, они изменят это в будущей версии ОС.

person Dawn    schedule 26.08.2009