【问题标题】:Change loading indicator Offset in Xamarin.Forms RefreshView更改 Xamarin.Forms RefreshView 中的加载指示器偏移量
【发布时间】:2020-09-21 03:20:47
【问题描述】:

在 Xamarin.Forms (iOS Android) 上,我需要更改 RefreshView 上的 loading-indicator 位置。我需要添加偏移量,因此如果您有一个与 ScrollView-RefreshView 组合重叠的栏并触发 pullOnRefresh,则指示器可见。

Loading-indicator in the top edge

编辑:感谢Junior Jiang - MSFT- Android solution

我还为 xamarin.iOS 实现了一个解决方案

[assembly: ExportRenderer(typeof(RefreshView), typeof(CustomRefreshViewRenderer))] 
namespace CustomRefresh.iOS {
public class CustomRefreshViewRenderer : RefreshViewRenderer
{
    protected override void OnElementChanged(ElementChangedEventArgs<RefreshView> e)
    {
        base.OnElementChanged(e);

        foreach (var nativeView in Subviews)
            updateRefreshSettings(nativeView);

    }

    void updateRefreshSettings(UIView view) {
        if (view is UIScrollView)
        {
            var scrollView = view as UIScrollView;
            if (scrollView.RefreshControl != null)
            {
                var bounds = scrollView.RefreshControl.Bounds;
                scrollView.RefreshControl.Bounds = new CGRect(bounds.X, -(100), bounds.Width, bounds.Height);
            }
        }
        //add more scrollable view types
    }
}

}

【问题讨论】:

  • 你好,你能分享一张图片来解释你想改变的位置吗?

标签: xamarin.forms xamarin.android xamarin.ios custom-renderer


【解决方案1】:

您可以自定义 RefreshViewRenderer 来实现。

Android中,有一个MOriginalOffsetTop来修改加载指示器的偏移量。另外,也可以使用SetProgressViewOffset来设置指标的起止位置。

代码如下:

using Android.Content;
using RefreshViewDemo.Droid;
using Xamarin.Forms;
using Xamarin.Forms.Platform.Android;
[assembly: ExportRenderer(typeof(RefreshView), typeof(CustomRefreshViewRenderer))]
namespace RefreshViewDemo.Droid
{
    public class CustomRefreshViewRenderer : RefreshViewRenderer
    {

        public CustomRefreshViewRenderer(Context context) : base(context)
        {
            MOriginalOffsetTop = 100;

           // SetProgressViewOffset(true, 100, 101);
        }

    }
}

iOS中,加载指示器属于UIScrollViewUIRefreshControl,没有直接的方法可以改变它的偏移量。除非覆盖 Renderer 中的所有内容视图,否则可以实现。你可以参考这个Xamarin.Forms/Xamarin.Forms.Platform.iOS/Renderers/RefreshViewRenderer.cs 来了解RefreshView 是由什么组成的。

====================更新=====================

共享代码基于此官方示例:https://docs.microsoft.com/en-us/samples/xamarin/xamarin-forms-samples/userinterface-refreshviewdemo/

对于Android,只需要在android解决方案中创建一个CustomRefreshViewRenderer类。

SetProgressViewOffset(true, 100, 101)的效果,好像指标不动了:

【讨论】:

  • 我看到渲染器在那里有可用的“SwipeLayout”属性。我应该从那里更改还是从“this.SetProgressViewOffset”更改?
  • @JaekovSegovia from there or from the... 是什么意思,我的共享代码都在渲染器中。您可以修改参数以满足您的需求。
  • @JaekovSegovia 我已经更新了答案,你有时间可以看看。
  • 谢谢你的回答。它按预期工作。我使用的是“SwipeRefreshLayout.SetProgressViewOffset(...)”,但是您可以直接从渲染器中调用该方法。
  • @JaekovSegovia 是的,它们的效果是一样的。 i.stack.imgur.com/ylRNQ.png
猜你喜欢
  • 2021-05-11
  • 1970-01-01
  • 2016-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-25
  • 2013-02-16
  • 2021-12-03
相关资源
最近更新 更多