Как показать/скрыть клавиатуру при фокусе на Entry в Xamarin для iOS?

Многие наверное столкнулись с проблемой, что при получении Entry фокуса, клавиатура автоматически на iOS не выпрыгивает, в отличие от Android, где это отлично раотает. Такое поведение более, чем неприемлимо.

Первое, что приходит на ум — это написать рендерер под Entry и там уже вручную слушать UIKeyboard.WillHideNotification и  UIKeyboard.WillShowNotification.

Код для такого решения может выглядеть следующим образом:

protected virtual void OnKeyboardNotification(NSNotification notification)
{
    try {
        var frameBegin = UIKeyboard.FrameBeginFromNotification(notification);
        var frameEnd = UIKeyboard.FrameEndFromNotification(notification);
 
        var parent = this.GetParent();
        if(parent == null)
            return;
 
         if(frameBegin.Top == frameEnd.Top)
             return;
 
         if(frameBegin.Top>frameEnd.Top)
             parent.TranslateTo(0, -(frameBegin.Height/2));
         else
             parent.TranslateTo(0, 0);
        } catch (Exception ex) {
            Xamarin.Insights.Report (ex);
        }
    } 

Долгое время это было моим единственным решением проблемы фокуса и клавиатуры для iOS в Xamarin.

Однако есть более простой способ решения этой проблемы. Xamarin действительно делает это автоматически и для iOS в том числе, однако контентом страницы должен стать ScrollView.

В таком случае при попадании фокуса на Entry содержимое страницы автоматически будет перемещено вверх и мы получим поведение аналогично Android.

     <ScrollView>
         <Grid>
             <Grid.RowDefinitions>
                 <RowDefinition Height="4*"/>
                 <RowDefinition Height="35"/>
                 <RowDefinition Height="*"/>
             </Grid.RowDefinitions>
             <Grid.ColumnDefinitions>
                 <ColumnDefinition Width="*" />
                 <ColumnDefinition Width="Auto" />
                 <ColumnDefinition Width="5*" />
                 <ColumnDefinition Width="*" />
             </Grid.ColumnDefinitions>
             <Label Text="email" Grid.Row="1" Grid.Column="1" 
                 VerticalOptions="Center"/>
             <Entry Keyboard="Email" Placeholder="enter your email" 
                 Grid.Row="1" Grid.Column="2"/>
         </Grid>
     </ScrollView>

Приятного чтива

 

No Comments Yet.

Leave a comment