是否可以将 AutoLayout 与 UITableView 的 tableHeaderView 一起使用? [复制]

2023-11-25

自从我发现AutoLayout我到处都使用它,现在我尝试将它与tableHeaderView.

我制造了一个subclass of UIView添加了我想要的所有内容(标签等...)及其约束,然后我添加了这个CustomView to the UITableView'tableHeaderView.

一切都很好,除了UITableView总是显示above the CustomView, by above我的意思是CustomView is under the UITableView所以看不到!

似乎无论我做什么,height of the UITableView'tableHeaderView is always0(宽度、x 和 y 也是如此)。

我的问题:是否有可能做到这一点无需手动设置框架 ?

EDIT : The CustomView'subview我正在使用的有这些限制:

_title = [[UILabel alloc]init];
_title.text = @"Title";
[self addSubview:_title];
[_title keep:[KeepTopInset rules:@[[KeepEqual must:5]]]]; // title has to stay at least 5 away from the supperview Top
[_title keep:[KeepRightInset rules:@[[KeepMin must:5]]]];
[_title keep:[KeepLeftInset rules:@[[KeepMin must:5]]]];
[_title keep:[KeepBottomInset rules:@[[KeepMin must:5]]]];

我正在使用一个方便的库“KeepLayout”,因为手动编写约束要花很长时间,并且对于一个约束来说需要太多行,但这些方法是不言自明的。

And the UITableView有这些限制:

_tableView = [[UITableView alloc]init];
_tableView.translatesAutoresizingMaskIntoConstraints = NO;
_tableView.delegate = self;
_tableView.dataSource = self;
_tableView.backgroundColor = [UIColor clearColor];
[self.view addSubview:_tableView];
[_tableView keep:[KeepTopInset rules:@[[KeepEqual must:0]]]];// These 4 constraints make the UITableView stays 0 away from the superview top left right and bottom.
[_tableView keep:[KeepLeftInset rules:@[[KeepEqual must:0]]]];
[_tableView keep:[KeepRightInset rules:@[[KeepEqual must:0]]]];
[_tableView keep:[KeepBottomInset rules:@[[KeepEqual must:0]]]];

_detailsView = [[CustomView alloc]init];
_tableView.tableHeaderView = _detailsView;

我不知道是否必须直接在上面设置一些约束CustomView,我认为CustomView的高度是由约束决定的UILabel其中的“标题”。

EDIT 2:经过另一次调查后,似乎 CustomView 的高度和宽度计算正确,但 CustomView 的顶部仍然与 UITableView 的顶部处于同一水平,并且当我滚动时它们一起移动。


我问并回答了类似的问题here。总之,我添加了一次标题并用它来找到所需的高度。然后可以将该高度应用于标题,并再次设置标题以反映更改。

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.header = [[SCAMessageView alloc] init];
    self.header.titleLabel.text = @"Warning";
    self.header.subtitleLabel.text = @"This is a message with enough text to span multiple lines. This text is set at runtime and might be short or long.";

    //set the tableHeaderView so that the required height can be determined
    self.tableView.tableHeaderView = self.header;
    [self.header setNeedsLayout];
    [self.header layoutIfNeeded];
    CGFloat height = [self.header systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height;

    //update the header's frame and set it again
    CGRect headerFrame = self.header.frame;
    headerFrame.size.height = height;
    self.header.frame = headerFrame;
    self.tableView.tableHeaderView = self.header;
}

如果您有多行标签,这也依赖于自定义视图设置每个标签的preferredMaxLayoutWidth:

- (void)layoutSubviews
{
    [super layoutSubviews];

    self.titleLabel.preferredMaxLayoutWidth = CGRectGetWidth(self.titleLabel.frame);
    self.subtitleLabel.preferredMaxLayoutWidth = CGRectGetWidth(self.subtitleLabel.frame);
}

或者更一般地说:

override func layoutSubviews() {
    super.layoutSubviews()  
    for view in subviews {
        guard let label = view as? UILabel where label.numberOfLines == 0 else { continue }
        label.preferredMaxLayoutWidth = CGRectGetWidth(label.frame)
    }
}

2015 年 1 月更新

不幸的是,这似乎仍然是必要的。这是布局过程的快速版本:

tableView.tableHeaderView = header
header.setNeedsLayout()
header.layoutIfNeeded()
header.frame.size = header.systemLayoutSizeFittingSize(UILayoutFittingCompressedSize)
tableView.tableHeaderView = header

我发现将其移至 UITableView 的扩展中很有用:

extension UITableView {
    //set the tableHeaderView so that the required height can be determined, update the header's frame and set it again
    func setAndLayoutTableHeaderView(header: UIView) {
        self.tableHeaderView = header
        self.tableHeaderView?.translatesAutoresizingMaskIntoConstraints = false
        NSLayoutConstraint.activate([
            header.widthAnchor.constraint(equalTo: self.widthAnchor)
        ])
        header.setNeedsLayout()
        header.layoutIfNeeded()
        header.frame.size =  header.systemLayoutSizeFitting(UIView.layoutFittingCompressedSize)
        self.tableHeaderView = header
    }
}

Usage:

let header = SCAMessageView()
header.titleLabel.text = "Warning"
header.subtitleLabel.text = "Warning message here."
tableView.setAndLayoutTableHeaderView(header)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

是否可以将 AutoLayout 与 UITableView 的 tableHeaderView 一起使用? [复制] 的相关文章

  • 如何在 NSDate 变量中仅设置时间?

    我有 NSDate 变量 只想更改时间 不应更改日期 是否可以 例如 用户在 DatePicker 日期中选择日期间隔 如果是开始日期 我想将时间设置为 00 00 00 如果是结束日期 我将时间设置为 23 59 59 感谢你的帮助 问候
  • 以编程方式向 UIButton 标签添加阴影

    我试图向按钮标签添加 1px 黑色阴影 但没有成功 我试过这个 self setTitleShadowOffset CGSizeMake 0 1 但我得到 请求非结构或联合中的成员 setTitleShadowOffset 任何建议都会很棒
  • 有没有办法阻止 iOS 上的 Safari 在关闭时清除网站的 cookie?

    我的移动网络应用程序的一位用户抱怨说 每次他关闭手机屏幕后使用该应用程序时 他都必须重新登录该应用程序 发生的情况是 当屏幕关闭时 或者当您通过双击主页按钮并滑开 Safari 来完全关闭 Safari 时 Safari 会清除该网站的 C
  • 为什么没有收到(UDP 多播)数据包?

    所以 我一直试图弄清楚为什么这不起作用 但我没有任何线索 我已经成功地从 iPhone 发送数据包并在 Mac 上接收它们 根据 tcpdump 我的 mac 正确发送数据包 此外 如果我在模拟器中运行它 它工作得很好 这让我相信这是一个网
  • 如何从日期中获取小时、分钟和上午/下午? [复制]

    这个问题在这里已经有答案了 我尝试从日期中提取小时 分钟和上午 下午 但我得到 NULL 输出 我在下面显示了我的代码 请查看 NSString dateStr 29 07 2013 02 00am NSDateFormatter form
  • 无法添加钥匙串项目。使用 KeychainItemWrapper 更改标识符后出现错误 - 25299?

    我想用 KeychainItemWrapper 将 UUID 保存在钥匙串中 所以我在中添加以下方法MyKeychainManager m define keychain idenentify com myapp bundle1 void
  • 使用 UIKeyCommand 检测删除键

    任何人都知道如何使用检测 删除 键UIKeyCommand在 iOS 7 上 当人们在使用 Swift 时遇到问题时 我认为用 Objective C 和 Swift 编写一个小型的 完整的例子可能是一个很好的答案 请注意 Swift 没有
  • AFNetworking 上传图片

    我看过一些例子 但我认为我的问题可能出在 PHP 中 我正在尝试使用 AFNetworking 将图像从 iPhone 上传到服务器 这是我的 obj c 代码 IBAction uploadButtonClicked id sender
  • 奇怪的行为与缓存。清单/离线使用网络应用程序保存到ipad ios6的主屏幕

    我刚刚在装有新 iOS 6 的 iPad 上发现了一些奇怪的行为 我正在测试一个用于离线使用的网络应用程序 Web 应用程序只不过是一个带有缓存清单的静态网站 因此没有使用像 sencha touch 这样的特殊框架或像 phnoegap
  • 如何修复 ReactiveCocoa(带有 CocoaPods)的安装?

    这里是新手 尝试将 ReactiveCocoa 2 2 4 和 CocoaPods 安装到项目中 但在运行时遇到错误 我用过github 上的这个 podspec https github com CocoaPods Specs blob
  • iOS NSURLSession,如何在didCompleteWithError中重试

    我想在我的服务器上尝试一次调用 直到成功为止 我想每 30 秒尝试一次 所以我使用 NSURLSession 进行通话 NSURLSessionDownloadTask task self session downloadTaskWithR
  • 使用prepareForSegue传递数据

    我试图将数据从viewController 1传递到viewController2 我有2个按钮和1个segue 因此有一个segue标识符 这2个按钮 按下时每个按钮应显示 1个标签用于显示标题 1个textView用于显示定义 我很难显
  • 如何更改 UINavigationController 后退按钮名称?

    我有一个UIViewController我正在从第一个视图控制器导航到第二个视图控制器 我想更改显示在navigationcontroller为了回去 SecondViewController secondController Second
  • cocos2d框架可以在iPad上运行吗?

    Cocos2d iPhone 框架可以在 iPad 上运行吗 我的猜测是肯定的 但想检查一下在将带有 cocos2d 的 iPhone 项目移植到 iPad 或开始一个新项目后是否有人有明确的答案 Cocos2d v0 99 0 rc今天发
  • 将捕获的图像精确裁剪为 AVCaptureVideoPreviewLayer 中的外观

    我有一个使用 AV Foundation 的照片应用程序 我使用 AVCaptureVideoPreviewLayer 设置了一个预览层 它占据了屏幕的上半部分 因此 当用户尝试拍照时 他们只能看到屏幕上半部分看到的内容 这很好用 但是当用
  • iTunes connect 中不同应用程序的多个银行帐户[关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 由于我们正在为客户开发 iPhone 应用程序 并且他希望对该应用程序收费 因此我们想知道是否可以在 iTunes 中连接多个银行帐户 以便将收入直接
  • Xcode 在代码签名身份中看不到我的开发人员证书

    我续订了 IOS 开发人员证书 从钥匙串中删除了旧证书 然后单击了我的证书 钥匙串中的一切看起来都很正常 我有分发 开发人员 WWDC 证书 每个配置文件看起来都有效 并带有绿色标记 在组织器中的团队和配置文件部分下 但在代码签名身份下的
  • Google Cloud Messaging 显示成功消息但未发送 iOS

    所以我在使用 Google Cloud Messaging 时遇到了一个非常奇怪的问题 我遇到的问题是它正在成功注册设备 并且当发送消息时我会收到来自 Google 的成功消息 但设备永远不会收到任何消息 我从 GCM 得到的消息是 res
  • 进入后台时 Alamofire 请求卡住?

    我正在使用 Alamofire 调用 Web 服务 该服务需要相当长的时间才能加载 如果应用程序进入后台 当我返回应用程序时 我会被加载程序卡住 我想这是因为调用永远不会向我的完成处理程序返回任何内容 我该如何解决这个问题 您可以使用后台抓
  • iOS 13 检查 CLLocationManager 的临时授权状态

    根据 WWDC 视频 https developer apple com videos play wwdc2019 705 https developer apple com videos play wwdc2019 705 当你要求 Al

随机推荐

  • 反向代理背后的 Springfox Swagger UI

    我已经使用 Swagger API 文档配置了 Spring Boot 应用程序并配置了 Swagger UI 我还在反向代理后面运行后端应用程序 该代理映射来自的所有请求host port api to backend host port
  • 如何在 ASP.NET 中运行后台任务 [关闭]

    Closed 这个问题是基于意见的 目前不接受答案 我需要运行一些任务Asp net MVC 每 5 分钟后 我从来没有研究过这样的功能 所以我用谷歌搜索并找到了一些实现此功能的选项 这些是选项here here and here 我已经查
  • Monotouch 中的子类化和重写 UITextField

    我正在尝试将 UITextField 的占位符文本设置为不同的颜色 我了解到我需要子类化并重写 drawPlaceholderInRect 方法 iPhone UITextField 更改占位符文本颜色 void drawPlacehold
  • Google Chrome 扩展程序中的同步调用

    我正在开发 Google Chrome 扩展程序 它必须阻止 重定向一些传出请求 为此 我使用chrome webRequest onBeforeRequest听众 为了决定是否阻止请求 我需要一些有关选项卡请求发送来源的信息 我可以使用它
  • Entity Framework 6 在一个事务中批量更新/删除

    在 EF6 中 我想在一个查询中更新 删除批量数据 我的代码是 using var context dataContextFactory GetContext var result1 from b in context MyTables w
  • Jetty Websocket 空闲超时

    我最近一直在研究带注释的 websocket Jetty API 9 4 5 release 并与它进行了聊天 但是我遇到了一个问题 5 分钟后 我相信这是默认计时器 会话关闭 这不是由于错误 我发现的唯一解决方案是在关闭事件时通知我的套接
  • 当我检查 nginx access.log 时,定期出现未知的 HEAD 请求

    首先我使用的服务器环境 服务器 nginx uwsgi django 应用程序 docker AWS ECS 部署 芹菜 rabbitmq ec2 缓存 redis ec2 日志记录 AWS CloudWatch 日志 瞭望塔第三方应用程序
  • 从 SwiftUI 中的 UIKit 更新 UIViewRepresentable 大小

    我正在嵌入一个高度可变的视图控制器UITextView在父 SwiftUI VStack 中 视图控制器将其框架调整为整个屏幕viewDidLoad and viewDidLayoutSubviews The UITextView仅扩展到其
  • PyCharm 中的 Python3 语法

    我想在 PyCharm 2016 2 中使用 python3 语法 并将解释器配置为使用 python3 5 当我执行代码时 代码运行良好 但 PyCharm 抱怨 python2 不支持 python3 语法 如何让 PyC harm 相
  • 预加载图像后触发事件

    这是我用来预加载图像的代码 我不确定它是否是最好的 我的问题是 如何触发和事件 例如alert 完成加载所有图像后的对话框 var preload a gif b gif c gif var images for i 0 i lt prel
  • 使用具有多列的 data.table 将宽形状重塑为长形状

    我有一个宽格式的数据框 如下所示 我想使用 data table Melt 函数将宽形状重塑为长形状 在简单的情况下 我可以拆分两个数据 然后绑定两个数据集 但就我而言 有多个 test i testgr i 列 但必须有更好 更有效的方法
  • 动态添加表单到 Django 表单集

    我想动态地将新表单添加到 Django 表单集 以便当用户单击 添加 按钮时 它会运行 JavaScript 将新表单 是表单集的一部分 添加到页面 这就是我的做法 使用jQuery 我的模板 h3 My Services h3 servi
  • 如何调查“尝试释放未引用的标量”

    Perl 脚本 使用大量本地编写的模块 并且正在积极开发中 刚刚开始生成零星的 尝试释放未引用的标量 SV 0xa6e685c Perl 解释器 全球毁灭期间的 0x96d9008 消息 这总是可重复的 从某种意义上说 特定的命令序列总是会
  • CVXPY 中的初始猜测/热启动:给出解决方案的提示

    在这段代码中 import cvxpy as cvx Examples linear programming Create two scalar optimization variables x cvx Variable y cvx Var
  • VBA Excel 错误处理 - 特别是在函数中 - 专业 Excel 开发风格

    我拿到了 Rob Bovey 写的 Professional Excel Development 一书 它让我大开眼界 我正在通过错误处理重新调整我的代码 然而 还有很多我不明白的地方 我特别需要知道如何在函数中正确使用它 我使用 Bove
  • 将 hashtable.Keys 转换为 List 或其他 IEnumerable

    我知道 我还有其他选择 例如我可以维护一个单独的密钥列表 请不要建议其他选择 我只是想知道我能否成功 请不要问我要解决什么问题或类似的问题 这是一道纯粹 简单的CS题 我想知道是否有人知道如何从Hashtable并将它们扔进List
  • 在 R 中按名称模式选择列表元素

    我有一个像这样的清单 places lt list cities 1 c Madrid Valencia Barcelona countries 1 c Espa a Portugal Francia cities 2 c Alicante
  • 使用 C++ 和 Cocoa 代替 Objective-C?

    我想编写使用 C 和 Cocoa 框架的应用程序 因为 Apple 不支持 Carbon 64 位 C 在 Linux 和 Windows 上的实现似乎相当普通 但在 Mac OS X 上似乎需要额外的 Apple 特定代码片段 如 Obj
  • 理解三维数组

    我正在尝试了解三维数组 我知道它们是二维数组的数组 但是我正在读的书说了一些让我困惑的事情 在我正在阅读的书的练习中 它要求我为全彩图像创建一个三维数组 它给出了一个小例子 如果我们决定选择三维数组 则数组的声明方式如下 int color
  • 是否可以将 AutoLayout 与 UITableView 的 tableHeaderView 一起使用? [复制]

    这个问题在这里已经有答案了 自从我发现AutoLayout我到处都使用它 现在我尝试将它与tableHeaderView 我制造了一个subclass of UIView添加了我想要的所有内容 标签等 及其约束 然后我添加了这个Custom