C# 如何使Xamarin.Forms.iOS视图滚动到焦点所在的条目?

C# 如何使Xamarin.Forms.iOS视图滚动到焦点所在的条目?,c#,xamarin.forms,xamarin.forms.entry,xamarin-forms-4,C#,Xamarin.forms,Xamarin.forms.entry,Xamarin Forms 4,我有一个登录页面,在一个大的图像徽标下有3个输入控件,在页面底部有一个按钮控件。当我点击顶部的输入控件使输入进入焦点开始键入时,键盘出现并覆盖下面的输入控件和登录按钮,这不是最好的用户体验 用户只能在Xamarin.Forms.iOS上手动向上滚动,但在Android上使用相同的代码ScrollToAsync,我已经能够通过抓取父ScrollView并执行“ScrollView.ScrollToAsync(EntryControl,ScrollToPosition.Start,true)”将焦点

我有一个登录页面,在一个大的图像徽标下有3个输入控件,在页面底部有一个按钮控件。当我点击顶部的输入控件使输入进入焦点开始键入时,键盘出现并覆盖下面的输入控件和登录按钮,这不是最好的用户体验

用户只能在Xamarin.Forms.iOS上手动向上滚动,但在Android上使用相同的代码ScrollToAsync,我已经能够通过抓取父ScrollView并执行“ScrollView.ScrollToAsync(EntryControl,ScrollToPosition.Start,true)”将焦点上的条目滚动到页面顶部

在Android上,页面底部的按钮也在中间空格的网格行定义中使用了*。 渲染时,Xamarin.Forms.iOS的行为似乎与Xamarin.Forms.Android完全不同。我已经看到ScrollToAsync在iOS页面加载时出现了一些问题,因为在页面完全加载之前ScrollView不存在。但此操作位于已完全呈现的页面上。我做错了什么

我已经尝试了本SO中提到的延迟,但没有帮助

XAML


将其添加到xaml.cs文件中

 protected override void OnAppearing()
    {
        base.OnAppearing();
        userName.Focused += InputFocused;
        password.Focused += InputFocused;
        userName.Unfocused += InputUnfocused;
        password.Unfocused += InputUnfocused;
    }

    protected override void OnDisappearing()
    {
        base.OnDisappearing();
        userName.Focused -= InputFocused;
        password.Focused -= InputFocused;
        userName.Unfocused -= InputUnfocused;
        password.Unfocused -= InputUnfocused;
    }
    void InputFocused(object sender, EventArgs args)
    {
        Content.LayoutTo(new Rectangle(0, -270, Content.Bounds.Width, Content.Bounds.Height));
    }

    void InputUnfocused(object sender, EventArgs args)
    {
        Content.LayoutTo(new Rectangle(0, 0, Content.Bounds.Width, Content.Bounds.Height));
    }

我想你应该试试这个

private async void BranchName_Focused(object sender, FocusEventArgs e)
{
   await ScrollViewContainer.ScrollToAsync(BranchName.Bounds.X, BranchName.Bounds.Y, true);
}

解决方案的一部分是上面的@numan98答案,这让我重新审视了微软的文档

它声明ScrollToAsync(双X,双Y,bool animate)将是X和Y所在位置的最终双位置值

因此,X不会在任何地方移动,所以我认为它应该是0,而Y我只是给出了一个任意的数字,比如250。我相信在接近顶端的地方

之后,我们又出现了iOS错误,您需要延迟

最后的代码看起来像这样

private async void BranchName_Focused(object sender, FocusEventArgs e)
{
    Device.StartTimer(TimeSpan.FromSeconds(0.25), () =>
    {
        scroll.ScrollToAsync(0, 250, true);
        return false;
    );
}

我希望这对某人有帮助。下一件事是让CTA按钮移动并始终处于视图中。

您好,谢谢您的回答,我刚刚尝试了这个,但它不起作用。也许我错过了什么。从Microsoft文档中,您能否解释LayoutTo如何帮助解决此问题?谢谢,你可以参考这个链接没有帮助,但谢谢你。我实际上需要完全相同的效果,而你的SO链接中的插件也不适合我。我找到了另一个solution@CookieMonster好的,快乐的编码兄弟+1从meYes,阅读MS文档,我意识到有2种方法可以重载此方法。
private async void BranchName_Focused(object sender, FocusEventArgs e)
{
   await ScrollViewContainer.ScrollToAsync(BranchName.Bounds.X, BranchName.Bounds.Y, true);
}
private async void BranchName_Focused(object sender, FocusEventArgs e)
{
    Device.StartTimer(TimeSpan.FromSeconds(0.25), () =>
    {
        scroll.ScrollToAsync(0, 250, true);
        return false;
    );
}