使用视图的 indexPathForItemAtPoint,我将获得单元格的索引路径,但不会获得 UICollectionReusableView(页眉/页脚)——因为它总是返回 nil。
我想要控制 UICollectionView 的标题,因为我需要根据用户生成的事件删除和添加它。
到目前为止我已经尝试过:
- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout referenceSizeForHeaderInSection:(NSInteger)section{
    if(toRemoveHeader){
        return CGSizeZero;
    }else{
        return CGSizeMake(320, 45);
    }
}
然后[self.collectionView reloadData]每当生成用户事件时调用。我更愿意在不重新加载数据的情况下完成此操作。有任何想法吗?
我已经UICollectionViewLayout为我实现了一个自定义UICollectionView,也是一个UICollectionViewLayoutInvalidationContext希望获得良好性能的自定义。
在我的第一个用例中,我有浮动标题,在滚动期间我只使需要滑动的标题无效。
我这样做如下:
YES从shouldInvalidateLayoutForBoundsChange:.invalidationContextForBoundsChange:方法被调用时,我通过调用invalidateSupplementaryElementsOfKind:atIndexPaths:.invalidateLayoutWithContext:被调用时,我真的不需要做任何事情,因为使标头无效足以使以下关键事情发生:layoutAttributesForSupplementaryViewOfKind:atIndexPath:被调用而不是从prepareLayout.这很好用。
我的第一个问题是:这个场景如何抑制prepareLayout序列?起初我认为向上下文添加任何数据(在这种情况下是陈旧补充的索引路径)足以让 Apple 假设我知道我在做什么(iOS8-wise)而不是调用prepareLayout. 我知道不再相信这一点,正如您将在下面看到的那样。
我的第二个用例:在实践中,我的数据源几乎总是只在最后添加项目。对于我的布局算法,这意味着较早(indexPath-wise)项目的布局不会因新数据而失效。我不想花时间重新计算我不需要的潜在大量布局属性。因此,当客户端代码调用时,我需要做“正确的事情”:
[collection insertItemsAtIndexPaths: newIndices];
通过注意最早的 indexPath 是什么newIndices并从那里开始重新计算我的布局。几乎总是newIndices从最后开始,并且没有现有的单元格变得陈旧——因此 Apple 应该只询问我的布局对象的新单元格的属性。
但请注意,invalidationContextForBoundsChange:对于插入/删除/移动调用没有类似的方法。所以我无法预先配置我的上下文,并说明什么索引来来去去。
所以在调用内部insertItemsAtIndexPaths:会发生什么:
invalidateLayout被调用之前。在初始化时,self.invalidateEverything并且self.invalidateDataSourceCounts是 (NO,NO) (并且它们是只读的)。invalidateLayoutWithContext:现在被调用,invalidateDataSourceCounts设置为YES--Apple 只告诉我我的计数已经过时。这是没用的,因为它没有告诉我关于在哪里重新开始布局计算的任何信息。但这是我第一次(也是唯一一次)注意到某事或做某事。prepareLayout被叫到——Grrr!我不想重新开始。我不想 …我目前有一个UICollectionViewusing UICollectionViewCompositionalLayout. 我想在滚动/滚动停止时为当前可见单元格中的一些视图设置动画。
不幸的是,它似乎orthogonalScrollingBehavior在一个部分上设置了任何东西,但.none劫持了UICollectionView随附的UIScrollView委托方法。
想知道目前是否有任何解决方法?获取分页行为和UIScrollView委托?
  enum Section {
    case main
  }
  override func awakeFromNib() {
    super.awakeFromNib()
    collectionView.collectionViewLayout = createLayout()
    collectionView.delegate = self
  }
  func configure() {
    snapshot.appendSections([.main])
    snapshot.appendItems(Array(0..<10))
    dataSource.apply(snapshot, animatingDifferences: false)
  }
 private func createLayout() -> UICollectionViewLayout {
    let leadingItem = NSCollectionLayoutItem(
      layoutSize: NSCollectionLayoutSize(
        widthDimension: .fractionalWidth(1.0),
        heightDimension: .fractionalHeight(1.0))
    )
    leadingItem.contentInsets = .zero
    let containerGroup = NSCollectionLayoutGroup.horizontal(
      layoutSize: NSCollectionLayoutSize(
        widthDimension: .fractionalWidth(1.0),
        heightDimension: .fractionalHeight(1.0)
      ),
      subitems: [leadingItem]) …I'm currently facing an issue with compositional layout which can also be seen in Apple's example -> ConferenceNewsFeedViewController. The item height is set to .estimated(100) and the width is set to .fractionalWidth(1.0). On the initial display the cell is not wrapping the label content. Only if you begin to scroll the layout of the cells are corrected. Does anybody know how to fix this issue?
Here is the incorrect layout:
Here is the layout after scrolling:
I know that …
ios uicollectionview uicollectionviewlayout swift uicollectionviewcompositionallayout
我已经阅读了在MessageKit 中创建自定义单元格的指南,以及这样的问题
我正在尝试创建一个自定义单元格;这是我的继承自 a 的单元格的代码UICollectionViewCell:
import UIKit
import MessageKit
open class ChatReferenceCell: UICollectionViewCell {
    
    @IBOutlet weak var authorLabel: UILabel!
    @IBOutlet weak var referenceText: UITextView!
    @IBOutlet weak var participantsLabel: UILabel!
    
    public override init(frame: CGRect) {
        super.init(frame: frame)
        setupSubviews()
    }
    
    public required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        setupSubviews()
    }
    
    open func setupSubviews() {
    }
    
    open override func layoutSubviews() {
        super.layoutSubviews()
    }
    
    open func configure(with message: MessageType, at indexPath: IndexPath, and messagesCollectionView: MessagesCollectionView) {
        // Do stuff
        switch …ios uicollectionview uicollectionviewlayout swift messagekit
我正在创建一个类似于iOS中的跳板屏幕的视图.(这是对这个问题的后续问题).我的实现是一个集合视图,它具有使用UICollectionViewLayout的自定义布局.此布局是根据本答案中发布的代码构建的.由于我想要让我的图标摇动并在左上角有一个小删除按钮,因此我将子类化为UICollectionViewLayoutAttributes,其新属性为deleteButtonHidden.所有这一切都很好地协同工作.但是当我使用更多图标填充集合视图以适合一个页面时,我遇到了问题.当我进入编辑模式,并来回滚动时,我发现有些图标不再抖动了.我试着调试它,我意识到我的一些单元格没有调用applyLayoutAttributes方法.我也尝试在方法scrollViewDidScroll中调用invalidateLayout,但这没有帮助.
有没有人知道为什么有些单元格没有应用它们的属性?
更新:我刚刚发现Apple拥有摇晃图标专利.因此,实施此设计不会得到批准.因此,这个问题不再适用.
我有一个UICollectionView,它包含集合每个部分中每个项目的补充视图.当我尝试使用init/final方法中的任何一个来补充视图时:
- (UICollectionViewLayoutAttributes *)initialLayoutAttributesForAppearingSupplementaryElementOfKind:(NSString *)elementKind atIndexPath:(NSIndexPath *)elementIndexPath;
- (UICollectionViewLayoutAttributes *)finalLayoutAttributesForDisappearingSupplementaryElementOfKind:(NSString *)elementKind atIndexPath:(NSIndexPath *)elementIndexPath;
我正在返回的属性似乎不会影响正在离开(或进入)集合视图的补充视图.补充意见的目的是作为简历中每个项目的"轮辐".辐条应该从视图的中心绘制到其相关项目.我试图修改每个离开/到达辐条的属性的alpha,transform3d等,让它从项目单元格中生长或缩小到中心.这些属性都不会影响进入/离开集合视图的补充视图.
我修改了教科书CircleLayout来演示我遇到的问题.t在Github上分叉:https://github.com/dcoder2099/CircleLayout
该c997dea82a提交的文件我的变化.在其中,我将UICollectionReusableView子类化为我的"SpokeReusableView",并在其init中附加一个"SpokeLayer"实例,该实例通过CAShapeLayer的子类进行绘制.辐条的原点和端点被建模为名为SpokeAttributes的UICollectionViewLayoutAttributes的子类中的附加属性.
更改的内容(至少,我期望工作)是在CircleLayout中实现的补充视图的init/final方法的添加.
但我似乎无法使这些属性影响到达/离开辐条.我不确定是不是因为我在CAShapeLayer中实现绘图的方式,或者我在SpokeReusableView中做错了什么.或者,如果它对所有项目和补充视图的布局属性管理不当都是平凡的.在阅读(并重新阅读和重新阅读)Apple的Collection View Programming Guide时,我的印象是底层动画系统(CA?)应该在补充视图进入/离开时应用属性,但是我只是没有看到它发生.
任何帮助将不胜感激.
我使用的UICollectionView是自定义布局,但是在向下滚动和向上滚动后,单元格消失了,这是我遇到的问题。
请观看有关我的问题的视频演示。
我已经进行了一些Google搜索,其他人也遇到了相关问题,并且我认识到这可能是由于单元重用造成的,但是我在其他地方找不到的答案都没有帮助我。
所以我的问题是:
为什么会这样呢?
如何阻止这种情况的发生?
有趣的是,一旦我提出UIViewController并关闭了它,该问题就不再发生。请观看实际操作中的视频。
注意:此错误已经存在了一段时间(至少自iOS 10起,并且尚未在iOS 11 beta 1中修复)。
编辑1
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
    switch (indexPath as NSIndexPath).row {
    case 0:
        // Speak Logo Cell
        let speakLogoCell = collectionView.dequeueReusableCell(withReuseIdentifier: "SpeakLogoCell", for: indexPath) as! SpeakLogoCell
        recordButton = speakLogoCell.recordButton
        return speakLogoCell
    case 1:
        // Text Input Cell
        let inputCell = collectionView.dequeueReusableCell(withReuseIdentifier: "InputCell", for: indexPath) as! InputCell
        inputCell.inputTextView.delegate = self
        inputTextView = inputCell.inputTextView
        // Only restore …ios uicollectionview uicollectionviewcell uicollectionviewlayout swift
按我对用自定义布局的uicollectionview自上浆细胞,通过大文章知情如理解这个由理查德·特顿,的方式来处理自身上浆细胞是通过
prepare,因为他们将有机会使用真实的自动布局计算更新自己preferredLayoutAttributesFitting在单元格中提供单元格计算首选属性(框架)的位置,invalidationContext(forPreferredLayoutAttributes:withOriginalAttributes)在初始加载时,这似乎对我来说很好.但是,在通过调用驱动的更改中collectionView.performBatchUpdates,我或者看到设置的估计大小的单元格的闪现prepare,或者它有时会结束(如果我试图用初始大小设置它们的动画).
我按照流程,我看到通过失效流程正确提供了属性.prepare虽然被调用多次(包括在通过首选属性失效正确设置属性之后).这似乎踩到正确的大小,至少是暂时的,导致动画故障(或糟糕的最终布局).
我已经能够在调用 a 的互联网上找到的唯一有效的解决方案performBatchUpdates,跳过尝试使用首选的Attributes方法,并在方法内的UICV上调用委托方法,prepare以便在该步骤中获得正确的大小,但这似乎违背了工具提供.
也许是一个已知问题
仅供参考,与几位收藏视图工程师交谈,这似乎是一个错误.他们建议使用参考单元手动调整大小的方法.