2015-08-18 16:07:51.523示例[16070:269647]未定义UICollectionViewFlowLayout的行为,因为:2015-08-18 16:07:51.523
示例[16070:269647]项目宽度必须小于UICollectionView的宽度减去左边和右边的值,减去左边和右边的内容值.
2015-08-18 16:07:51.524示例[16070:269647]相关的UICollectionViewFlowLayout实例是,并附加到; 动画= {position =; bounds.origin =; bounds.size =; }; layer =; contentOffset:{0,0}; contentSize:{1024,770}>集合视图布局:.2015-08-18 16:07:51.524示例[16070:269647]在UICollectionViewFlowLayoutBreakForInvalidSizes上创建一个符号断点,以便在调试器中捕获它.
这就是我得到的,我所做的是
func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize {
return CGSizeMake(self.collectionView!.frame.size.width - 20, 66)
}
Run Code Online (Sandbox Code Playgroud)
当我从横向旋转到纵向时,控制台仅在iOS 9中显示此错误消息,是否有人知道这是怎么回事?如果有解决方法?
uicollectionview uicollectionviewcell uicollectionviewlayout ios9 xcode7-beta5
以下是我正在尝试做的事情的说明:

我想知道我是否可以使用它UICollectionViewFlowLayout的子类,或者如果我需要创建一个完全自定义的布局?根据UICollectionView上的WWDC 2012视频,如果您使用垂直滚动的Flow Layout,您的布局线条是水平的,如果您水平滚动,您的布局线条是垂直的.我想在水平滚动的集合视图中使用水平布局线.
我的模型中也没有任何固有的部分 - 这只是一组项目.我可以将它们分成几个部分,但是集合视图是可调整大小的,因此可以适应页面的项目数量有时会发生变化,看起来每个项目所在的页面的选择最好留给布局而不是如果我没有任何有意义的部分,该模型.
那么,我可以使用Flow Layout执行此操作,还是需要创建自定义布局?
考虑UICollectionView流量布局和水平方向.默认情况下,单元格从上到下,从左到右排序.像这样:
1 4 7 10 13 16
2 5 8 11 14 17
3 6 9 12 15 18
Run Code Online (Sandbox Code Playgroud)
在我的例子中,集合视图被分页并且它被设计为使得特定数量的单元格适合每个页面.因此,更自然的顺序是:
1 2 3 10 11 12
4 5 6 - 13 14 15
7 8 9 16 17 18
Run Code Online (Sandbox Code Playgroud)
如果没有实现我自己的自定义布局,最简单的方法是什么?特别是,我不想放弃任何免费的功能UICollectionViewFlowLayout(例如插入/删除动画).
或者一般来说,如何f(n)在流布局上实现重新排序功能?例如,这可以适用于从右到左的排序.
我的第一种方法是子类化UICollectionViewFlowLayout和覆盖layoutAttributesForItemAtIndexPath::
- (UICollectionViewLayoutAttributes *)layoutAttributesForItemAtIndexPath:(NSIndexPath *)indexPath
{
NSIndexPath *reorderedIndexPath = [self reorderedIndexPathOfIndexPath:indexPath];
UICollectionViewLayoutAttributes *layout = [super layoutAttributesForItemAtIndexPath:reorderedIndexPath];
layout.indexPath = indexPath;
return layout;
}
Run Code Online (Sandbox Code Playgroud)
哪里reorderedIndexPathOfIndexPath:是f(n).通过调用super …
我在Interface Builder中有这种安排,所有属性都设置为零.

但是,当我在设备和模拟器上运行它时,它看起来像这样

细胞上方的空间来自哪里?
所以我尝试在这样的代码中为UICollectionViewFlowLayout设置这些属性
UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc] init];
layout.headerReferenceSize = CGSizeZero;
layout.footerReferenceSize = CGSizeZero;
layout.sectionInset = UIEdgeInsetsMake(0, 0, 0, 0);
layout.minimumInteritemSpacing = 0;
layout.minimumLineSpacing = 0;
layout.itemSize = CGSizeMake(103, 119);
self.calendarView.collectionViewLayout = layout;
Run Code Online (Sandbox Code Playgroud)
但我没有运气.
我怎么能摆脱这个空间?谢谢.
我在尝试创建类似于Spotify的播放器中的UICollectionView时遇到了很多困难:

对我来说问题是双重的.
1)如何使细胞居中,以便您可以看到中间细胞以及左侧和右侧细胞.
2)使用pagingEnabled = YES,collectionview正确地从一个页面滑动到另一个页面.但是,如果没有单元格居中,它只是将集合视图移动到页面上,该页面是屏幕的宽度.所以问题是如何使页面移动,以便你获得上述效果.
3)如何移动细胞的动画大小
我目前的代码是一个简单的UICollectionView,它具有正常的委托设置和自定义的UICollectionview单元格.也许我需要继承子类UICollectionViewFlowLayout?或者我可能需要将pagingEnabled变为NO,然后使用自定义滑动事件?会不会有任何帮助!
objective-c uiscrollview ios uicollectionview uicollectionviewlayout
我们使用UICollectionView来显示覆盖整个屏幕的单元格(减去状态和导航栏).单元格大小设置为self.collectionView.bounds.size:
- (void)viewWillAppear:(BOOL)animated
{
//
// value isn't correct with the top bars until here
//
CGSize tmpSize = self.collectionView.bounds.size;
_currentCellSize = CGSizeMake( (tmpSize.width), (tmpSize.height));
}
- (CGSize)collectionView:(UICollectionView *)collectionView
layout:(UICollectionViewLayout*)collectionViewLayout
sizeForItemAtIndexPath:(NSIndexPath *)indexPath {
return _currentCellSize;
}
Run Code Online (Sandbox Code Playgroud)
这为每个设备设置了正确的大小.每个单元格都定义为没有插入,并且布局没有页眉或页脚.但是,当我们从纵向旋转到横向时,我们得到以下"投诉":
the behavior of the UICollectionViewFlowLayout is not defined because:
the item height must be less that the height of the UICollectionView minus the section insets top and bottom values.
Run Code Online (Sandbox Code Playgroud)
现在我理解了这个错误,但是我们重置了单元格的大小并使用了内置旋转过渡的流程布局:
-(void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
{
//self.collectionView.bounds are still the last size...not the new …Run Code Online (Sandbox Code Playgroud) 作为测试,我做了一个布局,在垂直线上显示单元格,另一个在水平布局中显示它们.当我把[collectionView setCollectionViewLayout:layout animated:YES];它称为两个位置之间的动画非常干净.
现在,我喜欢做的是有各方面的意见做了几个旋转,扭曲,最后到达目的地之前的屏幕(可能使用CAKeyframeAnimations)左右翻转,但我不能找到一个好地方挂钩这一点.
我尝试了子类化UICollectionViewLayoutAttributes以包含动画属性,然后applyLayoutAttributes:在UICollectionViewCell我正在使用的重写方法中设置这些动画.这可行...除了它似乎只在布局转换完成后才会发生.如果我想使用它,我必须让布局不要立即改变对象的当前位置,只有在它到达代码的这个apply属性部分之后,这似乎很多工作......
或者我可以继承UICollectionView和覆盖setCollectionViewLayout:animated:,但在布局之间看起来似乎也有很多状态.无论这些optins的似乎是正确的,因为有这样的动画细胞的添加/删除一个简单的方法中的布局.我觉得应该有类似的东西挂钩布局之间的动画.
有谁知道获得我想要完成的目标的最佳方法?
我一直试图弄清楚如何让细胞填充宽度,正如你在图片中看到的那样,细胞之间的宽度太大了.我使用只有一个imageView的自定义单元格.

我试图从故事板中自定义它,但我想没有选择,或者它应该以编程方式完成.

我的UICollectionViewController:
@IBOutlet var collectionView2: UICollectionView!
let recipeImages = ["angry_birds_cake", "creme_brelee", "egg_benedict", "full_breakfast", "green_tea", "ham_and_cheese_panini", "ham_and_egg_sandwich", "hamburger", "instant_noodle_with_egg.jpg", "japanese_noodle_with_pork", "mushroom_risotto", "noodle_with_bbq_pork", "starbucks_coffee", "thai_shrimp_cake", "vegetable_curry", "white_chocolate_donut"]
override func viewDidLoad() {
super.viewDidLoad()
// Uncomment the following line to preserve selection between presentations
// self.clearsSelectionOnViewWillAppear = false
// Do any additional setup after loading the view.
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
override func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int {
//#warning Incomplete method …Run Code Online (Sandbox Code Playgroud) 我打算在我的一个项目中创建一个书架.基本要求如下:
UICollectionView是我遇到的第一个选项.它可以轻松支持网格单元.所以我用Google搜索并发现了一些非常有用的教程:
Bryan Hansen的UICollectionView自定义布局教程
Mark Pospesel的如何将装饰视图添加到UICollectionView
LXReorderableCollectionViewFlowLayout
结果如下:(请忽略颜色不一致问题,因为我选择的图形尚不完美.)

我做了什么:
但是我遇到了一些问题:
如果项目可以在一个屏幕上显示,我根本无法滚动
然后我添加了以下代码,以使contentize更大
- (CGSize)collectionViewContentSize
{
return CGSizeMake(self.collectionView.bounds.size.width, self.collectionView.bounds.size.height+100);
}
Run Code Online (Sandbox Code Playgroud)
然后我就可以滚动了.在这里,我拉下第一行:

您可以看到徽标的装饰视图正常工作.
但是当我拉出最后一排时,我遇到了第二组问题:

您可以看到绿色框部分未添加装饰视图.
当我重新订购商品时,书架栏有时会移动

我在这里列出了一些重要的代码:
- (void)prepareLayout
{
// call super so flow layout can do all the math for cells, headers, and footers
[super prepareLayout];
NSMutableDictionary *dictionary = [NSMutableDictionary dictionary];
NSMutableDictionary *shelfLayoutInfo = [NSMutableDictionary dictionary];
// decoration view - emblem
NSIndexPath *indexPath = [NSIndexPath indexPathForItem:0 inSection:0]; …Run Code Online (Sandbox Code Playgroud) 我将描述我想要实现的效果,然后我将详细介绍我目前是如何实现这一点以及它的行为有什么问题.我还会提到我看过的另一种方法,但根本无法完成工作.
最相关的代码内嵌在问题的底部,以便快速访问.您可以下载源代码的zip或在BitBucket上将项目作为Mercurial Repository获取.该项目现在包含以下答案的修复程序.如果你想要最初提供的破碎版本,它会被标记为"initial-buggy-version"
该项目是概念/尖峰的最小证明,用于评估效果是否可行,因此它非常轻巧简单!
该应用程序将显示大量离散的信息行,形成一个垂直表.该表将由用户垂直滚动.这是a的标准行为UITableView,你也可以使用它UICollectionView.但是,应用程序还必须支持缩放缩放.当你在桌子上捏缩放时,所有的线条应该挤压在一起.当你伸展时,所有的线都应该分开.
在我的概念证明中,单个细胞没有调整大小,它们只是重新定位在一起或更远.这是故意的:我认为验证这个想法的可行性并不重要.
这是屏幕抓取,显示当前应用程序看起来如何缩小和放大:

我正在使用UICollectionView自定义UICollectionViewLayout子类.布局将UICollectionViewCells一个漂亮的摇摆正弦波放在屏幕中间.每个UICollectionViewCell仅仅是一个容器UILabel持有indexPath行.
的UICollectionViewLayout子类具有参数来设置每个单元之间的垂直间距它描述到UICollectionView,调整这允许表被压扁或如所期望垂直拉伸.
我的UICollectionViewController子类有一个UIPinchGestureRecognizer.当识别器检测到比例变化时,相应地UICollectionView改变布局中的垂直单元间距.
在没有进一步考虑的情况下,缩放将从内容的顶部发生,而不是围绕触摸手势的中心发生.该UICollectionView的contentOffset属性捏提供此功能时调整.
手势识别器还需要适应挤压时发生的拖动.这也是通过改变UICollectionView's 来处理的contentOffset.一些附加代码允许触摸手势的中心点随着手指被添加到手势或从手势移除而改变.
请注意UICollectionView,作为UIScrollView子类,它有自己的UIPanGestureRecognizer与UIPinchGestureRecogniser我添加的交互.我不确定这是否会导致问题.
我添加了代码以UICollectionView在我的捏合手势期间禁用内置滚动,但这似乎没有太大区别.我试图gestureRecognizer:shouldRequireFailureOfGestureRecognizer:使我UIPinchGestureRecognizer的内置失败UIPanGestureRecognizer,但这似乎停止我的捏识别器工作.我不知道这是不是我是傻瓜,还是iOS中的错误.
如前所述,当前的UICollectionViewCells未调整大小.他们只是重新定位.这是故意的.我认为验证这个概念并不重要. …
ios pinchzoom uipinchgesturerecognizer uicollectionview uicollectionviewlayout
uicollectionview ×10
ios ×7
ios6 ×3
objective-c ×3
ios9 ×1
pinchzoom ×1
swift ×1
uikit ×1
uiscrollview ×1
xcode7-beta5 ×1