2012-08-03 7 views
9

Nach einem richtigen Blick auf ein UITextField hinzufügen, ich finde, dass es sowohl die rechte Ansicht und die Löschtaste (mit sowohl rightViewMode und clearButtonMode Satz UITextFieldViewModeAlways) angezeigt werden verweigert. Ich sehe die richtige Ansicht, aber die Löschtaste wird nicht mehr angezeigt. Ich habe sichergestellt, dass sie sich nicht überschneiden, indem sie clearButtonRectForBounds und clearButtonRectForBounds außer Kraft gesetzt haben, ohne Erfolg. Und wenn ich den leftView anstelle von rightView verwende, dann tritt kein solches Problem auf und sowohl die linke Ansicht als auch der Clear Button werden angezeigt.Anzeige sowohl eine rechte Ansicht und eine Löschtaste in UITextField

Obwohl es scheint nicht in der Dokumentation angegeben zu sein, es sieht für mich aus wie die Schaltfläche deaktivieren wird nur angezeigt, wenn die rechte Ansicht nicht angezeigt wird (und wenn die Texteigenschaft keine leere Zeichenfolge ist). Ist das korrekt und hat jemand einen zuverlässigen Workaround? In der Zwischenzeit glaube ich, dass ich daran festhalte, eine UIView zu erstellen, die meine rechte Ansicht über einem UITextField überlagert, um das zu bekommen, was ich von UITextField alleine bekommen würde.

Antwort

3

Ja, Sie haben Recht. UITextfield hat Eigenschaften wie linke und rechte Ansicht. Wenn Sie die Schaltfläche "Löschen" verwenden, wird die rechte Ansicht überlagert.

Formular Apple-doc http://developer.apple.com/library/ios/#DOCUMENTATION/UIKit/Reference/UITextField_Class/Reference/UITextField.html

Wenn Ihre Überlagerungsansicht überlappt keine andere Geschwister-Ansichten, erhält es Berührungsereignisse wie jede andere Ansicht. Wenn Sie ein Steuerelement für Ihre Ansicht angeben, verfolgt und sendet diese Kontrolle die üblichen Aktionen. Wenn eine Überlagerungsansicht die Schaltfläche "Löschen" überlappt, hat die Schaltfläche "Löschen" beim Empfangen von Ereignissen jedoch immer Vorrang. Standardmäßig überlappt die rechte Überlagerungsansicht die Löschschaltfläche.

Aber wie der Name sagt, ist es eine Ansicht. So können Sie Ihre eigene Ansicht mit 2 Schaltflächen erstellen und die rechte Ansicht des Textfelds festlegen. Wenn Sie möchten, können Sie Delegate-Methoden des Textfelds verwenden, um Ihre Schaltflächen anzuzeigen und aus der Ansicht zu entfernen.

+0

Die Dokumentation scheint irreführend. Es besagt nicht, dass sich die klare Schaltfläche und die rechte Ansicht gegenseitig ausschließen. Es sagt nur, dass sie sich überschneiden. Das sieht so aus, als würde ich eine transparente Ansicht verwenden, würde ich den klaren Knopf sehen. Das ist jedoch nicht der Fall. – Kento

13

Sie beide zur gleichen Zeit nicht angezeigt werden können, aber man kann es wie folgt ich

UITextField * textfield = [[UITextField alloc] initWithFrame:CGRectMake(10, 100, 300, 40)]; 

[textfield setBorderStyle:UITextBorderStyleRoundedRect]; 

UIImageView * imgvw = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"search.jpeg"]]; 

[imgvw setFrame:CGRectMake(0, 0, 30, 30)]; 

[textfield setRightView:imgvw]; 

[textfield setRightViewMode:UITextFieldViewModeUnlessEditing]; 

[textfield setClearButtonMode:UITextFieldViewModeWhileEditing]; 

[self.view addSubview:textfield]; 
+0

Wunderbare Antwort! –

3

tun das gleiche Problem hatte, aber durch ‚täuscht‘ die UITextField leicht gelöst wurde die LeftView in anstelle von Rechte Ansicht. Auf diese Weise können Sie sowohl die Löschtaste als auch Ihre angenommene rightView verwenden. Alles, was Sie tun müssen, ist Unterklasse UITextField und geben Sie die 'rechte Ecke' in leftViewRectForBounds und in ähnlicher Weise aktualisieren editingRectForBounds und textRectForBounds. Funktioniert perfekt.

+0

Ich fand es einfacher, nur eine Unteransicht hinzuzufügen und 'editingRectForBounds/textRectForBounds' zu überschreiben, um es zu vermeiden. Ich musste 'leftView' nicht verwenden (da ich immer meine Unteransicht anzeigen lassen möchte.) – zekel

+1

Wenn Sie einen Beispielcode hinzufügen möchten, gebe ich Ihnen eine Upvote :) – Tim

+0

Funktioniert gut, aber ich musste 'placeholderRectForBounds' auch überschreiben, damit es richtig funktioniert. – execv

2

Ich werde @strange ‚s Antwort (mit der linken Ansicht statt rechts) mit einigen Code sichern:

-(CGRect)leftViewRectForBounds:(CGRect)bounds 
{ 
    return CGRectOffset([super leftViewRectForBounds:bounds], bounds.size.width - 30, 0); 
} 

-(CGRect)clearButtonRectForBounds:(CGRect)bounds 
{ 
    return CGRectOffset([super clearButtonRectForBounds:bounds], -30, 0); 
} 


-(CGRect)editingRectForBounds:(CGRect)bounds 
{ 
    CGRect rect = bounds; 
    rect.origin.x = 10; 
    rect.size.width -= 60; 
    return rect; 
} 


-(CGRect)textRectForBounds:(CGRect)bounds 
{ 
    CGRect rect = bounds; 
    rect.origin.x = 10; 
    rect.size.width -= 60; 
    return rect; 
} 

Bitte beachte, dass mein rechts (links) Ansicht Breite 30

ist, wenn Sie verwenden zufällig sowohl die linke als auch die rechte Ansicht und die Löschtaste, dann wird diese Lösung offensichtlich nicht funktionieren. In diesem Fall müssen Sie aufgeben und eine separate Ansicht neben Ihrem UITextField verwenden.

Verwandte Themen