当前位置: 首页 > 知识库问答 >
问题:

警告:UI收集视图流布局已缓存索引路径“abc”的帧不匹配

公羊晟
2023-03-14

这是导致警告的代码:

private override func layoutAttributesForItemAtIndexPath(indexPath: NSIndexPath) -> UICollectionViewLayoutAttributes? {
    let attributes = super.layoutAttributesForItemAtIndexPath(indexPath)
    let distance = CGRectGetMidX(attributes!.frame) - self.midX;
    var transform = CATransform3DIdentity;
    transform = CATransform3DTranslate(transform, -distance, 0, -self.width);
    attributes!.transform3D = CATransform3DIdentity;
    return attributes
}

控制台还打印:

这可能是因为流布局“xyz”正在修改UICollectionViewFlowLayout返回的属性,而没有复制它们。

如何修复此警告?

共有3个答案

戚宏扬
2023-03-14

我在重写布局时遇到了这个问题。循环访问超级.layout属性元素元素索引(矩形)数组中的每个元素并调用副本对我不起作用,所以我最终回退到基础类并使用NSArray的副本

override func layoutAttributesForElementsInRect(rect: CGRect) -> [UICollectionViewLayoutAttributes]? {
    // unwrap super's attributes
    guard let superArray = super.layoutAttributesForElementsInRect(rect) else { return nil }

    // copy items
    guard let attributes = NSArray(array: superArray, copyItems: true) as? [UICollectionViewLayoutAttributes] else { return nil }

    // modify attributes

    return attributes
}
权玉泽
2023-03-14

除了上面的答案之外。

我知道示例代码是用swift编写的,但我认为使用Objective-C版本会有所帮助。

对于 Objective-C,这不起作用,因为复制函数只执行浅层复制。您必须执行以下操作:

NSArray * original   = [super layoutAttributesForElementsInRect:rect];
NSArray * attributes = [[NSArray alloc] initWithArray:original copyItems:YES];

为了提高可读性,我添加了一个临时变量。

柯瀚海
2023-03-14

这可能是因为流布局“xyz”正在修改UICollectionViewFlowLayout返回的属性,而没有复制它们

果然,这正是你正在做的:

private override func layoutAttributesForItemAtIndexPath(indexPath: NSIndexPath) -> UICollectionViewLayoutAttributes? {
    let attributes = super.layoutAttributesForItemAtIndexPath(indexPath)
    let distance = CGRectGetMidX(attributes!.frame) - self.midX;
    var transform = CATransform3DIdentity;
    transform = CATransform3DTranslate(transform, -distance, 0, -self.width);
    attributes!.transform3D = CATransform3DIdentity;
    return attributes
}

我希望如果你简单地说:

let attributes = 
    super.layoutAttributesForItemAtIndexPath(indexPath).copy() 
    as! UICollectionViewLayoutAttributes

或者类似的,问题就不了了之了。

 类似资料:
  • 问题内容: 这是引起警告的代码: 控制台还会打印: 这很可能发生,因为流布局“ xyz”正在修改UICollectionViewFlowLayout返回的属性而不复制它们。 如何解决此警告? 问题答案: 这很可能发生,因为流布局“ xyz”正在修改UICollectionViewFlowLayout返回的属性而不复制它们 确实,这就是您正在做的事情: 我希望您能简单地说: 或类似的问题将消失。

  • 问题内容: 由于classNames的分配方式不同,我在Material-UI组件中的客户端和服务器端样式渲染之间存在差异。 第一次加载页面时会正确分配className,但是刷新页面后,className将不再匹配,因此组件将失去其样式。这是我在控制台上收到的错误消息: 警告:道具不匹配。服务器:“ MuiFormControl-root-3 MuiFormControl- marginNorm

  • 由于类名的分配不同,我对Material-UI组件中样式的客户端和服务器端呈现之间的差异感到困难。 第一次加载页面时,类名分配正确,但刷新页面后,类名不再匹配,因此组件失去其样式。这是我在控制台上收到的错误消息: 警告:道具不匹配。服务器:“MuiformControl-Root-3 MuiFormControl-marginNormal-4 SearchBar-TextField-31”客户端:

  • 我遇到了自动布局的问题,似乎无法找到应该很容易实现的答案。 我有以下视图层次结构: 标签上的前导/尾随限制使它们在更薄的设备上更高(iPhone 4s vs iPhone 6)。 为了让UIScrollview正常工作,我需要在UIScrollView内部设置UIView的高度约束,以避免出现“不明确的高度”警告。 但在iPhone 4s上运行时,UIView不够高,无法容纳它的子视图。 到目前为

  • 问题内容: 缓存解决方案和索引解决方案之间的真正区别是什么?在我看来,索引解决方案实际上是具有运行搜索查询功能(例如:Elastic Search)的缓存。是否有任何真正的理由在同一项目中同时使用缓存解决方案和索引解决方案,或者索引解决方案基本上会使其他任何缓存变得多余? 示例:假设我对ElasticSearch使用NEST,它将存储并返回POCO;如果我随后查询ElasticSearch并已将P