Как установить позицию прокрутки ListView вниз, до того, как ListView появится в iOS Xamarin Forms? - PullRequest
0 голосов
/ 04 февраля 2019

В Xamarin Forms для iOS я пытаюсь установить положение прокрутки для ListView, прежде чем оно появится.Когда ListView показывается, запускается видимая прокрутка вниз.Есть какие-нибудь идеи, как установить позицию прокрутки до появления ListView?

[assembly: ExportRenderer(typeof(MyListView), typeof(NativeiOSListViewRenderer))]
namespace MyApp.iOS.Renderers
{ 
    public class NativeiOSListViewRenderer : ListViewRenderer
    {
        protected override void OnElementChanged(ElementChangedEventArgs<ListView> e)
        {
            base.OnElementChanged(e); 

            if (e.NewElement != null)
            { 
                var element = e.NewElement as MyListView;

                if (element.ItemsSource is IList items && items.Count > 0)
                { 
                    var tableView = Control as UITableView;
                    var indexPath = NSIndexPath.FromItemSection(itemIndexitems.Count - 1, 0);
                    tableView.ScrollToRow(indexPath, UITableViewScrollPosition.Bottom, false);
                } 
            }
        } 
    }
}

Ответы [ 2 ]

0 голосов
/ 06 февраля 2019

Несмотря на то, что это хак, вы можете скрыть стол, а затем показать его, когда он прокручивается (или играть с прозрачностью, которая должна работать).

0 голосов
/ 05 февраля 2019

Причина:

При вызове кода, который прокручивает просмотр списка до кнопки в методе OnElementChanged. Просмотр списка еще не завершен init.Так что это не сработало.

Решение:

Вы можете использовать MessagingCenter для отправки уведомления для прокрутки списка в методе OnAppearing.

inyour contentPage

 protected override void OnAppearing()
 {
   base.OnAppearing();
   MessagingCenter.Send<Object>(this, "ScrollToButtom");
 }

в iOS Renderer

public class NativeiOSListViewRenderer : ListViewRenderer
{
    public NativeiOSListViewRenderer ()
    {
        MessagingCenter.Subscribe<Object>(this, "ScrollToButtom", (obj) => {
            var element = Element as MyListView;
            if (element.ItemsSource is IList<string> items && items.Count > 0)
            {
                var tableView = Control as UITableView;
                var indexPath = NSIndexPath.FromItemSection(items.Count - 1, 0);
                tableView.ScrollToRow(indexPath, UITableViewScrollPosition.Bottom, false);
            }
        });
    }

}

Обновление: Решение отлично работает на моем устройстве. Если оновсе еще не работает в вашем проекте. Вы можете переопределить метод WillDisplay

public class MyListViewRenderer:ListViewRenderer,IUITableViewDelegate
{

    bool isFirstLoad = true;

    public MyListViewRenderer()
    {


    }

    [Export("tableView:willDisplayCell:forRowAtIndexPath:")]
    public void WillDisplay(UITableView tableView,UITableViewCell cell,NSIndexPath indexPath)
    {
       if(isFirstLoad)
        {

            var element = Element as MyListView;

            if (element.ItemsSource is IList<string> items && items.Count > 0)
            {

             if(indexPath.Row!=items.Count-1)
                {
                    NSIndexPath nSIndexPath = NSIndexPath.FromItemSection(indexPath.Row + 1, 0);
                    tableView.ScrollToRow(nSIndexPath, UITableViewScrollPosition.Bottom, false);

                }
             else
                {
                    isFirstLoad = false;
                }
            }

        }
    }

    protected override void OnElementChanged(ElementChangedEventArgs<ListView> e)
    {
        base.OnElementChanged(e);

        if(Control!=null)
        {
            Control.WeakDelegate = this;
        }

    }

}

Я загрузил свой образец здесь , вы можете загрузить его и попробовать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...