![]() |
[mobile OS] Virtuelle Tastatur verdeckt Controls
Wir schreiben 2016 und haben eine Entwicklungsumgebung, die so ausgereift sein soll, daß sie nach einer recht verregneten Stadt benannt wurde. Und was geht nicht "out of the box"? Die Software Tastatur verdeckt unter Umständen das Control in das gerade getippt werden soll. Nun haben sich über die Jahre wohl einige Leute Gedanken gemacht, wie das zu lösen ist. Allerdings sind die Lösungen entweder verschollen, oder schlicht unausgegoren...oder ich bin zu dämlich sie zu finden.
Hier mal die Ansätze die ich bisher gefunden habe, die aber aus dem einen oder anderen Grund nicht wirklich befriedigend sind: ![]() ![]() ![]() Hat einer von Euch eventuell eine allgemeingültige Lösung parat? Das muss doch mittlerweile jeder in Verwendung haben, der mobile Applikationen erstellt....denke ich. Danke und schönes Wochenende, Sherlock |
AW: [mobile OS] Virtuelle Tastatur verdeckt Controls
Das ist bis heute Standard-Verhalten auf den mobilen Plattformen - losgelöst von Delphi musst Du eine Scrollbox nutzen und auf die vom System ausgelösten Ereignisse der Tastatur reagieren. Das ist mit Xcode oder den Tools von Google nicht anders.
Eine universelle Lösung könnte nur ein Basis-Container mit einer Scrollbox sein, wenn ich mir aber die kreative Vielfalt der Apps da draußen ansehe, wird es wohl immer zwangsläufig auf individuelle Lösungen hinauslaufen. |
AW: [mobile OS] Virtuelle Tastatur verdeckt Controls
Basis bildet eine VertScrollbox mit TAlignLayout.alClient, die als Container für alle Controls dient.
Im Form-Event FormFocusChanged:
Delphi-Quellcode:
UpdateKBounds:
procedure TfrmMain.FormFocusChanged(Sender: TObject);
begin {$IFDEF IOS} UpdateKBBounds; {$ENDIF IOS} end;
Delphi-Quellcode:
RestorePosition:
{$IFDEF IOS}
procedure TfrmMain.UpdateKBBounds; var LFocused : TControl; LFocusRect: TRectF; begin FNeedOffset := False; if Assigned(Focused) then begin LFocused := TControl(Focused.GetObject); LFocusRect := LFocused.AbsoluteRect; LFocusRect.Offset(VertScrollBox1.ViewportPosition); if (LFocusRect.IntersectsWith(TRectF.Create(FKBBounds))) and (LFocusRect.Bottom > FKBBounds.Top) then begin FNeedOffset := True; laMain.Align := TAlignLayout.alHorizontal; VertScrollBox1.RealignContent; Application.ProcessMessages; VertScrollBox1.ViewportPosition := PointF(VertScrollBox1.ViewportPosition.X, LFocusRect.Bottom - FKBBounds.Top-15); end; end; if not FNeedOffset then RestorePosition; end; {$ENDIF ENDIF}
Delphi-Quellcode:
{$IFDEF IOS}
procedure TfrmMain.RestorePosition; begin VertScrollBox1.ViewportPosition := PointF(VertScrollBox1.ViewportPosition.X, 0); laMain.Align := TAlignLayout.alClient; VertScrollBox1.RealignContent; end; {$ENDIF ENDIF}
Delphi-Quellcode:
FormCreate:
private
{ Private-Deklarationen } public { Public-Deklarationen } {$IFDEF IOS} FKBBounds: TRectF; FNeedOffset: Boolean; procedure CalcContentBoundsProc(Sender: TObject; var ContentBounds: TRectF); procedure RestorePosition; procedure UpdateKBBounds; function SharedApplication:UIApplication; {$ENDIF} end;
Delphi-Quellcode:
und CalcContentBoundsProc:
procedure TfrmMain.FormCreate(Sender: TObject);
begin {$IF Defined(IOS)} VertScrollBox1.OnCalcContentBounds := CalcContentBoundsProc; {$ENDIF} end;
Delphi-Quellcode:
Quelle ist mir leider nicht mehr bekannt.
{$IFDEF IOS}
procedure TfrmMain.CalcContentBoundsProc(Sender: TObject; var ContentBounds: TRectF); begin if FNeedOffset and (FKBBounds.Top > 0) then begin ContentBounds.Bottom := Max(ContentBounds.Bottom, 2 * ClientHeight - FKBBounds.Top); end; end; {$ENDIF} |
AW: [mobile OS] Virtuelle Tastatur verdeckt Controls
Ich habe dafür schon vor einigen Wochen eine QC-Eintrag erstellt, da die von dir verlinkte Variante nur so leidlich funktioniert und kaum gepflegt wird:
![]() |
AW: [mobile OS] Virtuelle Tastatur verdeckt Controls
Zitat:
Grüsse Mavarik |
AW: [mobile OS] Virtuelle Tastatur verdeckt Controls
Alles klar, danke Euch allen für die Präsentation des Status Quo. Ich versuche das dann entsprechend noch einzubauen. Noch ein kleine Stichelei sei mir bitte genehmigt: Auch der hier gepostete Beispielcode ist nur für iOS, nicht für Android (zumindest laut den Compilerdirektiven, näher habe ich ihn mir nicht angesehen, das kommt jetzt gleich). Außerdem entspricht das eben nicht zu 100% dem iOS Look&Feel (Zum Vergleich: Öffnet mal zB die WLAN-Optionen auf einem 6+ im Querformat. Da bleibt die MultiView für die Auswahl der Einstellungen sichtbar, und scrollt eben nicht weg, wenn man dann auf ein Edit geht, daß für die Tastatur hochgescrollt werden muss. Es wird nur der Detail-Bereich gescrollt.
Mavarik: Vielen Dank für das Angebot! Das hört sich sehr interessant an. Ich muß allerdings diese Woche mein Projekt abschließen, und werde erst danach Zeit haben für entsprechende Tests. Sherlock |
AW: [mobile OS] Virtuelle Tastatur verdeckt Controls
Zitat:
Den ganzen Code sollte man eh mal auslagern, dann könnte man die Einbindung auf einen Event reduzieren... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:51 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz