iosxamarinxamarin.iosicarousel

Xamarin iOS Center TableViewCell Subview


I´m using the NuGet-Package iCarousel as a Subview in UITableViewCell. Here is my code where I add the iCarousel object (this code is located in the ViewDidLoad method of my parent ViewController):

InvokeOnMainThread(async() => 
        {
            items = await ppCtrl.GetAllPerpetrationPartIds(masterProject.Id).ConfigureAwait(false); 

            if (items != null && items.Any())
            {
                InvokeOnMainThread(() =>
                {
                    var carousel = new iCarousel
                    {
                        Bounds = CarouselViewCell.ContentView.Bounds,
                        ContentMode = UIViewContentMode.Center,
                        Type = iCarouselType.CoverFlow2,
                        Frame = CarouselViewCell.ContentView.Frame,
                        CenterItemWhenSelected = true,
                        DataSource = new SimpleDataSource(items, CarouselViewCell.ContentView.Bounds.Width, CarouselViewCell.ContentView.Bounds.Height),
                        Delegate = new SimpleDelegate(this)

                    };

                    NSLayoutConstraint centerX = carousel.CenterXAnchor.ConstraintEqualTo(this.CarouselViewCell.ContentView.CenterXAnchor);
                    NSLayoutConstraint centerY = carousel.CenterYAnchor.ConstraintEqualTo(this.CarouselViewCell.ContentView.CenterYAnchor);

                    centerX.SetIdentifier("centerXCostraint");
                    centerY.SetIdentifier("centerYConstraint");

                    var centerConstraints = new[] {centerX, centerY };

                    CarouselViewCell.ContentView.TranslatesAutoresizingMaskIntoConstraints = false;
                    CarouselViewCell.ContentView.AddConstraints(centerConstraints);

                    //NSLayoutConstraint.ActivateConstraints(centerConstraints);

                    CarouselViewCell.ContentView.ContentMode = UIViewContentMode.Center;
                    CarouselViewCell.ContentView.AddSubview(carousel);
                    ViewDidLayoutSubviews();
                });

            }
        });

Now I want to vertically and horizontally center the iCarousel. So I added this code:

NSLayoutConstraint centerX = carousel.CenterXAnchor.ConstraintEqualTo(this.CarouselViewCell.ContentView.CenterXAnchor);
NSLayoutConstraint centerY = carousel.CenterYAnchor.ConstraintEqualTo(this.CarouselViewCell.ContentView.CenterYAnchor);

centerX.SetIdentifier("centerXCostraint");
                centerY.SetIdentifier("centerYConstraint");

var centerConstraints = new[] {centerX, centerY };
CarouselViewCell.ContentView.TranslatesAutoresizingMaskIntoConstraints = false;
                CarouselViewCell.ContentView.AddConstraints(centerConstraints);

My problem is now that the app Crashes at this line:

CarouselViewCell.ContentView.AddConstraints(centerConstraints);

I found in a similar post that you need to add the constraints to the assiciated UIView object. I tried several objects but with no success.


Solution

  • CarouselViewCell.ContentView.AddConstraints(centerConstraints);

    This code will crash because we need to add the control first, then set its constraints. Or it will crash. Try to adjust the code's order:

    //Let this code just lie after the carousel's construction.
    CarouselViewCell.ContentView.AddSubview(carousel);
    

    Also if you want to add the carousel's constraints, you should set the carousel's TranslatesAutoresizingMaskIntoConstraints to false not CarouselViewCell.ContentView.

    Moreover depending on your description, I think you want to put an iCarousel on UITableViewCell. This configuration should be set in the Cell class not in the parent ViewController class.