我正在尝试UICollectionViewCells使用自动布局进行自我调整,但我似乎无法让单元格根据内容调整自己的大小.我无法理解如何根据单元格内容中的内容更新单元格的大小.
这是我尝试过的设置:
UICollectionViewCell一个UITextView.UITextView已禁用.UITextView固定在单元格左侧,显式宽度为320.UITextView固定到单元格的顶部.UITextView具有高度限制设置为其中一个恒定的UITextView报告将适合文本.这是单元格背景设置为红色,UITextView背景设置为蓝色的样子:

我把我已经在GitHub上玩的项目在这里.
如何在一部分中设置单元格间距UICollectionView?我知道有一个属性minimumInteritemSpacing我已经设置为5.0仍然间距不出现5.0.我已经实现了flowout委托方法.
- (CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout minimumInteritemSpacingForSectionAtIndex:(NSInteger)section
{
return 5.0;
}
Run Code Online (Sandbox Code Playgroud)
我仍然没有得到理想的结果.我认为它的最小间距.我有没有办法设置最大间距?

我有一个UICollectionView显示照片.我使用了创建了collectionview UICollectionViewFlowLayout.它工作得很好,但我希望在边距上有间距.是否有可能使用UICollectionViewFlowLayout或必须实现我自己的UICollectionViewLayout?
我正在寻找一个指南或教程,它将向我展示如何仅使用代码设置一个简单的UICollectionView.
但我真的可以从一个简单的指南中受益,它可以告诉我如何设置UICollectionView而不必使用Storyboard或XIB/NIB文件 - 但不幸的是,当我搜索时,我能找到的只是具有故事板的教程.
我正在努力学习如何使用UICollectionView.该文件是一个有点难以理解,而我发现教程无论是在目标C或长期复杂的项目当中.
当我学习如何使用时UITableView,我们❤Swift的 如何用iOS 8和Swift制作一个简单的桌面视图有一个非常基本的设置和解释让我去.有这样的东西UICollectionView吗?
下面的答案是我试图学习如何做到这一点.
我试图将添加UIRefreshControl到UICollectionView,但问题是,刷新控制不会出现,除非集合视图填补了其父容器的高度.换句话说,除非集合视图足够长以至于需要滚动,否则无法向下拉以显示刷新控件视图.一旦集合超过其父容器的高度,它就会被拉下并显示刷新视图.
我已经UICollectionView在主视图内部设置了一个快速iOS项目,并在集合视图中添加了一个插座,以便我可以添加UIRefreshControl它viewDidLoad.还有一个带有重用标识符的原型单元cCell
这是控制器中的所有代码,它很好地演示了这个问题.在此代码中,我将单元格的高度设置为100,这不足以填充显示,因此无法拉取视图并且不会显示刷新控件.将其设置为更高的值以填充显示,然后它可以工作.有任何想法吗?
@interface ViewController () <UICollectionViewDelegateFlowLayout, UICollectionViewDataSource>
@property (strong, nonatomic) IBOutlet UICollectionView *collectionView;
@end
@implementation ViewController
- (void)viewDidLoad
{
[super viewDidLoad];
UIRefreshControl *refreshControl = [[UIRefreshControl alloc] init];
[self.collectionView addSubview:refreshControl];
}
-(NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView {
return 1;
}
-(NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {
return 1;
}
-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
return [collectionView dequeueReusableCellWithReuseIdentifier:@"cCell" forIndexPath:indexPath];
}
-(CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath {
return CGSizeMake(self.view.frame.size.width, 100);
}
Run Code Online (Sandbox Code Playgroud) 我UICollectionView在Swift 中使用了一个,但是当我尝试更改单元格标签的文本时,我得到了.
func collectionView(collectionView: UICollectionView!, numberOfItemsInSection section: Int) -> Int
{
return 5
}
func collectionView(collectionView: UICollectionView!, cellForItemAtIndexPath indexPath: NSIndexPath!) -> UICollectionViewCell!
{
var cell = collectionView.dequeueReusableCellWithReuseIdentifier("title", forIndexPath: indexPath) as TitleCollectionViewCell
// Next line: fatal error: unexpectedly found nil while unwrapping an Optional value
cell.labelTitle.text = "This is a title"
return cell
}
Run Code Online (Sandbox Code Playgroud)
有谁知道这个?
我想加入UICollectionView到ViewController了,我需要有"每行" 3个细胞无细胞之间的空格(它应该看起来像一个网格).单元格宽度应该是屏幕尺寸的三分之一,所以我认为layout.item宽度应该相同.但后来我明白了:

如果我减小那个尺寸(例如7或8像素),那就更好了,但是行中的第三个单元格不是完全可见的,我仍然有那个空白区域(顶部和底部,左侧和右侧).

class ViewController: UIViewController, UICollectionViewDelegateFlowLayout, UICollectionViewDataSource {
var collectionView: UICollectionView?
var screenSize: CGRect!
var screenWidth: CGFloat!
var screenHeight: CGFloat!
override func viewDidLoad() {
super.viewDidLoad()
screenSize = UIScreen.mainScreen().bounds
screenWidth = screenSize.width
screenHeight = screenSize.height
// Do any additional setup after loading the view, typically from a nib
let layout: UICollectionViewFlowLayout = UICollectionViewFlowLayout()
layout.sectionInset = UIEdgeInsets(top: 20, left: 0, bottom: 10, right: 0)
layout.itemSize = CGSize(width: screenWidth / 3, height: …Run Code Online (Sandbox Code Playgroud) uicollectionview uicollectionviewcell uicollectionviewlayout swift
我UICollectionView有一个UICollectionViewFlowLayout,我想计算它的内容大小(intrinsicContentSize通过AutoLayout调整其高度所需的返回).
问题是:即使我对所有单元都有一个固定且相等的高度,我也不知道我有多少"行"/行UICollectionView.我也无法通过数据源中的项目数来确定计数,因为表示数据项的单元格的宽度不同,因此我在一行中的项目数量也不同UICollectionView.
由于我在官方文档中找不到关于此主题的任何提示,谷歌搜索没有给我带来任何进一步的帮助和想法将非常感激.
在iOS 8中,UICollectionViewFlowLayout支持根据自己的内容大小自动调整单元格大小.这根据其内容在宽度和高度上调整单元的大小.
是否可以为所有单元格的宽度(或高度)指定固定值,并允许其他尺寸调整大小?
对于一个简单的示例,请考虑单元格中的多行标签,其中约束将其定位到单元格的两侧.可以通过不同方式调整多行标签的大小以容纳文本.单元格应填充集合视图的宽度并相应地调整其高度.相反,单元格的大小是随意调整的,当单元格大小大于集合视图的不可滚动维度时,它甚至会导致崩溃.
iOS 8引入了方法systemLayoutSizeFittingSize: withHorizontalFittingPriority: verticalFittingPriority:对于集合视图中的每个单元格,布局在单元格上调用此方法,传入估计的大小.对我来说有意义的是在单元格上覆盖此方法,传递给定的大小并将水平约束设置为required,并将垂直约束设置为低优先级.这样,水平尺寸固定为布局中设置的值,垂直尺寸可以灵活.
像这样的东西:
- (UICollectionViewLayoutAttributes *)preferredLayoutAttributesFittingAttributes:(UICollectionViewLayoutAttributes *)layoutAttributes {
UICollectionViewLayoutAttributes *attributes = [super preferredLayoutAttributesFittingAttributes:layoutAttributes];
attributes.size = [self systemLayoutSizeFittingSize:layoutAttributes.size withHorizontalFittingPriority:UILayoutPriorityRequired verticalFittingPriority:UILayoutPriorityFittingSizeLevel];
return attributes;
}
Run Code Online (Sandbox Code Playgroud)
然而,这种方法给出的尺寸是完全奇怪的.关于这种方法的文档对我来说是非常不清楚的,并提到使用UILayoutFittingCompressedSize UILayoutFittingExpandedSize仅代表零大小和相当大的常量.
size这个方法的参数真的只是传递两个常量的方法吗?难道没有办法实现我期望获得给定大小的适当高度的行为吗?
1)添加将为单元格指定特定宽度的约束可实现正确的布局.这是一个糟糕的解决方案,因为该约束应该设置为单元的集合视图的大小,它没有安全的引用.在配置单元格时,可以传入该约束的值,但这似乎也完全违反直觉.这也很尴尬,因为直接向单元格或其内容视图添加约束会导致许多问题.
2)使用表格视图.由于单元格具有固定的宽度,因此表视图以这种方式开箱即用,但这不适用于其他情况,例如在多列中具有固定宽度单元格的iPad布局.
uicollectionview ×10
ios ×9
autolayout ×3
objective-c ×3
swift ×3
cocoa-touch ×1
height ×1
uikit ×1