首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

带有动态图像尺寸的UICollectionViewCell -当u滚动时,当重新使用TestApp附加的单元格时,图像将失去其初始约束

基础概念

UICollectionViewCell 是 iOS 开发中用于在 UICollectionView 中显示内容的单元格。动态图像尺寸意味着单元格的高度会根据图像的内容动态调整。约束(Constraints)是 Auto Layout 的一部分,用于定义视图之间的相对位置和大小。

相关优势

  1. 灵活性:动态图像尺寸允许单元格根据内容自适应大小,提供更好的用户体验。
  2. 性能优化:通过重用单元格,可以减少内存使用和提高滚动性能。

类型与应用场景

  • 类型:动态高度单元格通常用于显示不同大小的图像或文本内容。
  • 应用场景:社交媒体应用、新闻应用、电商应用等需要展示多样化内容的场景。

遇到的问题及原因

问题描述:当滚动 UICollectionView 时,重用的单元格中的图像失去了其初始约束,导致布局错乱。

原因分析

  1. 约束未正确更新:在重用单元格时,可能没有重新设置或更新图像视图的约束。
  2. 缓存高度问题:如果使用了缓存机制来存储单元格的高度,缓存的数据可能不准确或未及时更新。

解决方案

步骤 1:更新约束

UICollectionViewCellprepareForReuse 方法中重置约束,并在配置单元格内容时重新应用约束。

代码语言:txt
复制
override func prepareForReuse() {
    super.prepareForReuse()
    imageView.translatesAutoresizingMaskIntoConstraints = false
    // 移除之前的约束
    imageView.removeConstraints(imageView.constraints)
}

func configure(with image: UIImage) {
    imageView.image = image
    // 重新添加约束
    NSLayoutConstraint.activate([
        imageView.topAnchor.constraint(equalTo: contentView.topAnchor),
        imageView.leadingAnchor.constraint(equalTo: contentView.leadingAnchor),
        imageView.trailingAnchor.constraint(equalTo: contentView.trailingAnchor),
        imageView.bottomAnchor.constraint(equalTo: contentView.bottomAnchor)
    ])
}

步骤 2:动态计算高度

UICollectionViewDelegateFlowLayout 中实现 collectionView(_:layout:sizeForItemAt:) 方法,根据图像的实际尺寸动态计算单元格的高度。

代码语言:txt
复制
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
    let image = images[indexPath.item]
    let aspectRatio = image.size.width / image.size.height
    let width = collectionView.bounds.width
    let height = width / aspectRatio
    return CGSize(width: width, height: height)
}

步骤 3:使用自动布局计算高度

如果图像的尺寸在加载时未知,可以使用 UIView.performBatchUpdates 来动态调整单元格的高度。

代码语言:txt
复制
func collectionView(_ collectionView: UICollectionView, willDisplay cell: UICollectionViewCell, forItemAt indexPath: IndexPath) {
    if let imageCell = cell as? ImageCell, let image = imageCell.imageView.image {
        UIView.performBatchUpdates(nil, completion: { _ in
            imageCell.heightConstraint.constant = image.size.height
            collectionView.layoutIfNeeded()
        })
    }
}

示例代码

假设 ImageCell 是自定义的 UICollectionViewCell 类,其中包含一个 UIImageView 和一个用于动态高度的约束 heightConstraint

代码语言:txt
复制
class ImageCell: UICollectionViewCell {
    let imageView = UIImageView()
    var heightConstraint: NSLayoutConstraint!

    override init(frame: CGRect) {
        super.init(frame: frame)
        setupViews()
    }

    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    private func setupViews() {
        imageView.contentMode = .scaleAspectFit
        contentView.addSubview(imageView)
        imageView.translatesAutoresizingMaskIntoConstraints = false
        heightConstraint = imageView.heightAnchor.constraint(equalToConstant: 0)
        NSLayoutConstraint.activate([
            imageView.topAnchor.constraint(equalTo: contentView.topAnchor),
            imageView.leadingAnchor.constraint(equalTo: contentView.leadingAnchor),
            imageView.trailingAnchor.constraint(equalTo: contentView.trailingAnchor),
            heightConstraint
        ])
    }

    override func prepareForReuse() {
        super.prepareForReuse()
        imageView.image = nil
        heightConstraint.constant = 0
    }
}

通过上述步骤和代码示例,可以有效解决 UICollectionViewCell 在滚动时图像失去初始约束的问题。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

【IOS开发基础系列】UICollectionView专题

这个特性很受欢迎,因此在UICollectionView中Apple继承使用了这个特性,并且把其进行了一些扩展。...,用作cell平时的背景     • 再其上是selectedBackgroundView,是cell被选中时的背景     • 最后是一个contentView,自定义内容应被加在这个view上         ...需要注意根据滚动方向不同,header和footer的高和宽中只有一个会起作用。垂直滚动时section间宽度为该尺寸的高,而水平滚动时为宽度起作用,如图。     ...UICollectionView的委托回调配置,再初始化UICollectionViewCell。     ...collectionView = [[UICollectionView alloc] initWithFrame:CGRectZero collectionViewLayout: _flowLayout]; 要点1:单元格尺寸计算时要来考虑间隔线宽度的影响

90430

JavaScript--DOM总结

Image对象的事件句柄 事件句柄 描述 onerror 在加载图像的过程中发生错误时调用的事件句柄 onabort 当用户放弃图像的加载时调用的事件句柄 onload 当图像加载完成时调用的事件句柄...rotate() 旋转当前绘图 translate() 重新映射画布上的 (0,0) 位置 transform() 替换绘图的当前转换矩阵 setTransform() 将当前转换重置为单位矩阵。...,其包含指定的 ImageData 对象的图像数据 方法 描述 createImageData() 创建新的、空白的 ImageData 对象 getImageData() 返回 ImageData...metaKey 返回当事件被触发时,"meta" 键是否被按下。 relatedTarget 返回与事件的目标节点相关的节点。 screenX 返回当某个事件被触发时,鼠标指针的水平坐标。...screenY 返回当某个事件被触发时,鼠标指针的垂直坐标。 shiftKey 返回当事件被触发时,"SHIFT" 键是否被按下。

7610
  • 添加多个屏幕-创建格线布局

    在上一节中,我们学习了如何使用按钮更改iPhone的屏幕。让我们进一步推动!我们将实现一个CollectionView,我们将能够切换到您想要的壁纸。该的CollectionView将是滚动的水平。...我们在图像下面插入一个标签。文本是iPhone X并将底部约束为0并将容器中的水平中心约束。在“ 属性”检查器中,将“滚动方向”更改为“ 水平”并取消选中“ 显示”指示器。...在返回cell的上方,将委托设置为self。这样,您将cell附加到DialogViewController。...使用segue的名称声明一个if语句。这样,您确定在调用此segue时,我们将执行操作。将委托设置为self。我们需要使用委托来指定我们正在调用,否则,View Controller不知道。...cell.index = indexPath.row 返回UIImage 当我们点击按钮时,它将在函数中返回UIImage类型的图像。为ARScreen的图像声明一个新数组。

    2.9K40

    AsyncDisplayKit 2.0 教程:入门「译」

    在这两部分 AsyncDisplayKit 2.0 教程中,你将掌握使用ASDK构建一个实用的和动态的应用程序的所有要素。在第一部分中,你将要学习一些在你构建应用程序时可以用到的宏观思想。...这是当cell的每个 subNode (例如ASNetworkImageNode) 的内容从外源加载,例如API和本地缓存。这与批量获取时,使用用模型对象代表cell本身形成对比。...例如:你正在使用一个 ASNetworkImageNode在 gallery 的每个页面中展示图像,当每个cell进入 Preload Range 时,会发送网络请求,并且在进入 Display Range...时进行图像解码。...当用户改变其滚动方向时,范围的大小也是相反的,以便于对应用户实际移动的方向。 Node接口的状态回调 你可能会疑惑:这些 Ranges 是如何正确工作的?

    2.2K20

    最新iOS设计规范四|3大界面要素:视图(Views)

    尽量保持消息足够短,尽量保持在一两行之内避免滚动,注意语句大小写及标点符号。 避免使用带有指责、批判、或侮辱性的词语。...当标准行或网格布局足够时,避免创建新的设计。集合应该是用来优化用户体验的,而不是成为关注的焦点。集合应该让用户松选择项目更方便。如果在你的集合中很难找到某个条目,用户会感到沮丧并失去兴趣。...当滚动视图的缩放选项被打开时,设置比较合适的最大及最小值。例如:放大文本直到一个单一的字符充满整个屏幕,即使其可能对于大部分应用来说是没有意义的。 当滚动视图处于页面模式时考虑显示页面控制元素。...所以如果你需要在一个屏幕中放置两个滚动视图时,尽量考虑允许它们在不同的方向进行滚动,如此可能对其相互间的影响是最小的。...表单中的行 使用标准表格单元格样式来定义内容在表格行中的显示方式。 基础列表(默认):行的左侧显示图像,其后紧跟左对齐标题。对于不需要显示其他附加信息的项目来说,这是一种很好的选择。

    8.5K31

    AI再颠覆材料学!微软MatterGen直接生成新材料,稳定性超SOTA模型2.9倍

    晶体材料可由其重复单元(即单元格)定义,单元格编码原子类型A(即化学元素)、坐标X和周期晶格L。 作者为每个成分定义了一个适合其自身几何形状的破坏过程,并具有物理上的极限噪声分布。...为了生成具有所需属性约束的材料,研究人员还引入了适配器模块,这些模块可用于在带有属性标签的附加数据集上对「基础模型」进行微调,如下图b所示。...由此产生的微调模型与无分类器引导结合使用,引导生成的结果符合目标属性约束。...如图d所示,当生成1000个结构时,独特结构的百分比是100% ,而当生成100万个结构时,独特结构的百分比仅下降到86% ,而新颖性保持稳定在68%左右。...此外,当筛选方法因数据库中的材料枯竭而趋于饱和时,MatterGen可以不断生成满足高体积模量等目标特性的新型材料。

    92510

    30分钟了解所有引擎组件,132个Unity 游戏引擎组件速通!【收藏 == 学会】

    当您想要自定义布娃娃的运动并对角色强制实施某些姿势时,这种关节特别有用。使用可配置关节还可以将关节修改为您自行设计的高度专业化关节。...然后将捕获的图像存储为具有反射材料的物体可以使用的立方体地图。在给定的场景中可以使用多个反射探头,并且可以将对象设置为使用最近探头产生的立方体图。其结果是,物体上的反射可以令人信服地根据其环境变化。...12.Scroll Rect 官方手册地址: Scroll Rect 当占用大量空间的内容需要在小区域中显示时,可使用滚动矩形。滚动矩形提供了滚动此内容的功能。...当 Aim Constraint 旋转游戏对象以朝向其源游戏对象时,约束也会将受约束游戏对象的向上轴与向上方向对齐。...例如,当一个角色在移动时,它的武器需要跟随它的手部位置,这时候就可以使用Parent Constraint将武器约束到手部位置。

    2.9K35

    Flutte部件目录-基本部件(一)

    一个容器首先用padding包围子组件(由decoration中出现的所有边框填满),然后将附加constraints应用于填充范围(将width和height作为约束合并(如果其中任一个非空)。...另外,部件有一个子部件,但没有高度,没有宽度,没有约束,也没有对齐,并且容器将约束从父项传递给子项,并将其自身尺寸设置为与子部件匹配。...示例代码 这个例子显示了一个48x48的绿色正方形(放置在一个Center部件中,以防父容器对Container应该采用的尺寸有自己的看法),并带有一个边距,以便它远离相邻的小部件: new Center...foregroundDecoration将九个斑点的图像叠加到文本上。最后,transform对整个装置施加轻微旋转以完成效果。...当一个列布局它的非柔性子部件(那些既没有 Expanded也没有Flexible包裹的子部件)时,它给了他们无限的约束,以便他们可以确定他们自己的尺寸(传递无界的约束通常指示子部件应该收缩包裹其内容)。

    7.5K20

    前端“油画设计师”——双缓存绘制与油画分层机制

    但是当我们当前展示的内容中在主题内容变化不大的情况下,会有一些小部分内容的变化,在页面刷新或者滚动的时候,一帧中会有很多复杂内容元素的图画运算,重新对页面元素绘制会导致CPU使用率飙升。...而如果使用离屏渲染(即我们所说的双缓存画布),我们可以预先把图片裁剪成想要的尺寸,然后将该内容保存起来,绘制的时候直接使用第一种写法直接将图片放入Canvas中。...使用这个方法结合双缓冲技术可以有效的将重复绘制的内容分流到屏幕外的画布上,然后再根据我们的需求将屏幕外图像渲染到主画布上,省去了频繁生成重复部分的步骤。...在需要渲染时,只需要讲缓存画布的内容克隆到主画布上,再附加上装饰图层元素 这样,当表格需要更新时候,比如单元格背景改变,只需要在克隆缓存画布后重绘对应单元格内容即可。...而当表格向下滚动时,表格滚动结束,需要重绘,主画布会被清空,然后从缓存画布中根据行为上下文进行画布偏移,将偏移后的图层直接绘制在主画布上,随后在主画布上绘制偏移后的剩余部分,最后更新缓存。

    1.3K20

    GroundiT:利用 Diffusion Transformers实现精确无训练空间定位,实现 SOTA 性能 !

    作者的方法基于DiT的一个有趣属性,作者称之为语义共享。由于语义共享,当一个较小的块与可生成大小的图像联合去噪时,这两个块将变得“语义克隆”。...GLIGEN [31] 是一个显著的例子,它将一个带有门控自注意力模块 [1] 的 U-Net 层集成到 Stable Diffusion [41] 中。...在这些方法的基础上,这些方法旨在将特定物体的跨注意力图与给定的空间约束(例如边界框)对齐,确保物体在其指定区域内放置。这种对齐通常通过使用反向扩散过程的正向传播从自定义损失函数更新噪声图像来实现。...因此,当这些模型用于创建局部图像块时,它们通常只能去噪固定大小的图像,并将区域裁剪以适应边界框。这种方法可能无法将所需目标包括在裁剪区域内。...作者首先介绍了DiT的一个有趣特性:当同时去噪一个较小的噪声块和一个生成器大小的噪声图像时,这两个图像逐渐变得语义相同。作者将这种现象称为共享采样。

    9710

    03.HTML头部CSS图像表格列表

    在本站的HTML教程中我们使用了内联CSS样式来介绍实例,这是为了简化的例子,也使得你能更容易在线编辑代码并在线运行实例。 内联样式 当特殊的样式需要应用到个别元素时,就可以使用内联样式。...内部样式表 当单个文件需要特别样式时,就可以使用内部样式表。你可以在 部分通过 标签定义内部样式表: 外部样式表 当样式需要被应用到很多页面的时候,外部样式表将是理想的选择。...HTML 图像- Alt属性 alt 属性用来为图像定义一串预备的可替换的文本。 替换文本属性的值是用户定义的。 在浏览器无法载入图像时,替换文本属性告诉读者她们失去的信息。...如果图像指定了高度宽度,页面加载时就会保留指定的尺寸。如果没有指定图片的大小,加载页面时有可能会破坏HTML页面的整体布局。...浮动图像 本例演示如何使图片浮动至段落的左边或右边。 设置图像链接 本例演示如何将图像作为一个链接使用。 创建图像映射 本例显示如何创建带有可供点击区域的图像地图。其中的每个区域都是一个超级链接。

    19.4K101

    web前端必备英语词汇都在这儿了,客官你了解多少?

    chain 当执行一种缓动效果后可以继续使用另一个缓动效果 createElement 创建新元素 createTextNode 创建文本节点 childNodes 返回子节点 cancelBubble...在改变时 onfocus 在获得焦点时 onblur 在失去焦点时 onscroll 窗口滚动事件 onresize 窗口大小监听事件 out 减速到0的缓动 onStart 开始事件 onComplete...视频 red 红色 resize 重新设置大小 relative 相对的 right 右边 repeat 重复,平铺 row 行 replacement替换 return 返回 random...尺寸 square 方块 solid 固体,实线 static 静态的 solution 方案 strong 强壮,加粗的 son 儿子 style...这个,当前 typeof 类型 U: underline 下划线 uppercase 大写 upper 上面的 url 网址 V: vertical 竖直的 visited

    3.1K20

    java SWT:基于Composite定制背景透明的浮动图像按钮(image button)

    Override public Point computeSize(int wHint, int hHint, boolean changed) { // 重写此方法,保证layout时按钮尺寸不超过设置的最大最小值...SWT.TRANSPARENT样式进行初始化,SWT.TRANSPARENT指定透明背景 如果不指定SWT.TRANSPARENT样式,当按钮在有图像的组件之上时这样的效果 ?...SWT对图像背景透明的设置有几种方式,本文中我选择了最简单的一种,就是指定图像中某种颜色(本例为白色)为透明色。...当然使用这种方式也有缺点就是除了透明色之外,相近的颜色(比如 255,255,254)就没办法透明,所以修图时要把图清干净保持背景色是纯色。...因为jpeg是有损压缩格式,会破坏纯色的背景色,所以这种透明方式对于jpeg格式的图像效果不好。 所以建议使用png,bmp等无损压缩格式来存储图像文件。

    2K20

    提高效率 |ArcGIS Pro 中所有快捷键一网打尽

    Ctrl+L 当布局为活动视图时,锁定或解锁在内容窗格中选择的项目。 Ctrl+Shift+L 当布局为活动视图时,请在内容窗格中锁定或解锁该级别上的所有项目。...Shift + 拖动 将形状创建为正方形。 将形状约束为正方形。创建矩形的第一个点,按键盘快捷键,然后拖动。 Shift 打开或关闭正方形。 打开时,将几何约束为正方形。...按住上箭头或下箭头键可沿照相机当前的视图方向前或向后移动照相机。当照相机移动时,调整鼠标指向以设置您要行驶的方向。可以选择使用 W 和 S 键更改方向。...全动态视频播放器 全动态视频键盘快捷键 键盘快捷键 操作 注释 Ctrl+Alt+A 将视频帧另存为目录中或工程地理数据库中的图像。 这与帧转图像视频播放器工具相同。...如果选择了多个行,会从活动单元格所在的行开始移动。这在按顺序逐条处理表记录、查看或编辑各条记录及在地图上查找其表示的要素时尤为有用。 Ctrl+U 或 Ctrl+单击左上方单元格 切换选择内容。

    1.3K20

    最新iOS设计规范七|10大视觉规范(Visual Design)

    例如:无论可用的屏幕空间多大,你都可以约束一个按钮,使其始终水平居中并定位在距离图像下方8pt的位置。 当检测到某些环境变化(称为特征)时,自动布局会根据指定的约束自动调整布局。...在上下文变化时改变焦点可能会令人迷茫和沮丧,并且可能让用户觉得他们失去了对APP的控制。 避免不必要的布局更改。当有人旋转设备时,整个布局无需更改。...不要重新定义动态系统颜色的语义含义。为了给人们带来一致的体验并确保您的界面在所有情况下看起来都很好,请按预期使用动态系统颜色。 不要尝试复制动态系统颜色。...基于各种环境变量,动态系统的颜色可能会随着版本的不同而波动。与其尝试创建与系统颜色匹配的自定义颜色,不如使用动态系统颜色。 色彩管理 将颜色配置文件应用于图像。...当你使用动态系统颜色为符号着色或对其应用活力效果时,符号在任何上下文中都看起来很棒。

    8.1K30

    一文了解动态场景中的SLAM的研究现状

    对象为BA和深度初始化提供了几何约束。除此之外它还增加了泛化功能,使orb slam可以在低纹理环境中工作。mono3D结果通过BA优化,并通过运动模型进行约束。...点-点匹配:关键点与对象轮廓(凸包由2D图像中的8个投影角对接)内的ORB特征点匹配,同时与静态背景匹配。 点-对象匹配:没有明确说明,但是当一个点在该对象的对象轮廓内时,应将其与该对象关联。...相机点误差:对于静态场景,clusterVO与ORB-SLAM相似,可以同时优化相机位姿和静态关键点的位置。当clusterVO选择滑动窗口状态估计方法时,它还会增加一个附加的边缘化项。...如果点在动态对象上,则其在动态对象中的相对位置将随时间而固定。 效果 ClusterVO是一种更通用的DOS方法。从KITTI动态场景的结果来看,用长方体近似得到的的结果质量不如ClusterVO。...恒定的对象大小和刚体运动作为附加约束可用于图优化。这将有助于在特征点较少的环境中计算相机姿态。

    4.2K20

    灵活运用CSS开发技巧

    在线演示 使用object-fit规定图像尺寸 要点:通过object-fit使图像脱离background-size的约束,使用来标记图像背景尺寸 场景:图片尺寸自适应 兼容:object-fit 代码...在线演示 使用:hover描绘鼠标跟随 要点:将整个页面等比划分成小的单元格,每个单元格监听:hover,通过:hover触发单元格的样式变化来描绘鼠标运动轨迹 场景:鼠标跟随轨迹、水波纹、怪圈 兼容:...在线演示 Figure Skill 使用div描绘各种图形 要点: 配合其伪元素(::before、::after)通过clip、transform等方式绘制各种图形 场景:各种图形容器 兼容:clip...在线演示 倒影加载条 要点:带有渐变倒影的加载条 场景:加载提示 兼容:box-reflect、animation 代码:在线演示 ?...在线演示 动态边框 要点:鼠标悬浮时动态渐变显示的边框 场景:悬浮按钮、边框动画 兼容:gradient 代码:在线演示 ?

    4.6K20

    YOLO v2

    当移动anchor box时,也将类预测机制从空间位置解除出来,而不是为每个锚盒预测类和对象。...YOLO对每张图片的预测只有98个盒子,但是使用anchor box以后模型预测超过了1000个(4)维度聚类当YOLO与anchor box一起使用时,遇到两个问题。首先,box的尺寸是手工挑选的。...这个公式是不受约束的,所以任何anchor box都可以停在图像中的任何一点,不管box预测的是什么。在随机初始化的情况下,该模型需要很长时间才能稳定地预测合理的偏移量。...但是,由于模型只使用卷积层和池化层,因此可以动态调整它的大小。本文的目的是YOLOv2能够在不同大小的图像上运行,因此将其训练到模型中。不是固定输入图像的大小,而是每隔几次迭代就改变网络。...它只使用带有类标签的图像来扩展它可以检测到的类别的数量。在训练过程中,把检测数据集和分类数据集混合起来。当网络看到用于检测的标记图像时,可以基于完整的YOLOv2损失函数进行反向传播。

    1.5K50
    领券