以相反的顺序填充UICollectionView

时间:2015-07-08 06:07:21

标签: ios iphone uicollectionview uicollectionviewcell

我想以相反的顺序填充UICollectionView,以便UICollectionView的最后一项首先填充,然后填充第二项,依此类推。实际上,我正在应用动画和项目逐一出现。因此,我希望最后一项显示出来。

7 个答案:

答案 0 :(得分:3)

我很惊讶苹果公司让人们不再在文档中编写自己的UICollectionViewLayout。这真的非常简单。这是我刚刚在应用程序中使用的实现,它将完全满足要求。新项目显示在底部,而没有足够的内容填充屏幕,项目底部对齐,就像您在消息应用程序中看到的那样。换句话说,数据源中的项目零是堆栈中的最低项目。

此代码假定您有多个部分,每个部分都包含固定高度的项目,项目之间没有空格,以及集合视图的整个宽度。如果您的布局更复杂,例如部分和项目之间的间距不同,或者可变高度项目,Apple的意图是您使用<html> <head> <!--Load the AJAX API--> <script type="text/javascript" src="https://www.google.com/jsapi"></script> <script type="text/javascript"> // Load the Visualization API and the piechart package. google.load('visualization', '1.0', {'packages':['corechart']}); // Set a callback to run when the Google Visualization API is loaded. google.setOnLoadCallback(drawChart); // Callback that creates and populates a data table, // instantiates the pie chart, passes in the data and // draws it. function drawChart() { // Create the data table. var data = new google.visualization.DataTable(); data.addColumn('string', 'ITEM'); data.addColumn('number', 'VALUE'); data.addRows([ ['Item 1', Android.getNum1()], ['Item 2', Android.getNum2()], ['Item 3', Android.getNum3()], ['Item 4', Android.getNum4()], ['Item 5', Android.getNum5()] ]); // Set chart options var options = {'title':'Android-er: Load Google Charts (pie chart) with WebView', 'width':600, 'height':600 }; // Instantiate and draw our chart, passing in some options. var chart = new google.visualization.PieChart(document.getElementById('chart_div')); chart.draw(data, options); function aniChart(d,o){ for (var i=1; i<100; i++) { data.setValue(0, 1, i); } for (var i=99; i>00; i--) { data.setValue(1, 1, i); } setTimeout(function(){ chart.draw(data, options); }, 1000); }; aniChart(); } </script> </head> <body> <!--Div that will hold the pie chart--> <div id="chart_div" style="width:600; height:600"></div> </body> </html> 回调来执行繁重的工作和缓存大小信息以供以后使用。

此代码使用Swift 3.0。

prepare()

答案 1 :(得分:2)

我假设您正在使用UICollectionViewFlawLayout,并且这没有逻辑可以做到这一点,它只能在TOP-LEFT BOTTOM-RIGHT顺序中工作。为此,您必须构建自己的布局,您可以创建一个从UICollectionViewLayout继承的新对象。

看起来很多工作但实际上并不是那么多,你必须实现4种方法,并且由于你的布局只是自下而上应该很容易知道每个单元格的帧。

点击这里的苹果教程:https://developer.apple.com/library/prerelease/ios/documentation/WindowsViews/Conceptual/CollectionViewPGforIOS/CreatingCustomLayouts/CreatingCustomLayouts.html

答案 2 :(得分:2)

Swift 4.2

我找到了一个简单的解决方案,并为我工作以首先显示收藏夹视图中的最后一个项目:

内部viewDidLoad()方法:

collectionView.transform = CGAffineTransform.init(rotationAngle: (-(CGFloat)(Double.pi)))

在返回单元格之前,在collectionView(_ collectionView:UICollectionView,cellForItemAt indexPath:IndexPath)方法内部:

cell.transform = CGAffineTransform(rotationAngle: CGFloat.pi)

(可选)自动滚动并以平滑滚动显示新项目时需要以下几行。

在加载新数据后添加以下行:

   if self.dataCollection.count > 0 {
      self.collectionView.scrollToItem(at: //scroll collection view to indexpath
      NSIndexPath.init(row:(self.collectionView?.numberOfItems(inSection: 0))!-1, //get last item of self collectionview (number of items -1)
      section: 0) as IndexPath //scroll to bottom of current section
      , at: UICollectionView.ScrollPosition.bottom, //right, left, top, bottom, centeredHorizontally, centeredVertically
      animated: true)
   }

答案 3 :(得分:2)

只需在情节提要中单击UICollectionView, 在检查器菜单中的“视图”部分下,将语义更改为“从右向左强制”

我已在检查器菜单中附加了一张图像以显示如何进行操作:

image for right to left in inspector

答案 4 :(得分:1)

实际上不需要修改数据收集,但这会产生预期的结果。由于您控制以下方法:

override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell

只需返回通过反转请求的索引创建的单元格。索引路径是集合中的单元格索引,不一定是源数据集中的索引。我使用它来从CoreData集反向显示。

let desiredIndex = dataProfile!.itemEntries!.count - indexPath[1] - 1;

答案 5 :(得分:0)

不知道这是否仍然有用,但我想这可能对其他人非常有用。

如果您的集合视图的单元格高度相同,那么实际上解决问题的方法要比构建自定义UICollectionViewLayout要复杂得多。

首先,只需在集合视图的顶部约束中输出,然后将此代码添加到视图控制器中:

-(void)viewWillAppear:(BOOL)animated {
    [self.view layoutIfNeeded]; //for letting the compiler know the actual height and width of your collection view before we start to operate with it
    if (self.collectionView.frame.size.height > self.collectionView.collectionViewLayout.collectionViewContentSize.height) {
        self.collectionViewTopConstraint.constant = self.collectionView.frame.size.height - self.collectionView.collectionViewLayout.collectionViewContentSize.height;
    }

所以基本上只有当视图的高度更大时才计算集合视图的高度与其内容之间的差异。然后将其调整为约束的常量。很简单。但是如果你还需要实现单元格大小调整,那么这段代码是不够的。但我想这种方法可能非常有用。希望这会有所帮助。

答案 6 :(得分:0)

这很简单:

yourCollectionView.inverted = true

PS:与Texture / IGListKit相同。