对于我们使用的UICollectionView动态高度单元,
if let layout = self.collectionViewLayout as? UICollectionViewFlowLayout {
layout.estimatedItemSize = UICollectionViewFlowLayoutAutomaticSize
}
Run Code Online (Sandbox Code Playgroud)
对于高度和宽度的适当约束,它适用于iOS 11.*版本,但它破坏并且不会使iOS 12.0的单元格动态
uicollectionview uicollectionviewlayout swift uicollectionviewflowlayout ios12
我正在使用单元格宽度为67的UICollectionView,现在我正在使用流布局.
我连续有3个细胞,细胞之间有30px的空间.如何减少距离,以便我可以连续安装四个细胞?这种方法与它有关吗?
- (UIEdgeInsets)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout insetForSectionAtIndex:(NSInteger)section
{
return UIEdgeInsetsMake(10, 10, 10, 10);
}
Run Code Online (Sandbox Code Playgroud) objective-c storyboard ios uicollectionview uicollectionviewflowlayout
环境:
UICollectionView看起来像UITableView的
自定义UICollectionViewFlowLayout子类来定义frame的的DecorationView
启用自调整大小细胞
预期行为:
A DecorationView应该作为背景放置在每个部分UICollectionView
观察到的行为:
在DecorationView崩溃到任意尺寸:
似乎UICollectionView试图计算自动大小DecorationView.如果我禁用Self-Sizing单元格,则装饰视图将精确放置在预期位置.
有没有办法禁用Self-Sizing DecorationView?
在我的UICollectionViewFlowLayout子类中,我只需要截取该部分中的第一个和最后一个单元格并拉伸背景以填充它们下面的空间.问题是UICollectionView不考虑那里计算的大小:
override func layoutAttributesForDecorationView(ofKind elementKind: String, at indexPath: IndexPath) -> UICollectionViewLayoutAttributes? {
guard let collectionView = collectionView else {
return nil
}
let section = indexPath.section
let attrs = UICollectionViewLayoutAttributes(forDecorationViewOfKind: backgroundViewClass.reuseIdentifier(),
with: indexPath)
let numberOfItems = collectionView.numberOfItems(inSection: section)
let lastIndex = numberOfItems - 1
guard let firstItemAttributes = layoutAttributesForItem(at: IndexPath(indexes: [section, …Run Code Online (Sandbox Code Playgroud) ios autolayout uicollectionview swift uicollectionviewflowlayout
uikit uicollectionview uicollectionreusableview swift uicollectionviewflowlayout
我正在创建一个UICollectionView具有动态高度的单元格并使用estimatedItemSize属性UICollectionViewFlowLayout(Apple Docs Reference)。
虽然,我注意到一旦我设置了estimatedItemSize属性,我prefetchItemsAt的UICollectionViewDataSourcePrefetching委托方法就不会被调用。
func collectionView(_ collectionView: UICollectionView, prefetchItemsAt indexPaths: [IndexPath])
如果我没有设置estimatedItemSize,预取将再次开始工作。这是已知的行为还是我在这里做错了什么?请帮忙。
示例代码:
class CollectionViewController: UICollectionViewController {
var layout: UICollectionViewFlowLayout = {
let layout = UICollectionViewFlowLayout()
let width = UIScreen.main.bounds.size.width
layout.estimatedItemSize = CGSize(width: width, height: 100)
return layout
}()
override func viewDidLoad() {
super.viewDidLoad()
if #available(iOS 10.0, *) {
collectionView?.prefetchDataSource = self
}
collectionView.collectionViewLayout = layout
// Register cell classes
self.collectionView.register(UINib.init(nibName: "CollectionViewCell", bundle: nil), forCellWithReuseIdentifier: reuseIdentifier) …Run Code Online (Sandbox Code Playgroud) 我UICollectionReusableView用作UICollectionView部分的标题。我启用了“粘性标题”:
let layout = collectionView.collectionViewLayout as? UICollectionViewFlowLayout
layout?.sectionHeadersPinToVisibleBounds = true
Run Code Online (Sandbox Code Playgroud)
我正在插入新的部分来收集:
collectionView.performBatchUpdates({
self.collectionView.insertSections(IndexSet(integersIn: collectionView.numberOfSections...viewModel.numberOfSections - 1))
}, completion: nil)
Run Code Online (Sandbox Code Playgroud)
如果在集合过度滚动(启用反弹)时发生插入,标题将消失一段时间(见下面的 GIF)。我怎样才能避免这种行为?
我使用的是 iOS 12.1.4,但同样的问题也发生在 iOS 11.x 和 12.x 模拟器上。
如果关闭反弹效果,问题就不会发生,但我想保持打开状态以获得更平滑的滚动感觉。我在更新之前/之后尝试使布局无效,但没有结果。谢谢你的建议。
编辑 (02/26/2019)
解决方法:包装插入以performWithoutAnimation阻止标题消失但显然禁用重新加载动画。
UIView.performWithoutAnimation {
collectionView.performBatchUpdates({
self.collectionView.insertSections(IndexSet(integersIn: collectionView.numberOfSections...viewModel.numberOfSections - 1))
}, completion: nil)
}
Run Code Online (Sandbox Code Playgroud) ios uicollectionview uicollectionreusableview swift uicollectionviewflowlayout
class StretchyHeader: UICollectionViewFlowLayout {
override func layoutAttributesForElements(in rect: CGRect) -> [UICollectionViewLayoutAttributes]? {
let layoutAttributes = super.layoutAttributesForElements(in: rect)! as [UICollectionViewLayoutAttributes]
let contentOffset = collectionView!.contentOffset
if (contentOffset.y < 0) {
let deltaY = abs(contentOffset.y)
for attributes in layoutAttributes where attributes.representedElementKind == UICollectionView.elementKindSectionHeader {
var frame = attributes.frame
frame.size.height = headerReferenceSize.height + deltaY
frame.origin.y = frame.minY - deltaY
attributes.frame = frame
}
}
return layoutAttributes
}
override func shouldInvalidateLayout(forBoundsChange newBounds: CGRect) -> Bool {
return true
}
}
Run Code Online (Sandbox Code Playgroud)
尝试将其实现为组合布局,但到目前为止效果不佳。我怎样才能在构图布局中实现这一目标?
uicollectionview uicollectionviewlayout swift uicollectionviewflowlayout uicollectionviewcompositionallayout
我注意到一个很大的问题,在从右到左的语言中,单元格顺序没有正确反转,只有对齐是正确的.但仅适用于水平流布局,如果集合视图包含不同的单元格大小!是的,我知道这听起来很疯狂.如果所有单元格大小相同,则排序和对齐方式都很好!
以下是我到目前为止使用示例应用程序(隔离以确保这是实际问题,而不是其他内容):
这是UICollectionViewFlowLayout(在iOS 11上)的内部错误吗?或者有什么明显的东西我不见了?
这是我的测试代码(Nothing fancy + XIB with UICollectionView):
public func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return 6
}
public func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "test", for: indexPath)
cell.backgroundColor = (indexPath.item == 0) ? UIColor.blue : UIColor.red
return cell
}
public func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
return CGSize(width: (10 * indexPath.item) + …Run Code Online (Sandbox Code Playgroud) right-to-left ios uicollectionview ios11 uicollectionviewflowlayout
我正在尝试UIScrollView使用此代码水平绘制列表,但未按预期工作?
let nib = UINib(nibName: cellIdentifier, bundle: nil)
collectionView.register(nib, forCellWithReuseIdentifier: cellIdentifier)
collectionView.collectionViewLayout = layout(withParentView: view)
self.collectionView.delegate = self
self.collectionView.dataSource = self
Run Code Online (Sandbox Code Playgroud)
流式布局法
// #PRAGMA mark - UICollectionViewFlowLayout()
func layout(withParentView parentView: UIView) -> UICollectionViewFlowLayout {
let layout = UICollectionViewFlowLayout()
layout.itemSize = CGSize(width: 160, height: 65)
layout.sectionInset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)
layout.minimumLineSpacing = 0
layout.minimumInteritemSpacing = 0
layout.scrollDirection = .horizontal
return layout
}
Run Code Online (Sandbox Code Playgroud)
这是委托和数据源方法
func numberOfSections(in collectionView: UICollectionView) -> Int {
return 1
}
func …Run Code Online (Sandbox Code Playgroud) 我已经为节标题创建了一个类,并将其加载到我的 UICollectionView 中。我能够显示第一个标题(尽管很奇怪,请参见下文),但是以下任何部分标题都是空白的。正在引用尺寸,但内容(背景颜色、标签)不会出现。
然后还有...确实显示的一个节标题,它以大约缩进显示。150px 无明显原因。标题默认居中对齐吗?如果是这样,我将如何左对齐它们?
我的节标题类:
func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView {
switch kind {
case UICollectionView.elementKindSectionHeader:
let section = indexPath.section
switch section {
case 0:
let tagsHeader = searchCollectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: "TagsHeaderView", for: indexPath) as! SectionHeaderView
tagsHeader.headerString = "Recent Tags"
tagsHeader.backgroundColor = .green
return tagsHeader
default:
let tagsHeader = searchCollectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: "TypeHeaderView", for: indexPath) as! SectionHeaderView
tagsHeader.headerString = "Type"
tagsHeader.backgroundColor = .blue
return tagsHeader
}
default:
return UICollectionReusableView()
}
}
Run Code Online (Sandbox Code Playgroud)
在我的 …
uicollectionview ×10
uicollectionviewflowlayout ×10
swift ×8
ios ×5
uikit ×2
autolayout ×1
ios11 ×1
ios12 ×1
objective-c ×1
storyboard ×1