Как управлять размещением меню вставки в UITextView в iPhone SDK - PullRequest
1 голос
/ 30 июля 2009

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

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

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

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

1 Ответ

2 голосов
/ 26 августа 2009

Краткий ответ: вы не можете этого сделать. Вы можете иногда, но не очень надежно. Проблема заключается в том, что «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. Надеюсь, они изменят это в следующей версии ОС.

...