如何使用UICollectionViewCompositionalLayout和多种单元格类型创建自动调整大小的单元格?

时间:2019-10-23 04:36:22

标签: c# swift xamarin.ios ios13 autosize

我正在尝试在iOS13上使用新的mid。我想显示两种不同的单元格类型,但是我希望布局系统自动调整单元格的大小。我想利用UICollectionViewCompositionalLayout来考虑自动调整大小。

我正在尝试使用Xamarin进行此操作,但是Swift编码人员应该能够阅读以下代码。我对自动布局和动态单元格的大小不是很坚强,但是到目前为止,我已经能够找到在线资源。几乎每个NSCollectionLayoutDimension.estimated示例都似乎使用单个单元格模板。

UICollectionViewCompositionalLayout

enter image description here

如您所见,问题在于两种细胞类型使用相同的估计高度200。我不确定在这里做错了什么。我希望两种单元格类型都自动调整大小以适合其内容,而不要有多余的空间来达到200。我尝试使用较小的估计大小(如10),但这没有任何改变。应该如何将代码更改为具有自动大小调整功能?

1 个答案:

答案 0 :(得分:0)

这取决于您在CollectionViewCell中设置的约束,请不要给标签加上固定的大小,否则它将不会自动调整大小,请在MyViewUICollectionViewCell2中将标签的约束更改为:

public class MyViewUICollectionViewCell2 : UICollectionViewCell
{
    public const string ReuseIdentifier = "MyViewUICollectionViewCell2";

    public UILabel Label { get; }

    [Export("initWithFrame:")]
    public MyViewUICollectionViewCell2(CGRect frame) : base(frame)
    {
        var container = new UIView
        {
            BackgroundColor = UIColor.White,
            TranslatesAutoresizingMaskIntoConstraints = false
        };

        container.Layer.CornerRadius = 5;

        ContentView.AddSubview(container);

        container.TopAnchor.ConstraintEqualTo(ContentView.TopAnchor).Active = true;
        container.LeftAnchor.ConstraintEqualTo(ContentView.LeftAnchor).Active = true;
        container.BottomAnchor.ConstraintEqualTo(ContentView.BottomAnchor).Active = true;
        container.RightAnchor.ConstraintEqualTo(ContentView.RightAnchor).Active = true;

        Label = new UILabel
        {
            Lines = 0;
            TranslatesAutoresizingMaskIntoConstraints = false
        };

        container.AddSubview(Label);

        Label.TopAnchor.ConstraintEqualTo(container.TopAnchor).Active = true;
        Label.LeftAnchor.ConstraintEqualTo(container.LeftAnchor).Active = true;
        Label.BottomAnchor.ConstraintEqualTo(container.BottomAnchor).Active = true;
        Label.RightAnchor.ConstraintEqualTo(container.RightAnchor).Active = true;

        //Label.CenterXAnchor.ConstraintEqualTo(container.CenterXAnchor).Active = true;
        //CenterYAnchor.ConstraintEqualTo(container.CenterYAnchor).Active = true;
        //Label.WidthAnchor.ConstraintEqualTo(20).Active = true;
        //Label.HeightAnchor.ConstraintEqualTo(20).Active = true;
    }
}

对于colorView中的MyViewUICollectionViewCell1,如果您知道colorView的大小,则应将container的大小指定为与{{1} },它不会像带有不同文本的标签一样增长。