以编程方式添加 CenterX/CenterY 约束

2024-03-14

我有一个 UITableViewController,如果没有任何内容可显示,则不会显示任何部分。我添加了一个标签来向用户表明此代码没有任何内容可显示:

label = UILabel(frame: CGRectMake(20, 20, 250, 100))
label.text = "Nothing to show"
self.tableView.addSubview(label)

但现在,我希望它水平和垂直居中。通常,我会选择屏幕截图中突出显示的两个选项(加上高度和宽度):

我已尝试使用以下代码来添加约束,但应用程序因错误而崩溃:

label = UILabel(frame: CGRectMake(20, 20, 250, 100))
label.text = "Nothing to show"

let xConstraint = NSLayoutConstraint(item: label, attribute: .CenterX, relatedBy: .Equal, toItem: self.tableView, attribute: .CenterX, multiplier: 1, constant: 0)
let yConstraint = NSLayoutConstraint(item: label, attribute: .CenterY, relatedBy: .Equal, toItem: self.tableView, attribute: .CenterY, multiplier: 1, constant: 0)

label.addConstraint(xConstraint)
label.addConstraint(yConstraint)

error:

When added to a view, the constraint's items must be descendants of that view (or the view itself). This will crash if the constraint needs to be resolved before the view hierarchy is assembled. Break on -[UIView _viewHierarchyUnpreparedForConstraint:] to debug.
2014-12-23 08:17:36.755 [982:227877] *** Assertion failure in -[UILabel _layoutEngine_didAddLayoutConstraint:roundingAdjustment:mutuallyExclusiveConstraints:], /SourceCache/UIKit/UIKit-3318.16.21/NSLayoutConstraint_UIKitAdditions.m:560

标签应始终水平和垂直居中,因为应用程序支持设备旋转。

我究竟做错了什么?如何成功添加这些约束?

Thanks!


Swift 3/Swift 4 更新:

从 iOS 8 开始,您可以并且应该通过设置约束来激活约束isActive财产给true。这使得约束能够将自身添加到正确的视图中。您可以通过将包含约束的数组传递给来一次激活多个约束NSLayoutConstraint.activate()

let label = UILabel(frame: CGRect.zero)
label.text = "Nothing to show"
label.textAlignment = .center
label.backgroundColor = .red  // Set background color to see if label is centered
label.translatesAutoresizingMaskIntoConstraints = false
self.tableView.addSubview(label)

let widthConstraint = NSLayoutConstraint(item: label, attribute: .width, relatedBy: .equal,
                                         toItem: nil, attribute: .notAnAttribute, multiplier: 1.0, constant: 250)

let heightConstraint = NSLayoutConstraint(item: label, attribute: .height, relatedBy: .equal,
                                          toItem: nil, attribute: .notAnAttribute, multiplier: 1.0, constant: 100)

let xConstraint = NSLayoutConstraint(item: label, attribute: .centerX, relatedBy: .equal, toItem: self.tableView, attribute: .centerX, multiplier: 1, constant: 0)

let yConstraint = NSLayoutConstraint(item: label, attribute: .centerY, relatedBy: .equal, toItem: self.tableView, attribute: .centerY, multiplier: 1, constant: 0)

NSLayoutConstraint.activate([widthConstraint, heightConstraint, xConstraint, yConstraint])

更好的解决方案:

由于这个问题最初已得到解答,因此引入了布局锚点,使得创建约束变得更加容易。在此示例中,我创建约束并立即激活它们:

label.widthAnchor.constraint(equalToConstant: 250).isActive = true
label.heightAnchor.constraint(equalToConstant: 100).isActive = true
label.centerXAnchor.constraint(equalTo: self.tableView.centerXAnchor).isActive = true
label.centerYAnchor.constraint(equalTo: self.tableView.centerYAnchor).isActive = true

或同样使用NSLayoutConstraint.activate():

NSLayoutConstraint.activate([
    label.widthAnchor.constraint(equalToConstant: 250),
    label.heightAnchor.constraint(equalToConstant: 100),
    label.centerXAnchor.constraint(equalTo: self.tableView.centerXAnchor),
    label.centerYAnchor.constraint(equalTo: self.tableView.centerYAnchor)
])

注意:始终将子视图添加到视图层次结构中before创建并激活约束。


原答案:

约束条件参考self.tableView。由于您要将标签添加为子视图self.tableView,需要在“共同祖先”上添加约束:

   self.tableView.addConstraint(xConstraint)
   self.tableView.addConstraint(yConstraint)

正如 @mustafa 和 @kcstricks 在评论中指出的那样,您需要设置label.translatesAutoresizingMaskIntoConstraints to false。当您执行此操作时,您还需要指定width and height由于不再使用框架,因此标签具有约束。最后,您还应该设置textAlignment to .Center以便您的文本位于标签的中心。

    var  label = UILabel(frame: CGRectZero)
    label.text = "Nothing to show"
    label.textAlignment = .Center
    label.backgroundColor = UIColor.redColor()  // Set background color to see if label is centered
    label.translatesAutoresizingMaskIntoConstraints = false
    self.tableView.addSubview(label)

    let widthConstraint = NSLayoutConstraint(item: label, attribute: .Width, relatedBy: .Equal,
        toItem: nil, attribute: .NotAnAttribute, multiplier: 1.0, constant: 250)
    label.addConstraint(widthConstraint)

    let heightConstraint = NSLayoutConstraint(item: label, attribute: .Height, relatedBy: .Equal,
        toItem: nil, attribute: .NotAnAttribute, multiplier: 1.0, constant: 100)
    label.addConstraint(heightConstraint)

    let xConstraint = NSLayoutConstraint(item: label, attribute: .CenterX, relatedBy: .Equal, toItem: self.tableView, attribute: .CenterX, multiplier: 1, constant: 0)

    let yConstraint = NSLayoutConstraint(item: label, attribute: .CenterY, relatedBy: .Equal, toItem: self.tableView, attribute: .CenterY, multiplier: 1, constant: 0)

    self.tableView.addConstraint(xConstraint)
    self.tableView.addConstraint(yConstraint)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

以编程方式添加 CenterX/CenterY 约束 的相关文章

  • 当出现alertController(actionSheet)时inputAccessoryView动画向下

    我有一个用于聊天应用程序的 inputAccessoryView 它始终保持可见并停靠在屏幕底部 用于类似于大多数消息应用程序的文本输入 当我呈现带有actionSheet样式的alertController时 inputAccessory
  • 金属顶点着色器绘制纹理的点

    我想执行 Metal 或 OpenGLES 3 0 着色器 通过混合绘制点基元 为此 我需要将纹理的所有像素坐标作为顶点传递给顶点着色器 该顶点计算要传递给片段着色器的顶点的位置 片段着色器仅输出启用混合的点的颜色 我的问题是 是否有一种有
  • 通过 URL 中的 ID 进行 RestKit 关系映射

    假设我有一个 APIusers 1 items返回一个列表items为了userID 为 1 假设API响应如下 items id 1 description Some item 请注意 响应不包含user id用于关系映射 RestKit
  • 在 UIButton 中垂直显示标题?

    我是 iPhone 编程新手 我被这个简单的问题困扰了 我有一个UIView with a UIButton在里面 维度为UIButton40x200 靠近左边距 我需要在按钮中垂直显示文本 有没有一种方法可以在不使用任何图像的情况下完成此
  • Swift(UI) 错误:无法在不可变值上使用变异成员:“self”是不可变的

    基本上我想做的是 如果您按下按钮 那么条目应该获得一个新的 CEntry 如果有人能帮助我那就太好了 谢谢 struct AView View var entries CEntries var body some View ZStack V
  • UIAlertController 的警报无法关闭它

    我正在创建警报 但当用户按 确定 时无法将其关闭 我收到以下错误 2017 12 28 07 03 50 301947 0400 Prestamo 691 215874 API 错误 返回 0 宽度 假设 UIViewNoIntrinsic
  • __attribute__ ((已弃用)) 不适用于 Objective-C 协议方法?

    我需要弃用 Objective C 协议中的单个方法 在普通的类 实例方法上我添加 attribute deprecated 声明后 看来它不适用于协议方法 如果我将它们标记为已弃用并在某个地方使用它们 则项目编译正常 不会出现预期的弃用警
  • 使用音频单元录制我的 iPhone 应用程序播放的声音

    我今天有很多有趣的事情iOS 和音频单元并发现了很多有用的资源 包括在内 首先 我对某些事情感到困惑 是否真的有必要创建一个音频图 with 混合器单元录制应用程序播放的声音 或者播放声音就足够了ObjectAL https github
  • iPhone 相机访问权限?

    我想知道如何访问 iPhone 相机并实时使用它 例如 仅在相机视图上绘图 另一个相关问题 可以显示吗同时 4 个摄像机视图就像 Mac 上的 Photo Booth 一样 您可以使用 AVFoundation 来做到这一点 void in
  • 创建 Android 智能应用横幅

    Android 设备有类似 iOS 6 智能应用横幅的解决方案吗 这是智能应用横幅的代码 从 Chrome 44 Beta 开始 您可以在 Android 版 Chrome 中推送您的应用程序 您网站上的本机应用程序安装横幅 请看下面的答案
  • iOS - Xcode 错误:由于系统完整性保护而无法附加到进程

    当我从 XCode 运行按钮运行应用程序共享扩展 然后尝试共享文件时 XCode 经常显示以下错误 有人知道是什么原因造成的吗 错误 由于系统完整性保护 无法附加到进程 系统完整性保护 SIP 又名无根 是 OS X 10 11 中的一项新
  • 如何在cordova中动态加载CSS

    我正在尝试通过 xhr 请求在 cordova 中动态加载 CSS CSS 的加载不是问题 我可以通过 xhr 加载它并通过 HTML5 文件 API 将其存储到文件系统 然后我就可以得到一个完美的 URL 但是如果我通过 javascri
  • 在适用于 iOS 的 Google 地图 SDK 上进行 GMSMapView 屏幕截图时出现问题

    我遇到的一个问题是当我尝试截取 GMSMapView Google Maps SDK iOS 任何部分的屏幕截图时 UIGraphicsGetImageFromCurrentImageContext UIImage 输出是不可见的 我最终发
  • UINavigationController如何设置标题

    我有一个用于通用项目列表的控制器 视图 可以扩展它以显示自定义列表 列表和导航工作正常 但我无法更改 UINavigationController 的标题 在通用控制器中 void viewDidLoad super viewDidLoad
  • 检查仪器中的内存分配

    我已经使用泄漏工具清除了应用程序的泄漏 但我仍然注意到当我切换视图时 objectalloc 工具分配的对象数量和占用空间会增加 我特别看到大量 GeneralBlock 16 主要由基金会负责调用者 NSLogv and GeneralB
  • 使用 UIAppearance API 自定义 UIBarButtonSystemItem 的色调颜色

    我知道我可以定制UIBarButtonItem文本通过 setTitleTextAttributes forState 还有一种方法可以自定义UITabBar图标通过 setSelectedImageTintColor 有没有办法自定义色调
  • BLE:使用 Android / iOS 读取长特征值

    对于正常的特征读取 仅读取 MTU 大小 20 字节 的数据 我的客户将提供更大尺寸 超过 100 字节 的特征 我看到 BLE 提供了 长读取 功能 可以读取直到达到特征的大小 https bluegiga zendesk com ent
  • 在 CAKeyFrameAnimation 期间检测碰撞

    当一个 UIImageView 在 CAKeyFrameAnimation 期间沿一条路径行进时 是否可以检测到两个 UIImageView 的碰撞 如果是这样 这是如何完成的 我尝试了多种方法 包括在动画期间检查 CGRect 是否发生碰
  • 如何正确删除 SFSafariViewController 作为子视图控制器?

    我正在使用提供的技术这个答案 https stackoverflow com a 35356986 830098在 SFSafariViewController 中预加载一些 URL 如下所示 addChildViewController
  • Phonegap - 自动包含正确的科尔多瓦

    我正在 iOS 和 Android 上开发一个 PhoneGap 应用程序 并使用 git 控制我的 www 目录版本 我知道我的 HTML 文件需要包含正确的 Cordova js 文件 取决于我当前正在开发的平台 当有人在 Androi

随机推荐

  • 如何自动更新 Subversion 工作副本?

    有谁知道我如何自动运行svn update 如果有人有脚本或类似的东西 你能给我举个例子吗 我正在使用 TortoiseSVN 在生产服务器上 我有一个运行以下批处理文件的计划任务 CD C Program Files TortoiseSV
  • 如何查看 Git 存储中未跟踪的文件

    我经常将我完成的工作隐藏在新的 未跟踪的 文件中 并且我希望以后能够找到这项工作 找到它的明显方法似乎是git show 我刚刚发现Git在我使用时完全省略了这些文件git show 但幸运的是 在弹出隐藏代码时不会忽略它们 这使得似乎不可
  • 在 FFmpeg 中正确分配和填充帧

    我正在填写一个Frame使用 BGR 图像进行编码 但出现内存泄漏 我想我找到了问题的根源 但它似乎是一个库问题 由于 FFmpeg 是一个如此成熟的库 我认为我误用了它 我希望得到指导如何正确地使用它 我正在分配一个Frame using
  • JasperReports 中的印地语字体 [重复]

    这个问题在这里已经有答案了 在印地语字体的内部预览中正确显示 但在 PDF 中情况有所不同 例如 在 Pdf 中显示 怎么解决这个问题 一些字体类型 例如 Arial Unicode MS 将支持特殊字符 例如印地语符号 要解决此问题 请打
  • 如何使用汇编程序从英特尔处理器中获取随机数?

    我需要从处理器 英特尔酷睿 i3 中的英特尔随机生成器获取随机数 我不想使用任何图书馆 我想在 C 中使用汇编程序粘贴 但我不知道应该使用哪些寄存器和指令 呼叫RDRAND支持的 CPU 目前仅 Ivy Bridge 和 Haswell I
  • 如何使用OpenCV找出帧之间的差异?

    在 OpenCV 上运行视频时如何找到帧之间的差异 我需要做一个循环来检查帧与帧之间的更改并将结果显示在另一个窗口中 我可以在此处附加的循环中执行此操作吗 或者还有其他方法可以做到吗 while key x frame cvQueryFra
  • 手动调用 __enter__ 和 __exit__

    我用谷歌搜索过但没有运气 所以让我们想象一下我有MySQL使用的连接器类 enter and exit 函数 最初与with语句 来连接 断开与数据库的连接 让我们有一个使用其中 2 个连接的类 例如用于数据同步 注意 这不是我的现实生活场
  • 如何在 2020/21 年活动中获取 ViewModel 实例?

    我是 mvvm 模式的新手 我为主要活动创建了一个 ViewModel 现在我想在主活动中获取 ViewModel 的实例 Stackoverflow 上的大多数教程和答案都建议使用ViewModelProviders of 但这已被弃用
  • 无法使用 Httprequest 库将图像上传到服务器

    我创建了一个应用程序 用户在其中从图库中选择图像并将该图像上传到服务器 我尝试使用 Httprequest 库执行此操作 但我无法上传它 Code HttpRequest request HttpRequest post https bet
  • Flutter android 版本卡在启动屏幕上

    Flutter android 版本构建卡在启动屏幕上 我尝试过清理项目flutter clean 但它仍然卡在启动屏幕上 我也用过WidgetsFlutterBinding ensureInitialized 在执行之前runApp 它仍
  • 如何在不破坏 Subversion 历史记录的情况下重命名 Java 包?

    我工作的公司正在成立 他们在此过程中更改了名称 所以我们仍然使用包名称 com oldname 因为我们害怕破坏文件更改历史记录 或者版本之间的祖先链接 或者任何我们可能破坏的东西 我不认为我使用了正确的术语 但你明白了这个概念 我们使用
  • 从外部文件获取输入?

    我需要从 C 的外部文件中获取非常基本的输入 我尝试在互联网上搜索几次 但没有任何内容真正适合我的需要 这将是一个输入来自的 txt 文件 其中将填充如下行 131 241 371 481 我已经有代码可以手动获取此输入 它看起来像这样 u
  • GCMIntentService 的 Intent Extras 未传递

    I coded GCMIntentService但打电话Activity无法获得额外费用 Override protected void onMessage Context context Intent intent Intent resu
  • 信息窗口显示在错误的位置

    I have little problem with my webpage When I m trying to show InfoWindow on marker That windows shows on the top left co
  • Google FooBar 挑战显示 Blacklisted_Code 错误 [已关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 我今天偶然发现了 Google Foo Bar 挑战 在解决非常简单的第一个问题时 gt 涉及创建字符串中所有素数的串联
  • 不间断睡眠是否是我的Python程序运行速度非常慢的原因(如果是这样,我该如何解决这个问题?)?

    我有以下 select 语句 使用 sqlite3 和 pysqlite 模块 self cursor execute SELECT precursor id FROM MSMS precursor JOIN spectrum ON spe
  • SQL Server 行级安全性 - 多对多

    我们使用 SQL Server 2008 并在 Active Directory AD 中设置权限 核心表中的每一行只能由有权查看每一行的人员查看 我可以在每一行上设置行级安全性 每行包含与 AD 组对齐的单个角色 但是我遇到以下问题 因为
  • 需要单个 SQL 查询[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我有两个表如下 companyid name 1 pwc 2 dell 3 microsoft 4 google 5 yahoo 6 tw
  • 如何防止 sqlalchemy 在 select 上创建事务?

    我的问题 我有一个包含多行数据的文件 我想要try将每一行插入我的数据库 但是如果any的行有问题 我需要回滚整个套件和 kaboodle 但我想跟踪实际的错误 所以我可以这样说 而不是仅仅死在第一个有错误的记录上 该文件有 42 个错误
  • 以编程方式添加 CenterX/CenterY 约束

    我有一个 UITableViewController 如果没有任何内容可显示 则不会显示任何部分 我添加了一个标签来向用户表明此代码没有任何内容可显示 label UILabel frame CGRectMake 20 20 250 100