2017-10-17 38 views
0

我正在創建具有多個標籤大小的集合視圖。這些標籤都具有相同的高度,但寬度會動態變化。左對齊UICollectionView單元格當它在Xamarin.ios中有一個項目

這是我收集視圖佈局的代碼:

EstimatedItemSize = new CGSize(50f, 35f); 

MinimumInteritemSpacing = 10f; 

MinimumLineSpacing = 10f; 

public override UICollectionViewLayoutAttributes[] LayoutAttributesForElementsInRect(CGRect rect) 
{ 
var attributes = base.LayoutAttributesForElementsInRect(rect); 

     for (var i = 1; i < attributes.Length; ++i) 
     { 
      var currentLayoutAttributes = attributes[i]; 
      var previousLayoutAttributes = attributes[i - 1]; 
      var maximumSpacing = MinimumInteritemSpacing; 
      var previousLayoutEndPoint = previousLayoutAttributes.Frame.Right; 
      if (previousLayoutEndPoint + maximumSpacing + currentLayoutAttributes.Frame.Size.Width >= CollectionViewContentSize.Width) 
      { 
       continue; 
      } 
      var frame = currentLayoutAttributes.Frame; 
      frame.X = previousLayoutEndPoint + maximumSpacing; 
      currentLayoutAttributes.Frame = frame; 
     } 
     return attributes; 
    } 

我的問題是:當我有我的集合中的一個項目來查看它的顯示在屏幕中央,並LayoutAttributesForElementsInRect方法不會被調用。但我需要在左側顯示它。

如果我將EstimatedItemSize = new CGSize(50f, 35f)更改爲ItemSize = new CGSize(50f, 35f)它會正確顯示,但寬度不會動態更改。

+0

我有發表答覆。或者你可以使用一些其他的第三方庫:https://github.com/mokagio/UICollectionViewLeftAlignedLayout。 –

回答

0

您可以添加一些代碼來改變第一小區的位置,當您使用EstimatedItemSize,就像這樣:

 public override UICollectionViewLayoutAttributes[] LayoutAttributesForElementsInRect(CoreGraphics.CGRect rect) 
     { 

      var attributes = base.LayoutAttributesForElementsInRect(rect); 


      //Add these lines to change the first cell's position of the collection view. 
      var firstCellFrame = attributes[0].Frame; 
      firstCellFrame.X = 0; 
      attributes[0].Frame = firstCellFrame; 


      for (var i = 1; i < attributes.Length; ++i) 
      { 
       var currentLayoutAttributes = attributes[i]; 
       var previousLayoutAttributes = attributes[i - 1]; 
       var maximumSpacing = MinimumInteritemSpacing; 
       var previousLayoutEndPoint = previousLayoutAttributes.Frame.Right; 
       if (previousLayoutEndPoint + maximumSpacing + currentLayoutAttributes.Frame.Size.Width >= CollectionViewContentSize.Width) 
       { 
        continue; 
       } 
       var frame = currentLayoutAttributes.Frame; 
       frame.X = previousLayoutEndPoint + maximumSpacing; 
       currentLayoutAttributes.Frame = frame; 
      } 
      return attributes; 
     } 

它工作正常,像這樣:

enter image description here

相關問題