相当烦人的问题,但似乎滚动视图上有一些默认行为,当你改变方向时,它会自动滚动到顶部。 ShouldScrollToTop
是UIScrollView
上可用的属性,但似乎在XF ScrollView中不可用。但无论如何它还能做到吗?有办法停止吗?
答案 0 :(得分:4)
我刚对此进行了快速测试,结果发现它只是iOS上的一个问题。在Android上,ScrollView在旋转后没有滚动到顶部。我没有测试UWP / WinPhone。如果它只是iOS,则应该针对Xamarin.Forms提交错误。
与此同时,这是iOS的解决方法。您需要为ScrollView创建自定义渲染器[1]。渲染器代码如下所示:
if ( set( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-array-bounds" )
[1] https://developer.xamarin.com/guides/xamarin-forms/custom-renderer/
答案 1 :(得分:4)
我已经延长了@ jgoldberger的答案并提出了这个问题:
[assembly: ExportRenderer(typeof(Xamarin.Forms.ScrollView), typeof(MyApp.iOS.CustomRenderers.Controls.FieldStrikeScrollViewRenderer))]
namespace MyApp.iOS.CustomRenderers.Controls
{
public class MyScrollViewRenderer : ScrollViewRenderer
{
CGPoint offset;
protected override void OnElementChanged(VisualElementChangedEventArgs e)
{
base.OnElementChanged(e);
UIScrollView sv = NativeView as UIScrollView;
sv.Scrolled += (sender, evt) => {
// Checking if sv.ContentOffset is not 0,0
// because the ScrollView resets the ContentOffset to 0,0 when rotation starts
// even if the ScrollView had been scrolled (I believe this is likely the cause for the bug).
// so you only want to set offset variable if the ScrollView is scrolled away from 0,0
// and I do not want to reset offset to 0,0 when the rotation starts, as it would overwrite my saved offset.
if (sv.ContentOffset.X != 0 || sv.ContentOffset.Y != 0)
offset = sv.ContentOffset;
};
}
public override void LayoutSubviews()
{
if (offset.X != 0 || offset.Y != 0)
{
UIScrollView sv = NativeView as UIScrollView;
// Reset the ScrollView offset from the last saved offset.
sv.ContentOffset = offset;
}
base.LayoutSubviews();
}
}
}
但他是对的,这应该由Xamarin确定
答案 2 :(得分:0)
在最新的Xamarin版本中小心这些答案。当键盘显示/隐藏时,它们将导致滚动偏移行为出现问题。 Scrollview可能会停留在无效的偏移位置,用户不能再向下滚动。
答案 3 :(得分:0)
我将添加一个新的单独答案。在更高版本的Xamarin.Forms(3.0 +)
中这是一个更好的解决方法:
[assembly: ExportRenderer(typeof(Xamarin.Forms.ScrollView), typeof(MyApp.iOS.CustomRenderers.Controls.ExtendedScrollViewRenderer))]
namespace FieldStrikeMove.iOS.CustomRenderers.Controls
{
public class ExtendedScrollViewRenderer : ScrollViewRenderer
{
public override CGSize ContentSize
{
get => base.ContentSize;
set
{
if (Element is ScrollView scrollView)
{
if (!scrollView.ContentSize.IsZero && value != scrollView.ContentSize.ToSizeF())
{
return;
}
}
base.ContentSize = value;
}
}
}
}
已链接到此issue