Использование Xamarin ios iCarousel (мне нужна карусель для цикла и установки времени цикла) - PullRequest
0 голосов
/ 27 декабря 2018

Я недавно использовал Карусель для своей работы.Загруженный образец может показать чувство, которое я хочу.Но мне нужна карусель для циклического воспроизведения и установки времени цикла, я не знаю, как использовать iCarouselDelegate для перезаписи метода.Пожалуйста, дайте мне несколько советов.

Пространство имен Xamarin.iOS.iCarouselExample {открытый частичный класс ViewController: UIViewController {protected ViewController (дескриптор IntPtr): base (handle) {}

                private List<int> items;

                public override void ViewDidLoad()
                {
                    base.ViewDidLoad();

                    items = Enumerable.Range(1, 100).ToList();

                    // Setup iCarousel view
                    var carousel = new iCarousel
                    {
                        Bounds = View.Bounds,

                        ContentMode = UIViewContentMode.Center,
                        Type = iCarouselType.TimeMachine,
                        Frame = View.Frame,
                        CenterItemWhenSelected = true,
                        DataSource = new SimpleDataSource(items),
                        Delegate = new SimpleDelegate(this)
                    };

                    View.AddSubview(carousel);
                    ViewDidLayoutSubviews();
                }

                public class SimpleDataSource : iCarouselDataSource
                {
                    private readonly List<int> _data;

                    public SimpleDataSource(List<int> data)
                    {
                        _data = data;
                    }

                    public override nint NumberOfItemsInCarousel(iCarousel carousel) => _data.Count;

                    public override UIView ViewForItemAtIndex(iCarousel carousel, nint index, UIView view)
                    {
                        UILabel label;

                        // create new view if no view is available for recycling
                        if (view == null)
                        {
                            var imgView = new UIImageView(new RectangleF(0, 200, 200, 200))
                            {
                                BackgroundColor = UIColor.Orange,
                                ContentMode = UIViewContentMode.Center
                            };

                            label = new UILabel(imgView.Bounds)
                            {
                                BackgroundColor = UIColor.Clear,
                                TextAlignment = UITextAlignment.Center,
                                Tag = 1
                            };
                            imgView.AddSubview(label);
                            view = imgView;
                        }
                        else
                        {
                            // get a reference to the label in the recycled view
                            label = (UILabel)view.ViewWithTag(1);
                        }

                        label.Text = _data[(int)index].ToString();

                        return view;
                    }
                }

                public class SimpleDelegate : iCarouselDelegate
                {
                    private readonly ViewController _viewController;

                    public SimpleDelegate(ViewController vc)
                    {
                        _viewController = vc;
                    }

                    public override void DidSelectItemAtIndex(iCarousel carousel, nint index)
                    {
                        var alert = UIAlertController.Create("Clicked index:", index.ToString(), UIAlertControllerStyle.Alert);
                        alert.AddAction(UIAlertAction.Create("Ok", UIAlertActionStyle.Cancel, null));

                        _viewController.PresentViewController(alert, animated: true, completionHandler: null);
                    }

                    public override nfloat ValueForOption(iCarousel carousel, iCarouselOption option, nfloat value)
                    {
                        option.Wrap = true;
                    }

                }
            }
        }

1 Ответ

0 голосов
/ 27 декабря 2018

Вы можете просто запустить цикл в фоновом потоке и назначить изменение для CurrentItemIndex в пользовательском интерфейсе / основном потоке.

Что-то вроде этого в конце вашего ViewDidLoad (в ICarouselпример) будет работать:

 Task.Run(async () =>
 {
     while (carousel.CurrentItemIndex < 100)
     {
         InvokeOnMainThread(() => carousel.CurrentItemIndex++);
         await Task.Delay(1000);
     }
 });

Примечание : Xamarin.iOS, к сожалению, никогда не реализовывал "Динамические" (@ dynamic / NSManaged) свойства, которые CoreData / CoreAnimation / etc ... могут сделатьиспользования, но если вы просмотрите ссылки ниже, я покажу, как я реализую их в Xamarin и, таким образом, могу делать такие вещи, как:

UIView.Animate(1.0, 1.0, UIViewAnimationOptions.Autoreverse,
    () => { carousel.CurrentItemIndex = 100; },
    () => { }
);
...