2009-07-30 6 views
1

Ich habe ein UITextView direkt unter einer Ansicht mit einer Anzeige platziert. Wenn der Benutzer versucht, Text einzufügen, überlagert das Einfügemenü die Anzeige genau über dem Einfügepunkt . Ich möchte keine versehentlichen Klicks unterstützen, daher suche ich nach einer Möglichkeit, die Menüanzeige unter dem Einfügepunkt anstatt darüber anzuzeigen. Oder vielleicht gibt es eine Möglichkeit, den Menü-Controller zu glauben, dass die Textansicht bereits oben auf dem Bildschirm ist.So steuern Sie die Platzierung des Einfügemenüs in einem UITextView im iPhone SDK

Ich habe versucht, die setTargetRect: inView: -Methode auf dem sharedMenuController, aber das hat keine Auswirkungen. Offensichtlich verwendet die Textansicht nicht den freigegebenen Menücontroller.

Ich habe versucht, Variationen der folgenden Zeile zu meinem ViewController TextViewDidBeginEditing: TextView und ViewDidLoad Methoden ohne Glück.

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

Antwort

2

Die kurze Antwort ist, Sie können dies nicht tun. Das kann man manchmal, aber nicht sehr zuverlässig. Das Problem ist, dass "UITextView ist ein ziemlich spezieller Fall, und Unterklasse es für die Zwecke der Behandlung von Berührungen ist wirklich nicht möglich in iPhone OS 3.0." *

Der Weg um dies wäre zu Unterklasse UIWindow und überschreiben ihre SendEvent-Methode Damit wird das Ziel des Menüs rect gesetzt und das Menü angezeigt.

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

Allerdings gibt es vier Möglichkeiten, um ein Bearbeitungsmenü und das funktioniert nur in dem Fall zu bringen, wo das Menü durch ein Berührungsereignis direkt ausgelöst wird. In den anderen Fällen wird das Menü indirekt durch Berührung eines anderen ui-Elements erstellt (z. B. Auswählen oder Kopieren von Menüelementen oder Berühren eines blauen Auswahlpunkts).

Da ich den Speicherort des Menüs nicht zuverlässig steuern kann, habe ich mich entschieden, nach versteckten und angezeigten Benachrichtigungen zu suchen und die Benutzerinteraktion für meine Anzeigenansicht umzuschalten. Dies funktioniert jedoch auch nicht, da diese Benachrichtigungen nur ausgelöst werden, wenn das Menü als Ergebnis der Ausführung von setMenuVisible angezeigt wurde.

Wenn der Benutzer das UITextView drückt und hält, wird eine runde Lupe angezeigt. Wenn die Berührung beendet ist, erscheint ein Menü. Für diese Menüs und ihre Kinder ist es, soweit ich das beurteilen kann, unmöglich, ihre targetRect zu setzen oder Benachrichtigungen von ihnen zu erhalten. Ich gebe auf.

Ich habe eine Verbesserungsanfrage bei Apple eingereicht. Hoffentlich werden sie dies in einer zukünftigen Version des Betriebssystems ändern.