在XF ScrollView中防止自动滚动到顶部的方向更改

时间:2017-02-03 22:27:28

标签: xamarin xamarin.forms

相当烦人的问题,但似乎滚动视图上有一些默认行为,当你改变方向时,它会自动滚动到顶部。 ShouldScrollToTopUIScrollView上可用的属性,但似乎在XF ScrollView中不可用。但无论如何它还能做到吗?有办法停止吗?

4 个答案:

答案 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