6
votes

Champ de saisie du clavier Ionic 4

J'ai une application Ionic 4 qui contient un formulaire avec des entrées.
Lorsque l'utilisateur clique sur l'entrée, il ouvre le clavier, mais il masque le contenu, sans faire défiler.
Y a-t-il un moyen de contourner ce problème?

Voici mon code:

<form #f="ngForm" (ngSubmit)="sendMail()">
   <ion-item>
     <ion-label position="floating">name
     </ion-label>
     <ion-input [(ngModel)]="senderName">
     </ion-input>
   </ion-item>

   <ion-item>
      <ion-label position="floating">mail
      </ion-label>
      <ion-input [(ngModel)]="senderMail">
      </ion-input>
    </ion-item>

    <ion-item class="borderedTextArea">
      <ion-textarea [(ngModel)]="mailText" style="height:150px;"></ion-textarea>
    </ion-item>

    <ion-button type="submit" style="float:left">send</ion-button>

</form>


0 commentaires

5 Réponses :


0
votes

J'ai résolu ce bug Ionic provisoirement avec:

@ViewChild(IonTextarea)
public ionTextArea: IonTextarea;
private focusFix = false;

...
...

public fixTextareaBug() {
  setTimeout(() => {
    if (this.focusFix) {
      this.focusFix = false;
      return;
    }
    (this.ionTextArea as any).el.lastElementChild.blur();
    this.focusFix = true;
    (this.ionTextArea as any).el.lastElementChild.focus();
  }, TEXTAREA_TIMEOUT);
}

et dans votre .ts

...
<ion-texarea (ionFocus)="fixTextareaBug()">
...

J'espère que cela a résolu votre problème


0 commentaires

0
votes

J'avais ce problème aussi, mais uniquement sous Android, ce que j'ai fait était de créer un script qui obtenait la hauteur de l'élément focalisé et du clavier, et en utilisant jQuery, j'ai ajouté un marginTop pour déplacer le corps au-dessus du clavier lorsque le le clavier s'affiche, voici mon code:

this.keyboard.onKeyboardShow().subscribe((e) => {
    const safeArea = 40 ;
    const offset1 = $(document.activeElement).offset().top;
    const offset2 = window.innerHeight - e.keyboardHeight - $(document.activeElement).height() - safeArea ;
    const diff = offset1 - offset2;
    if(offset1 > window.innerHeight -  e.keyboardHeight - safeArea)
        $('body').animate({ 'marginTop': -1 * diff + 'px' }, 100);
});

libs nécessaires:

    import { Platform } from '@ionic/angular';
    import * as $ from "jquery";
    import { Keyboard } from '@ionic-native/keyboard/ngx';
   

importations

    npm install jquery
    npm install @types/jquery
    ionic cordova plugin add cordova-plugin-ionic-keyboard
    npm install @ionic-native/keyboard

Ce n'est pas une solution élégante mais cela fonctionne

Juste quelques changements dans ce code offriront une meilleure expérience

constructor(
    private platform: Platform,
    private keyboard: Keyboard
  ) {
    if(this.platform.is('android')){
      this.keyboard.onKeyboardShow().subscribe((e) => {
        const offset = $(document.activeElement).offset().top;
        let height = (offset - e.keyboardHeight)*-1;
        height = height > 0 ? 0 : height;      
        $('body').animate({ 'marginTop': height + 'px' }, 100);
      });
      this.keyboard.onKeyboardHide().subscribe(e => {
        $('body').animate({ 'marginTop': 0 + 'px' }, 100);
      });
    }
}


0 commentaires

10
votes

J'utilise actuellement Ionic4 avec Cordova 9 et tous les derniers packages, et je n'ai trouvé aucun paramètre dans le cadre qui fonctionnait pour moi. En fin de compte, j'ai fait cette solution de contournement qui contourne complètement le cadre. Il a une petite animation et semble plutôt correct, donc je l'utilise jusqu'à ce que le framework résout ce problème correctement.

global.scss

declare var $: any;

ngAfterViewInit() {
    // This element never changes.
    let ionapp = document.getElementsByTagName("ion-app")[0];

    window.addEventListener('keyboardDidShow', async (event) => {
        // Move ion-app up, to give room for keyboard
        let kbHeight: number = event["keyboardHeight"];
        let viewportHeight: number = $(window).height();
        let inputFieldOffsetFromBottomViewPort: number = viewportHeight - $(':focus')[0].getBoundingClientRect().bottom;
        let inputScrollPixels = kbHeight - inputFieldOffsetFromBottomViewPort;

        // Set margin to give space for native keyboard.
        ionapp.style["margin-bottom"] = kbHeight.toString() + "px";

        // But this diminishes ion-content and may hide the input field...
        if (inputScrollPixels > 0) {
            // ...so, get the ionScroll element from ion-content and scroll correspondingly
            // The current ion-content element is always the last. If there are tabs or other hidden ion-content elements, they will go above.
            let ionScroll = await $("ion-content").last()[0].getScrollElement();
            setTimeout(() => {
                $(ionScroll).animate({
                    scrollTop: ionScroll.scrollTop + inputScrollPixels
                }, 300);
            }, 300); // Matches scroll animation from css.
        }
    });
    window.addEventListener('keyboardDidHide', () => {
        // Move ion-app down again
        // Scroll not necessary.
        ionapp.style["margin-bottom"] = "0px";
    });
}

app.component.ts

ion-app {
    /*animation of native keyboard show*/
    transition: margin 300ms;
}


2 commentaires

pouvons-nous utiliser du javascript vanille au lieu de jQuery pour la fonction animate ()?


Oui, par exemple il y a une réponse sur le sujet ici: stackoverflow.com/questions/15521081/...



0
votes

Je résous ce problème en rétrogradant le plugin clavier

ionic cordova plugin remove cordova-plugin-ionic-keyboard

ionic cordova plugin add cordova-plugin-ionic-keyboard@2.0.5

, puis en supprimant la plate-forme Android et en l'ajoutant à nouveau


0 commentaires

0
votes

Résolvez-le simplement avec l'événement ionFocus et la fonction scrollToBottom, puis appelez-le dans ionFocus afin que lorsque vous vous concentrez sur l'entrée, votre contenu défile jusqu'en bas texte fort


2 commentaires

html. ts. @ViewChild (IonContent, {lire: IonContent, statique: false}) myContent: IonContent; ScrollToBottom () {setTimeout (() => {this.myContent.scrollToBottom (300);}, 1000); } showOptionsToggle (boo) {console.log ('Vrai ou faux: -', boo); this.ScrollToBottom (); }


Bienvenue dans StackOverflow. Veuillez modifier votre question pour ajouter des informations supplémentaires. N'utilisez pas de commentaires pour publier de gros morceaux de code.