Ionic 2 Form идет вверх, когда клавиатура показывает

Я использую последнюю версию ionic 2. Мой код имеет <ion-content padding><form></form></ion-content> с вводом текста внутри него. Когда я пытаюсь что-то напечатать на Android, клавиатура толкает всю страницу вверх.

HTML-файл

<ion-content class="login-screen" padding>
  <form (ngSubmit)="login()" novalidate>
    <ion-list>
      <ion-item>
        <ion-label fixed>Username</ion-label>
        <ion-input type="text" name="username" [(ngModel)]="username" required></ion-input>
      </ion-item>
      <ion-item>
        <ion-label fixed>Password</ion-label>
        <ion-input type="password" name="password" [(ngModel)]="password" required></ion-input>
      </ion-item>
    </ion-list>
    <button ion-button full type="submit">Login</button>
  </form>
  <button ion-button clear full outline type="button" (click)="openModal()">Forgot Password?</button>
</ion-content>

есть ли решения?

4 ответа

Это все должно быть исправлено в RC4 (скоро). При этом, чтобы отключить прокрутку, когда ввод сфокусирован, добавьте это в свой объект конфигурации (в @NgModule):

...
imports: [
    IonicModule.forRoot(MyApp, {
        scrollAssist: false, 
        autoFocusAssist: false
    }),
    ...
],
...

Очень хорошее объяснение этих двух свойств можно найти здесь:

Однако при настройках по умолчанию Ionic2 существуют дополнительные функции, которые пытаются компенсировать скольжение клавиатуры, добавляя отступы внизу содержимого ('scrollAssist'), и удерживая фокусированный элемент ввода в окне просмотра, прокручивая его обратно ('autoFocusAssist'). И scrollAssist, и autoFocusAssist имеют хорошо реализованные переключатели в конфигурации, которые пока еще не документированы.

Вы также можете использовать ionic-plugin-keyboard чтобы остановить собственный прокручивать / прокручивать панель контента вверх и позволить клавиатуре скользить и закрывать существующий контент:

this.platform.ready().then(() => {
    StatusBar.styleDefault();
    Splashscreen.hide();

    Keyboard.disableScroll(false); // <- like this

    // ...

ОБНОВИТЬ

Так же, как @Luckylooke упоминается в комментариях:

Keyboard.disableScroll (), IOS и Windows поддерживается

ОБНОВЛЕНИЕ II

Начиная с Ionic 3.5.x кажется, что с клавиатурой все еще есть некоторые проблемы. Я обнаружил, что следующая конфигурация дает лучший результат (по сравнению со значениями по умолчанию) с точки зрения UI/UX:

@NgModule({
    declarations: [
        MyApp,
        //...
    ],
    imports: [
        //...
        IonicModule.forRoot(MyApp, {
            scrollPadding: false,
            scrollAssist: true,
            autoFocusAssist: false
        })
    ],
    bootstrap: [IonicApp],
    entryComponents: [
        // ...
    ],
    providers: [
        // ...
    ]
})
export class AppModule { }

Сохраняя scrollAssist: true мы избегаем скрытия ввода клавиатурой, если оно находится внизу страницы, и путем настройки scrollPadding: false мы также избегаем некоторых странных ошибок, связанных с пустым пробелом после сокрытия клавиатуры.

Добавьте этот метод к.ts на этой странице

ionViewWillEnter() {
  this.content.resize();
}

Мой сценарий таков: на этой странице вызывается клавиатура, но когда вы вернетесь на предыдущую страницу, страница отобразится целиком, и я пытаюсь решить ее с помощью этого метода, использую ionic2.

Есть некоторые проблемы для входов и форм с прокруткой, как упомянуто здесь, поэтому я рекомендую дождаться следующего RC, чтобы исправить это, потому что это не просто ошибка вашего кода.

Просто добавьте эти свойства в свой ionicModule в app.module.ts. работает для меня.

IonicModule.forRoot(MyApp, {
      scrollAssist: false, 
      autoFocusAssist: false
    })

Откройте рабочее пространство iOS с платформы iOS проекта Ionic и напишите ниже метод в MainViewController.m

/////////////--------------------------//////////////
/*
 *Description: this method was trigger by selector keyboarwillhide from notification
 */
-(void)keyboardWillHide
{
    if (@available(iOS 12.0, *)) {
        WKWebView *webview = (WKWebView*)self.webView;
         for(UIView* v in webview.subviews){
            if([v isKindOfClass:NSClassFromString(@"WKScrollView")]){
                UIScrollView *scrollView = (UIScrollView*)v;
                [scrollView setContentOffset:CGPointMake(0, 0)];
             }
          }
     }
}

Вызов метода выше в viewDidLoad через NotificationCenter

- (void)viewDidLoad
{
    [super viewDidLoad];

    /**
     * observer notification when keyboard will hide
     */

    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(keyboardWillHide)
                                                 name:UIKeyboardWillHideNotification
                                               object:nil];
}
Другие вопросы по тегам