2012-09-24 15 views
10

Ich verwende eine Symbolleiste in der Eigenschaft inputAccessoryView eines textView. Wenn die Tastatur angezeigt wird, wird die Symbolleiste wie erwartet angezeigt. Wenn das Gerät gedreht wird, möchte ich die Symbolleiste entfernen. Ich habe versucht:So blenden Sie inputAccessoryView aus, ohne die Tastatur zu verwerfen

myTextView.inputAccessoryView.hidden = !layoutIsPortrait; 

Dies versteckt die Symbolleiste, aber hinterlässt den Umriss der höheren Tastatur. Die Tastatur ist anscheinend immer noch so groß, dass sie in die Symbolleiste passt. Es sieht schlecht aus und beeinträchtigt Berührungsereignisse der zugrunde liegenden Responder.

myTextView.inputAccessoryView = nil; 

funktioniert nur, wenn ich ResignFirstResponder, dann wieder becomeFirstResponder. Das ist nicht akzeptabel. Ich verliere die Cursor-Platzierung und den Inhalt des TextView, Tastatur blinkt aus und zurück.

[myTextView.inputAccessoryView removefromSuperview]; 

Geht gar nichts. gespeichert ich einen Verweis auf die Symbolleiste in einem iVar und adressiert, dass stattdessen

[myIvarReference removeFromSuperview]; 

das funktioniert, aber wieder die größere Umriss der Tastatur ist schwach sichtbar. Diesmal stört es nicht die Berührungen anderer Ansichten. So, jetzt ist dies eine funktionierende Lösung, aber visuell inakzeptabel. Was kann ich sonst noch versuchen, die EingabeAccessoryView nach Belieben ein- und auszublenden?

Screenshot- die schwache Linie oberhalb der Tastatur ist Überbleibsel der entfernten Symbolleiste

Rotated keyboard with toolbar removed

+0

Würde es Ihnen etwas ausmachen, einen Screenshot von dem zu veröffentlichen, was Sie mit "Umriss der höheren Tastatur" meinen? Ich habe das Gefühl, dass die Lösungen, die du erwähnt hast, funktionieren sollten (zumindest eine davon), aber ich bin mir nicht sicher, was für dich ästhetisch akzeptabel ist ... – geraldWilliam

+0

Ich habe eine Nahaufnahme des Screenshots hinzugefügt –

+0

Ich kann es nicht testen gerade jetzt aber tut myTextView.inputAccessoryView.frame = CGRectZero tun, was Sie suchen? – geraldWilliam

Antwort

2

nie einen Weg zu ändern, um den Rahmen der Tastatur. Letztendlich entschied ich mich dafür, auf die inputAccessoryView zu verzichten, meine Toolbar direkt in die Ansicht als Unteransicht einzufügen und sie direkt mit der Tastatur zu animieren. Dies hält die beiden unabhängig und so, keine Linie mehr.

23
myTextView.inputAccessoryView = nil; 
[myTextView reloadInputViews]; 

Dies entfernt die Symbolleiste aus der Ansicht und lädt die Ansicht neu. Auf diese Weise müssen Sie nicht residentFirstResponder und firstResponder aufrufen. Darüber hinaus bleiben die Position und der Inhalt des Cursors erhalten.

+1

Danke. Ich habe danach gesucht. Dieser sollte die akzeptierte Antwort sein. 1 nach oben! – karim

4

Für mich hat Erics Lösung nie tatsächlich den Rahmen oder die Touch-Bereiche zurückgesetzt. Vermutlich ist es ein Fehler, wie Apple mit Dingen umgeht. Ich habe jedoch einen Workaround gefunden, der das Problem für mich gelöst hat. Wenn ich einen neuen inputAccessoryView ohne Rahmen gesetzt, arbeitete reloadInputViews fein:

myTextView.inputAccessoryView = [[UIView alloc] initWithFrame: CGRectZero]; 
[myTextView reloadInputViews]; 
2

Keine der oben genannten Antworten arbeiten waren für mich und reloadInputViews seltsame Probleme verursachte.Schließlich habe ich es berührt Pass-Through ein- und ausblenden und haben, indem Sie:

ausblenden es:

[textview.inputAccessoryView setHidden:YES]; 
[textview.inputAccessoryView setUserInteractionEnabled:NO]; 

Zeigen Sie es:

[textview.inputAccessoryView setHidden:NO]; 
[textview.inputAccessoryView setUserInteractionEnabled:YES]; 
0

Xamarin Code

Control.InputAccessoryView = new UIView(CGRect.Empty); 
Control.ReloadInputViews(); 
+0

Im Allgemeinen sollte eine Antwort mehr als nur ein Code-Snippet enthalten, wie eine Erklärung, warum es funktioniert. –

+0

es war nur jungziges Antwort für xamarin .................................. – shane

+0

umgeschrieben Dann geben Sie Ihre Antwort an so etwas wie "Converting Jungziege die Antwort auf C# und Xamarin ergibt ..." Besonders in dem Fall, wo Ihre Antwort baut auf jemand anderen beantworten, ist es nützlich und höflich, die ursprüngliche Antwort auch zu verweisen. –

0

basiert auf Eric Appels Antwort:

myTextView.inputAccessoryView = nil; 
[myTextView reloadInputViews]; 
hideInputAccessoryView = YES; 

Weitere ändern:

- (BOOL)canBecomeFirstResponder 
{ 
    BOOL showInputAccessoryView = YES; 

    if (hideInputAccessoryView) 
     showInputAccessoryView = NO; 

    return showInputAccessoryView; 
} 

Dies sollte InputAccessoryView verstecken, auch wenn die Tastatur zurückgetreten ist.

0

Seltsamerweise funktionierte keiner dieser Ansätze in meinem Fall.

Ich habe einen Suchcontroller, der eine Standard-Apple-iOS-Tastatur öffnet, wenn ein bestimmter Suchbereich ausgewählt ist, und eine benutzerdefinierte Tastaturansicht mit einer Sammlungsansicht als Eingabefeld, wenn andere Bereiche ausgewählt sind. In beiden Fällen wurde eine unerwünschte Zubehöransicht auf dem Bildschirm gezeichnet, wenn die Eingabeansicht angezeigt wurde.

So

self.mySearch.searchbar.inputAccessoryView = nil // did not work 

[self.mySearch.searhbar.inputAccessoryView setHidden:YES] // did not work 

self.mySearch.inputAccessoryView = nil // did not work 

self.mySearch.searchbar.inputAccessoryView.frame = CGRectZero //did not work 

[self.mySearch reloadInputViews] 

und verschiedene Kombinationen davon usw. usw.

Was Arbeit tat, war auf einzelne Zubehörteile aus dem Zubehör Ansicht zu löschen:

// insert after assignments of mySearch delegates 
UITextInputAssistantItem *junk = [self.mySearch inputAssistantItem]; 
junk.leadingBarButtonGroups = @[]; 
junk.trailingBarButtonGroups = @[]; 
0
mTextView.inputAccessoryView = [[UIView alloc] initWithFrame:CGRectZero]; 
[mTextView reloadInputViews]; 

funktioniert für mich, Einstellung inputAccessoryViewnil wird nicht funktionieren, ich nur nicht kn Warum?

Verwandte Themen