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

UITableViewCell中的简单UIStackView无法正确计算IB中的高度

是因为在Interface Builder(IB)中,UIStackView的高度是根据其内部的子视图来计算的。而在UITableViewCell中,由于在Interface Builder中无法预先知道动态加载的数据,所以无法正确计算UIStackView的高度。

解决这个问题的方法是使用自动布局和动态计算高度的技术。以下是一种可能的解决方案:

  1. 在UITableViewCell的子类中,使用自动布局来设置UIStackView和其内部的子视图的约束。确保UIStackView的上下左右边距与UITableViewCell的上下左右边距相等,并设置合适的约束来保证UIStackView内部子视图的布局。
  2. 在UITableViewCell的子类中,重写layoutSubviews方法。在这个方法中,调用super.layoutSubviews()来确保父类的布局被正确执行。然后,根据UIStackView内部子视图的约束和内容来计算UIStackView的高度。
  3. 在UITableViewDelegate的tableView(_:heightForRowAt:)方法中,返回计算得到的UIStackView的高度。可以使用自动布局的systemLayoutSizeFitting(_:withHorizontalFittingPriority:verticalFittingPriority:)方法来计算UIStackView的高度。

以下是一个示例代码:

代码语言:swift
复制
class CustomTableViewCell: UITableViewCell {
    @IBOutlet weak var stackView: UIStackView!
    
    override func layoutSubviews() {
        super.layoutSubviews()
        
        // 计算UIStackView的高度
        let stackViewHeight = stackView.systemLayoutSizeFitting(
            CGSize(width: bounds.width, height: CGFloat.greatestFiniteMagnitude),
            withHorizontalFittingPriority: .required,
            verticalFittingPriority: .fittingSizeLevel
        ).height
        
        // 更新UIStackView的高度约束
        stackView.heightAnchor.constraint(equalToConstant: stackViewHeight).isActive = true
    }
}

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
    // ...
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "CustomTableViewCell", for: indexPath) as! CustomTableViewCell
        
        // 配置UIStackView的子视图
        
        return cell
    }
    
    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        let cell = tableView.dequeueReusableCell(withIdentifier: "CustomTableViewCell") as! CustomTableViewCell
        
        // 配置UIStackView的子视图
        
        cell.setNeedsLayout()
        cell.layoutIfNeeded()
        
        // 计算UIStackView的高度
        let stackViewHeight = cell.stackView.systemLayoutSizeFitting(
            CGSize(width: tableView.bounds.width, height: CGFloat.greatestFiniteMagnitude),
            withHorizontalFittingPriority: .required,
            verticalFittingPriority: .fittingSizeLevel
        ).height
        
        return stackViewHeight
    }
    
    // ...
}

这样,UITableViewCell中的简单UIStackView就可以正确计算IB中的高度了。

注意:以上示例代码仅为参考,具体实现可能需要根据实际情况进行调整。

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

相关·内容

javascript各种计算位置高度方法

网页正文部分左: window.screenLeft; 屏幕分辨率高: window.screen.height; 屏幕分辨率宽: window.screen.width; 屏幕可用工作区高度...: window.screen.availHeight; 屏幕可用工作区宽度:window.screen.availWidth; scrollHeight: 获取对象滚动高度。...scrollLeft:设置或获取位于对象左边界和窗口中目前可见内容最左端之间距离 scrollTop:设置或获取位于对象最顶端和窗口中可见内容最顶端之间距离 scrollWidth:获取对象滚动宽度...offsetHeight:获取对象相对于版面或由父坐标 offsetParent 属性指定父坐标的高度 offsetLeft:获取对象相对于版面或由 offsetParent 属性指定父坐标的计算左侧位置...offsetTop:获取对象相对于版面或由 offsetTop 属性指定父坐标的计算顶端位置 event.clientX 相对文档水平座标 event.clientY 相对文档垂直座标

1.6K20
  • DateTime在ExtJs无法正确序列化问题

    这几天在学习ExtJs + Wcf过程,发现一个问题,如果Class中有成员类型为DateTime,即使我们正常标识了[DataMember],序列化成JSON时,会生成一种特有的格式: .....这种格式ExtJs并不识别,导致最终组件,比如Grid上无法正常显示,解决办法有二个: 1.将Class成员,手动改成String类型,不过个人不推荐这种方式,毕竟将数据类型都改了,相应服务端很多地方都可能会做相关修改...2.用JS在前台调用时,用代码处理返回JSON字符串格式,使之符合ExtJs规范(这个方法是从博客园"小庄"那里学来,呵) Ext.onReady(function() { //这个函数演示了怎样把服务器端...DateTime类型转为Javascript日期         function setAddTime(value, p, record) {             var jsondate...设置GridColumns时,类似如下处理: var grid = new Ext.grid.GridPanel({             store: store,

    2.7K100

    如何简单理解总线,计算BUS

    计算机是数字城市各种设备协同工作,通过对不同部件协同,形成一个整体发挥作用。 在城市需要道路,需要交通。那么在计算同样需要在各部件之间传输信息pathway,被翻译为「通路」。 ?...在早期计算机部件,如CPU和Rams不包含在单个IC板,它们大多在单独机柜中分开。...从电线束角度来理解 bus bar,再到总线就更容易理解总线概念了。 计算机总线有两种主要设计,就是我们常见串行和并行分类。...这个可以理解为城市道路单车道和多车道,从单车道和多车道角度来解剖总线串行和并行设计,抽象概念就更贴近生活了。...总线对计算机很重要,就像道路对城市一样重要,它们存在创造了一个统一环境,可以作为一个单元运行,随着系统不断发展,总线架构将继续发展 总线是用于CPU和内存以及其他设备之间通信,总线可以分为3种

    1.4K20

    Apache Flink 如何正确处理实时计算场景乱序数据

    )数据在 Flink 系统里被操作时机器系统时间,叫做 Processing Time 处理时间是一种比较简单时间概念,不需要流和系统之间进行协调,可以提供最佳性能和最低延迟。...但是在分布式环境,多台机器处理时间无法做到严格一致,无法提供确定性保障。...,数据会源源不断发送到我们系统。...流式计算最终目的是去统计数据产生汇总结果,而在无界数据集上,如果做一个全局窗口统计,是不现实。 只有去划定一定大小窗口范围去做计算,才能最终汇总到下游系统,用来分析和展示。...(窗口 11:00 ~ 11:10 数据全部被接收完) 有序事件 假设在完美的条件下,数据都是严格有序,那么此时,流式计算引擎是可以正确计算出每个窗口数据 611106-20201206105643182

    97340

    Apache Flink 如何正确处理实时计算场景乱序数据

    )数据在 Flink 系统里被操作时机器系统时间,叫做 Processing Time 处理时间是一种比较简单时间概念,不需要流和系统之间进行协调,可以提供最佳性能和最低延迟。...但是在分布式环境,多台机器处理时间无法做到严格一致,无法提供确定性保障。...三、Flink 为什么需要窗口计算 我们知道流式数据集是没有边界,数据会源源不断发送到我们系统。...流式计算最终目的是去统计数据产生汇总结果,而在无界数据集上,如果做一个全局窗口统计,是不现实。 只有去划定一定大小窗口范围去做计算,才能最终汇总到下游系统,用来分析和展示。 ?...(窗口 11:00 ~ 11:10 数据全部被接收完) 有序事件 假设在完美的条件下,数据都是严格有序,那么此时,流式计算引擎是可以正确计算出每个窗口数据 ?

    1.3K10

    【亲测有效】无法定位链接器!请检查 toolslink.ini 配置是否正确解决方案

    在进行易语言静态编译时候,出现了如下错误: 正在进行名称连接... 正在统计需要编译子程序 正在编译......正在生成主程序入口代码 程序代码编译成功 等待用户输入欲编译到文件名 正在进行名称连接... 开始静态链接... 无法定位链接器!请检查 tools\link.ini 配置是否正确。...静态连接失败 错误分析: 易语言5.X版本以上编译为静态编译,静态编译需要借助VC编译器,如果编译器配置不正确或者没安装将会出现以上信息。...解决方案: 打开易语言工作目录(如果你不知道的话,那就找到易语言快捷方式图标,然后右键-->属性-->查找文件或打开文件位置) 找到一个名为“VC98linker”文件夹(如果你易语言目录里面没有就百度下载...2.将下载链接器解压缩后文件夹“VC98linker”放到易语言安装目录 ? 易语言静态编译连接器 3.链接器配置 在文件夹“VC98linker”中找到“link.e”文件,打开此易程序。

    6.3K20

    numpy.bincount介绍以及巧妙计算分类结果每一类预测正确个数

    参考链接: Pythonnumpy.bincount 之前接触到bincount这个函数,简单以为它就是计算分类结果每一类数量,如下:  import numpy as np a = np.array...,用0补齐     #print(hist)     return hist #通过下面这个循环,可以计算出我们分类情况 for lp,lt in zip(prediction,truth):    ...通过对比分类结果,可以看出,第一个和第二个预测和事实都相等,计算出来数值位于对角线,而当预测和事实不符时,数值落在别处。...从_fast_hist函数可以看到,利用num_classes,通过巧妙计算,可以使预测正确结果落在对角线。 ...如果直接取对角线,  iu = np.diag(hist)  就能得到每一类分类正确个数。

    1.5K10

    UITableView 组件化

    ,LayoutManager 负责排版和提供预计算高度能力,CellHeightCache 提供高度缓存,Interactor 提供事件路由和处理等等,这样可以一定程度减轻代码膨胀问题。...UITableViewCell: - (Class)cellClass 当前组件对应 UITableViewCell 高度是多少: - (CGFloat)height 如何通过当前组件配置 UITableViewCell...自动 cell 高度缓存 通过 ListDiff 算法实现 section 局部刷新 当开启高度缓存选项时,M80TableViewComponent 计算 cell 高度后会自动记录 diffableHash...后续再次刷新将自动获取对应高度而无需再次计算。当一个 cell 有多重状态,需要在不同状态下展示不同高度时,则可以通过业务状态返回不同 diffableHash 进行高度切换。...除了高度缓存外,M80TableViewComponent 也提供了一种预计算高度机制,在组装完 cell component 后,只需要简单调用基类方法 measure 就可以直接完成预计算

    1.5K30

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

    在 AppDelegate.m ,它实际上什么也没做,所有的方法都是空。甚至application:didFinishLaunchingWithOptions:也只是简单地返回 Yes。...由于无法从nib中加载应用程序委托,也无法从故事板文件中加载应用程序委托,我们必须告诉UIApplicationMain 应用程序委托类名称,否则它根本无法找到应用程序委托类。...如果是使用IB ,在 MainWindow.xib中会有应用程序委托一个引用,同时你可以将顶层ViewController 连接到应用程序委托IBOutlet 属性。但现在使用故事板就不可能了。...默认 label 将消失。         首先增加 cell 高度为55 像素。拖拽它下端拉柄可以改变它高度,也可以修改Size 面板Row height 值。             ...前者更为简单,因此我使用了前者。 注意:如果你事先无法确定 cell 高度,或者你有不同高度几种 cell,你应该使用heightForRowAtIndexPath。

    1.1K30

    iOS9新特性——堆叠视图UIStackView

    watchOS开发,你会发现,其实StackView与watchOSgroup十分能相似。...三、从代码学习UIStackView         通过代码创建一个UIStackView也非常简单,首先,我们先通过代码实现上面的效果:  NSMutableArray * array = [[NSMutableArray...,使用前者是将试图添加进StackView布局管理,后者只是简单加在试图层级上,并不接受StackView布局管理。...我们设置了对其方式为充满,这样的话,我们就不需要再做过多控件尺寸约束,如果我们被管理控件高度或者宽度不一,我们可以设置中心对其,这样的话,我们还需要为每个控件添加一个宽度或者高度约束,如下:     ...StackView嵌套一个竖直布局StackView: ?

    1.9K10

    iOS开发中行高灵活可变UITableView性能优化

    我个人更倾向将行高数据封装进cell数据模型Model。         通过优化,可以有效减少重复高度计算,这也是我原先处理此类问题主要方式。...在开发通常会遇到一些十分复杂界面,而这些界面cell高度都是需要通过请求到数据动态改变,每个cell都要写复杂尺寸计算代码十分令人心烦。...这个值设置之后,开发者无需设置rowHeight属性,也不需要实现heightForRowAtIndexPath方法,系统会自动根据UITableViewCellcontentView约束来计算自己行高...那么现在问题来了,如何才能让cell正确计算自己高度,这就要使用到Autolayout了,无论是通过xib文件创建cell还是代码创建cell,若想让cell自动正确计算出自身高度,必须添加足够压力约束...通过上面示例可以看到,十分简单代码完美的解决了图文混排cell高度自适应。Autolayout真的是一种十分强大技术?。

    2K20

    抛弃UITableView,让所有列表页不再难构建

    reload这一行,在heightForRow代理方法判断isExpand,返回小明已在FeedCellModel已经计算两个高度(初始高度和全部高度)。...: Any) { ///在这里请求点赞,然后重新给favorLable赋值 } 然后又到FeedCellModel里面在原有计算高度地方加一下点赞控件高度。...,改动地方还能接受(可是笔者已经无法接受了,所以此处没有示例代码),于是乎,又愉快完成第三版。...小明想了一下,有这几个思路,可以在FeedCell里再嵌套个tableview,预先计算高度,在commentCell删除按钮点击事件里重新计算高度然后删除cell;或者封装一下commentView...,还是预先计算高度,根据数据加对应数量commentView,删除一个再重新计算一下高度

    1.6K30

    TableView优化之高度缓存

    首先,给UITableView添加category是因为为了实现高度缓存,我方案是在计算高度时候就模拟数据填充,从而计算出该cell高度,所以,tableView应该有填充数据和计算高度方法。...所以说简单了,绑定目标,就是给谁绑定,当然是UITableViewCell这个category了,所以self。....h添加一个属性,是我们刚才用来存储高度那个类一个实例。...因为我们无法保证或者指定只使用一种cell,很多情况下我们是自定义cell。...然后从字典取出我们cell,如果取出cell为空,则从重用池中取出一个cell。并存入字典。 首先字典和cell判空,都是针对第一次计算cell高度时候来。再次进入时候都不会为空。

    2.4K30

    iOS 面试策略之系统框架-UIScrollView及其子类

    [1240] 当一个屏幕无法展示 App 需要展示所有内容时,就是 UIScrollView 大展拳脚时候:通过使用 UIScrollView,用户可以滑动或是缩放屏幕,来看单个屏幕无法展示内容。...以上就是一种最简单预加载方法。它缺点十分明显,就是当列表很长时,会出现新加载页面还没看,应用就会发出另一次请求情况。...由于我们在 prepare() 已经完成相应计算,此时只需返回对应 indexPath 特定属性即可。...为了避免循环引用,最好方法就是在我们 UICollectionViewLayout 子类定义一个 protocol,然后让 ViewController 实现这个protocol,来完成高度获得...以上只是一种比较直接实现,最复杂部分在于 prepare() 运用 xOffset 和 yOffset 构建 LayoutAttributes 过程,其中含有大量数学计算

    2.6K21

    深入剖析Auto Layout,分析iOS各版本新增特性

    约束 Auto Layout你视图层级里所有视图通过放置在它们里面的约束来动态计算它们大小和位置。...布局约束规则 表达布局约束规则可以使用一些简单数学术语,如下表 类型 描述 值 属性 视图位置 NSLayoutAttributeLeft, NSLayoutAttributeRight, NSLayoutAttributeTop...,比如UILabel,UIButton,选择控件,进度条和分段等等,可以自己计算自己大小,比如label设置text和font后大小是可以计算得到。...会在viewDidLayoutSubviews或-layoutSubview调用super转换成具有正确显示frame值。...iOS7 NavigationBar,TabBar和ToolBartranslucent属性默认为YES,当前ViewController高度是整个屏幕高度,为了确保不被这些Bar覆盖可以在布局中使用

    1.3K10

    MyLayout&TangramKit 重大升级!

    比如一些界面中有父视图尺寸由子视图尺寸来确定;还比如UIScrollView为了能实现滚动需要根据添加到里面的子视图来调整contentSize尺寸;又比如某些UITableViewCell高度是动态...但是基于约束设置布局体系来说,因为很多约束都是通过依赖来实现,因此要计算contentSize并不是那么容易和简单。...3.UITableViewCell高度自适应 UITableViewCell要实现高度自适应,需要在UITableViewDelegate方法: -(CGFloat)tableView:(UITableView...MyLayout&TangramKit尺寸自适应 MyLayout&TangramKit一个重要能力是支持布局视图尺寸自适应自动计算,也就是说布局视图宽度或者高度可以根据子视图尺寸来自行确定...UITableViewCell高度自适应 UITableViewCell要实现高度自适应,需要在UITableViewDelegate方法: -(CGFloat)tableView:(UITableView

    2.1K20

    Windows无法安装到这个磁盘。请确保在计算BIOS菜单启用了磁盘控制器

    今天一朋友问我这个问题,呃,以前我也遇到过,但忘记记录了,这次就记录一下吧,就懒得打字了,图片里面很清楚了 不说点什么的话是不是太水了O(∩_∩)O~,好吧扩充一下: Windows无法安装到这个磁盘:...1.在安装Win8.1系统时,磁盘分区界面无法继续进行,出现“Windows 无法安装到这个磁盘。...选中磁盘具有MBR分区表。...在EFI系统上,Windows 只能安装到 GPT 磁盘“ 解决方法:磁盘格式转换:具体参考文章:http://tieba.baidu.com/p/3289445974 2.出现提示:Windows 无法安装到这个磁盘...Windows 需要设备 XXX 驱动程序 解决方法:单击“加载驱动程序”,然后加载所需设备驱动程序 这样可否~经验而已,仅供参考 收工~吃饭~

    10.1K70
    领券