Xamarin.forms 编辑器和键盘重叠(iOS)Xamarin forms 3.6无法正常工作(视觉=材质)

Xamarin.forms 编辑器和键盘重叠(iOS)Xamarin forms 3.6无法正常工作(视觉=材质),xamarin.forms,xamarin.ios,Xamarin.forms,Xamarin.ios,我看到一个奇怪的行为,或者可能是完全错误的,他们这样做 有一个底部有一个编辑器的页面,有一个按钮和一个顶部有一些消息的列表视图 我在这个链接中使用键盘渲染器 问题 当我开始打字时,键盘出现,编辑器完全折叠并开始打字,它允许我打字,但它会折叠(见图) 有时也会崩溃,什么也看不见 如何在iOS中使用带键盘的编辑器 崩溃 没有崩溃 使用的渲染器 [assembly: ExportRenderer(typeof(KeyboardView), typeof(KeyboardViewRenderer

我看到一个奇怪的行为,或者可能是完全错误的,他们这样做

有一个底部有一个编辑器的页面,有一个按钮和一个顶部有一些消息的列表视图

我在这个链接中使用键盘渲染器

问题

当我开始打字时,键盘出现,编辑器完全折叠并开始打字,它允许我打字,但它会折叠(见图) 有时也会崩溃,什么也看不见

如何在iOS中使用带键盘的编辑器

崩溃

没有崩溃

使用的渲染器

[assembly: ExportRenderer(typeof(KeyboardView), 
typeof(KeyboardViewRenderer))]
namespace KeyboardSample.iOS.Renderers
{
public class KeyboardViewRenderer : ViewRenderer
{
    NSObject keyboardShowObserver;
    NSObject keyboardHideObserver;
    protected override void OnElementChanged(ElementChangedEventArgs<View> e)
    {
        base.OnElementChanged(e);

        if (e.NewElement != null)
        {
            RegisterForKeyboardNotifications();
        }

        if (e.OldElement != null)
        {
            UnregisterForKeyboardNotifications();
        }
    }

    private void RegisterForKeyboardNotifications()
    {
        if (keyboardShowObserver == null)
            keyboardShowObserver = UIKeyboard.Notifications.ObserveWillShow(OnKeyboardShow);
        if (keyboardHideObserver == null)
            keyboardHideObserver = UIKeyboard.Notifications.ObserveWillHide(OnKeyboardHide);
    }

    private void OnKeyboardShow(object sender, UIKeyboardEventArgs args)
    {
        NSValue result = (NSValue)args.Notification.UserInfo.ObjectForKey(new NSString(UIKeyboard.FrameEndUserInfoKey));
        CGSize keyboardSize = result.RectangleFValue.Size;
        if (Element != null)
        {
            Element.Margin = new Thickness(0, 0, 0, keyboardSize.Height); //push the entry up to keyboard height when keyboard is activated

        }
    }

    private void OnKeyboardHide(object sender, UIKeyboardEventArgs args)
    {
        if (Element != null)
        {
            Element.Margin = new Thickness(0); //set the margins to zero when keyboard is dismissed
        }

    }


    private void UnregisterForKeyboardNotifications()
    {
        if (keyboardShowObserver != null)
        {
            keyboardShowObserver.Dispose();
            keyboardShowObserver = null;
        }

        if (keyboardHideObserver != null)
        {
            keyboardHideObserver.Dispose();
            keyboardHideObserver = null;
        }
    }
}

public class KeyboardView: Grid
{

}
[程序集:ExportRenderer(typeof(KeyboardView)),
类型(KeyboardViewRenderer))]
命名空间KeyboardSample.iOS.Renderers
{
公共类KeyboardViewRenderer:ViewRenderer
{
NSObject键盘显示器;
NSObject键盘HideObserver;
受保护的覆盖无效OnElementChanged(ElementChangedEventArgs e)
{
基础。一个要素发生变化(e);
if(例如NewElement!=null)
{
RegisterWorkeryBoardNotifications();
}
if(e.OldElement!=null)
{
取消注册ForkeyBoardNotifications();
}
}
私有无效注册表WorkeryBoardNotifications()
{
如果(keyboardShowObserver==null)
keyboardShowObserver=UIKeyboard.Notifications.ObserveWillShow(OnKeyboardShow);
if(keyboardHideObserver==null)
keyboardHideObserver=UIKeyboard.Notifications.ObserveWillHide(OnKeyboardHide);
}
私有void OnKeyboardShow(对象发送方,UIKeyboardEventArgs args args)
{
NSValue结果=(NSValue)args.Notification.UserInfo.ObjectForKey(新的NSString(UIKeyboard.FrameEndUserInfoKey));
CGSize keyboardSize=result.RectangleFValue.Size;
if(元素!=null)
{
Element.Margin=新的厚度(0,0,0,keyboardSize.Height);//当键盘被激活时,将条目推高至键盘高度
}
}
私有void OnKeyboardHide(对象发送方,UIKeyboardEventArgs args args)
{
if(元素!=null)
{
Element.Margin=新厚度(0);//当键盘关闭时,将边距设置为零
}
}
私有无效取消注册ForkeyBoardNotifications()
{
if(keyboardShowObserver!=null)
{
keyboardShowObserver.Dispose();
keyboardShowObserver=null;
}
if(keyboardHideObserver!=null)
{
keyboardHideObserver.Dispose();
keyboardHideObserver=null;
}
}
}
公共类键盘视图:网格
{
}
在我的页面中

<controls:KeyboardView Padding="0,60,0,0"
                        VerticalOptions="FillAndExpand">
    <Grid RowSpacing="0" ColumnSpacing="0">
        <Grid.RowDefinitions>
            <RowDefinition Height="*" />
            <RowDefinition Height="Auto" />
        </Grid.RowDefinitions>

        <ListView Grid.Row="0">
            <!--TODO -->
        </ListView>

        <Grid Grid.Row="1" RowSpacing="0" ColumnSpacing="0">
            <Grid.RowDefinitions>
                <RowDefinition Height="*" />
                <RowDefinition Height="*" />
            </Grid.RowDefinitions>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="*" />
                <ColumnDefinition Width="Auto" />
            </Grid.ColumnDefinitions>

                <StackLayout   Orientation="Horizontal">
                    <ScrollView HorizontalOptions="FillAndExpand" >
                        <Editor  
                                AutoSize="TextChanges"
                                Text="{Binding MyText, Mode=TwoWay}" 
                                Margin="10"  
                                TextColor="Black" 
                                Keyboard="Chat"  
                                BackgroundColor="Gainsboro"
                                HorizontalOptions="FillAndExpand" 
                                VerticalOptions="FillAndExpand"
                                PlaceholderColor="LightGray"
                                Placeholder="Type your message here" />
                    </ScrollView>
                    <StackLayout HorizontalOptions="End" VerticalOptions="End">
                        <Button Text="Send"  Command="{Binding TODOCommand}"  Margin="0,10,10,10"/>
                    </StackLayout>
                </StackLayout>
        </Grid>
    </Grid>
</controls:KeyboardView>


删除scrollview解决了问题

你下载了演示并进行了测试吗?你能提供你的样本让我在我这边进行测试吗。@LucasZhang MSFT上传了一个样本项目,我会检查它。@LucasZhang MSFT非常感谢!