适用于iOS的Xamarin Forms ListView:始终显示ScrollBar [英] Xamarin Forms ListView for iOS: Always Show ScrollBar

查看:72
本文介绍了适用于iOS的Xamarin Forms ListView:始终显示ScrollBar的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个 ObservableCollection< Product> 类型的 ProductList ,其中 Product 是下面给出的类:

I have a ProductList of type ObservableCollection<Product> where Product is a class given below:

public class Product
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Path { get; set; }
}

在我的Xamarin Forms iOS应用程序中,我有一个 ListView ,其 ItemSource ProductList .如果 ProductList 中的Products数量不足以使 ListView 的高度足以显示所有产品,则可以通过滚动 ListView .但是,我希望仅在滚动 ListView 时才显示的ScrollBar始终显示.是否有可能或者我应该尝试使用 ListViev 之外的其他UI来始终显示ScrollBar.

In my Xamarin Forms iOS Application, I have a ListView whose ItemSource is ProductList. When number of Products in the ProductList is so that the height of ListView is not enough to show all of them, additional items can be reached by scrolling the ListView. However, I want the ScrollBar that is displayed only when scrolling the ListView to be displayed always. Is it possible or should I try another UI besides ListViev to be able to always show ScrollBar.

Xamarin.Android有一些解决方案,但我找不到适用于iOS应用程序的有效解决方案.

There are some solutions for Xamarin.Android but I couldn't find any effective solution for the iOS App.

非常感谢您...

推荐答案

正如@Cole所说, flashScrollIndicators 只能在很短的时间内显示该指标.

As @Cole commented, the flashScrollIndicators can only show the indicator a short time.

因此,您必须自定义滚动指示器.

So, you have to customize a scroll indicator.

创建ListView的自定义渲染器并添加自定义滚动指示器,如下所示:

    public class MyListViewRenderer : ListViewRenderer
    {
        public UIView bar;
        protected override void OnElementChanged(ElementChangedEventArgs<ListView> e)
        {
            base.OnElementChanged(e);

            //Hide the default Scroll Indicator.
            Control.ShowsVerticalScrollIndicator = false;


            //Set Delegate
            CustomScrollDelegate customScrollDelegate = new CustomScrollDelegate();
            Control.Delegate = customScrollDelegate;

            //Create the background view of custom indicator.
            double frameHeight = Control.Frame.Size.Height;
            double frameWidth = Control.Frame.Size.Width;

            double barBackgroundWidth = 6;
            double statusBarHeight = 20;

            UIView barBackgroundView = new UIView();
            CGRect barBVRect = new CGRect(frameWidth - barBackgroundWidth, statusBarHeight, barBackgroundWidth, frameHeight);
            barBackgroundView.Frame = barBVRect;
            barBackgroundView.BackgroundColor = UIColor.Gray;
            barBackgroundView.Layer.CornerRadius = 2;
            barBackgroundView.Layer.MasksToBounds = true;


            //Create the bar of the custom indicator.
            bar = new UIView();
            CGRect barRect = new CGRect(1, 0, 4, 0);
            bar.Frame = barRect;
            bar.BackgroundColor = UIColor.Black;
            bar.Layer.CornerRadius = 2;
            bar.Layer.MasksToBounds = true;

            //Add the views to the superview of the tableview.
            barBackgroundView.AddSubview(bar);
            Control.Superview.AddSubview(barBackgroundView);

            //Transfer the bar view to delegate.
            customScrollDelegate.bar = bar;

        }

        public override void LayoutSubviews()
        {
            base.LayoutSubviews();
            Console.WriteLine("End of loading!!!");
            double contentHeight = Control.ContentSize.Height;
            double frameHeight = Control.Frame.Size.Height;
            double barHeight = frameHeight * frameHeight / contentHeight;


            //Reset the bar height when the table view finishes loading.
            CGRect barRect = new CGRect(bar.Frame.X, bar.Frame.Y, bar.Frame.Width, barHeight);
            bar.Frame = barRect;
        }

    }

实施 Scrolled 委托,该委托跟踪scrollView的滚动动作.您可以更新指示器在委托中的位置.

Implement the Scrolled delegate which tracks the scrolling action of the scrollView. You can update the position of the indicator in the delegate.

    public class CustomScrollDelegate : UIKit.UITableViewDelegate
    {
        public UIView bar;
        double barY;

        public override void Scrolled(UIScrollView scrollView)
        {
            double y = scrollView.ContentOffset.Y;
            double contentHeight = scrollView.ContentSize.Height;
            double frameHeight = scrollView.Frame.Size.Height;

            double barHeight = frameHeight * frameHeight / contentHeight;
            barY = y / (contentHeight - frameHeight) * (frameHeight - barHeight);

            //Cut the bar Height when it over the top.
            if (barY < 0)
            {
                barHeight = barHeight + barY;
                barY = 0;
            }

            //Cut the bar height when it over the bottom.
            if (barY > (frameHeight - barHeight))
            {
               barHeight = barHeight - (barY - (frameHeight - barHeight));
            }

            //Reset the barView rect. Let's move!!!
            CGRect barRect = new CGRect(bar.Frame.X, barY, bar.Frame.Width, barHeight);
            bar.Frame = barRect;

        }

    }

它的工作原理如下:

这篇关于适用于iOS的Xamarin Forms ListView:始终显示ScrollBar的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆