繁体   English   中英

根据屏幕宽度和列数Xamarin.iOS设置UICollectionViewCell的大小

[英]Set the Size of a UICollectionViewCell based on the screen width and the number of columns Xamarin.iOS

我正在使用Xamarin.iOS构建应用程序。 应用程序的第一个屏幕我使用了UICollectionView来显示多个类别。 我希望类别显示在两列中,但这里有一个问题。 我在storyBoard.In上手动设置了单元格的大小。在像iPhone 3.5英寸这样的小屏幕上,只出现一列,同时在iPhone 66Plus等大屏幕中出现两列,但列之间有很多空格。

表View有一个我们可以在TableViewSourceGetRowHeight覆盖的方法。 有没有办法根据屏幕宽度和列数设置collectionViewCell的大小。

这是我在My App中实现CollectionView的方式:

SectionViewSource.cs

public class SectionViewSource: UICollectionViewSource
    {
        public List<SectionCategory> rows { get; set; }
        public ViewController owner { get; set;}

        public SectionViewSource (List<SectionCategory> _rows, ViewController _owner)
        {
            rows = _rows;
            owner = _owner;

        }

        public override nint NumberOfSections (UICollectionView collectionView)
        {
            return 1;
        }

        public override nint GetItemsCount (UICollectionView collectionView, nint section)
        {
            return rows.Count;
        }

        public override bool ShouldHighlightItem (UICollectionView collectionView, NSIndexPath indexPath)
        {
            return true;
        }

        public override void ItemHighlighted (UICollectionView collectionView, NSIndexPath indexPath)
        {
            var cell = (SectionViewCell)collectionView.CellForItem (indexPath);
            cell.mainLabel.Alpha = 0.5f;



        }

        public override bool CanPerformAction (UICollectionView collectionView, Selector action, NSIndexPath indexPath, NSObject sender)
        {

                return true;
        }

        public override void PerformAction (UICollectionView collectionView, Selector action, NSIndexPath indexPath, NSObject sender)
        {
            System.Diagnostics.Debug.WriteLine ("code to perform action");

        }

        public override void ItemUnhighlighted (UICollectionView collectionView, NSIndexPath indexPath)
        {

            var cell = (SectionViewCell)collectionView.CellForItem (indexPath);
            cell.mainLabel.Alpha = 1.0f;

        }

        public override UICollectionViewCell GetCell (UICollectionView collectionView, NSIndexPath indexPath)
        {
            var cell = (SectionViewCell)collectionView.DequeueReusableCell (SectionViewCell.CellID, indexPath);

            cell.UpdateCell (rows [indexPath.Row].sectionName,rows [indexPath.Row].sectionUrlImage);

            return cell;
        }
    }

SectionViewCell.cs

public class SectionViewCell: UICollectionViewCell
    {
        public UILabel mainLabel;
        public UIImageView _imageView;
        public static NSString CellID = new NSString("customCollectionCell");

        [Export ("initWithFrame:")]
        public SectionViewCell (CGRect frame) : base(frame)
        {
            BackgroundView = new UIView { BackgroundColor = UIColor.Orange };

            ContentView.BackgroundColor = UIColor.LightGray;

            _imageView = new UIImageView ();
            mainLabel = new UILabel ();

            mainLabel.TextColor = UIColor.White;

            ContentView.AddSubviews (new UIView[] { _imageView, mainLabel });
        }



        public void UpdateCell (string text, string url) {

            mainLabel.Text = text;
            mainLabel.LineBreakMode = UILineBreakMode.TailTruncation;
            mainLabel.Lines = 2; 
            mainLabel.Font = UIFont.FromName("Optima-Bold", 18f);

            ImageService.LoadUrl(url).Into(_imageView);
            _imageView.Frame = new CGRect (0, 0, ContentView.Bounds.Width, ContentView.Bounds.Height);
            mainLabel.Frame = new CGRect (10, 10, ContentView.Bounds.Width-20, 40);

        }

    }

ViewController.cs

sectionGrid.RegisterClassForCell(typeof(SectionViewCell), SectionViewCell.CellID);
sectionGrid.Source = new SectionViewSource (sectionCategories,this);

尝试设置CollectionViewLayout,如下所示:

// Flow Layout
var flowLayout = new UICollectionViewFlowLayout (){
    ItemSize = new CGSize ((float)UIScreen.MainScreen.Bounds.Size.Width/2.0f, (float)UIScreen.MainScreen.Bounds.Size.Width/2.0f),
    HeaderReferenceSize = new CGSize (100, 100),
    SectionInset = new UIEdgeInsets (0,0,0,0),
    ScrollDirection = UICollectionViewScrollDirection.Vertical,
    MinimumInteritemSpacing = 0, // minimum spacing between cells
    MinimumLineSpacing = 0 // minimum spacing between rows if ScrollDirection is Vertical or between columns if Horizontal
};

simpleCollectionViewController = new UICollectionViewController (flowLayout);

创造这样的东西:

在此输入图像描述


更新

你可以试试这个:

var flowLayout = new UICollectionViewFlowLayout (){
    ItemSize = new CGSize ((float)UIScreen.MainScreen.Bounds.Size.Width/2.0f, (float)UIScreen.MainScreen.Bounds.Size.Width/2.0f),
    HeaderReferenceSize = new CGSize (100, 100),
    SectionInset = new UIEdgeInsets (0,0,0,0),
    ScrollDirection = UICollectionViewScrollDirection.Vertical,
    MinimumInteritemSpacing = 0, // minimum spacing between cells
    MinimumLineSpacing = 0 // minimum spacing between rows if ScrollDirection is Vertical or between columns if Horizontal
};

sectionGrid.PerformBatchUpdates (() => {
    sectionGrid.CollectionViewLayout.InvalidateLayout ();
    sectionGrid.SetCollectionViewLayout (flowLayout, false);
});

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM