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