在约束依赖于框架的自定义视图中使用自动布局

2023-12-26

我正在编写一个以编程方式初始化的自定义视图。我覆盖updateConstraints添加此视图所需的所有约束。 :

- (void)updateConstraints {
    [self.superview addConstraint:[NSLayoutConstraint constraintWithItem:self attribute:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual toItem:self.superview attribute:NSLayoutAttributeCenterX multiplier:1 constant:0]];

    [self.superview addConstraint:[NSLayoutConstraint constraintWithItem:self attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:self.superview attribute:NSLayoutAttributeTop multiplier:1 constant:0]];
    [self.superview addConstraint:[NSLayoutConstraint constraintWithItem:self attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:self.superview attribute:NSLayoutAttributeBottom multiplier:1 constant:0]];

    // some more constraints, you get the point

    self.bottomSpacingConstraint = [NSLayoutConstraint constraintWithItem:self.imageView attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeBottom multiplier:1 constant:-(0.2 * CGRectGetHeight(self.bounds))];
    [self addConstraint:self.bottomSpacingConstraint];

    [super updateConstraints];
}

问题是self.bounds返回相当于CGRectZero。我做了我的研究并根据这个objc.io 文章 http://www.objc.io/issue-3/advanced-auto-layout-toolbox.html,这是预期的,因为框架直到layoutSubviews叫做。它还提到

要强制系统立即更新视图树的布局,您可以调用layoutIfNeeded/layoutSubtreeIfNeeded(分别在 iOS 和 OS X 上)。如果您的后续步骤依赖于最新的视图框架,这会很有帮助。

但是,当我添加

[self setNeedsLayout];
[self layoutIfNeeded];

就在设置之前self.bottomSpacingConstraint in updateConstraints,我仍然得到一个CGRectZero回到框架。根据 objc.io 文章(以及这个所以答案 https://stackoverflow.com/a/20846449/751268),这些方法应该触发布局并更新框架。

有人可以阐明如何使这一切发挥作用吗?我对解决方案以及导致调用哪些与布局相关的方法的原因感兴趣(例如,似乎更改现有约束的常量layoutSubviews causes setNeedsUpdateConstraints被调用,然后触发updateConstraints并导致约束被添加多次)。


我很确定你不能或不应该打电话layoutIfNeeded from updateConstraints。更新约束是在布局周期的早期部分,所以我认为它不会产生您想要的效果。

在您的情况下,解决方案是检查constantlayoutSubviews 中依赖于框架的约束的属性,如果需要更新,请在那里更新或调用setNeedsUpdateConstraints(小心引起循环)。

你说过更新约束会触发另一个调用updateConstraints- 这是真的,我认为你滥用了updateConstraints- 那是为了updating基于视图内容更改的约束。仅当这些约束尚不存在时,您才应添加它们。

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

在约束依赖于框架的自定义视图中使用自动布局 的相关文章

  • 重新安装我的 iPad 应用程序时,ApplicationIconBadgeNumber 未重置。

    我正在使用以下代码设置我的 applicationIconBadgeNumber UIApplication sharedApplication setApplicationIconBadgeNumber theIntToDisplay 问
  • 在 iPhone 上搜索 PDF

    经过两天尝试使用 Quartz 从 PDF 中读取注释后 我成功做到了并且发布我的代码 https stackoverflow com questions 4080373 get pdf hyperlinks on ios with qua
  • Xcode 8:使用 iOS 9.3 基础 SDK 编译?

    我在 Xcode 8 0 beta 8S128d 中将 iOS 应用程序升级到 Swift 3 0 我以为一切都已准备就绪 并将其上传到 iTunes Connect 当我点击 提交审核 时 它给了我一个包含 26 个错误的列表 每个嵌入式
  • 隐藏故事板中的导航栏

    谁能告诉我如何隐藏故事板中的导航栏 我下面的代码在模拟器中运行时工作正常 但它仍然出现在我的故事板中 这真的很烦我 因为它弄乱了我的图像的位置 有人可以帮忙吗 void viewWillAppear BOOL animated super
  • 符号化 iPad 崩溃日志后回溯仍然不可读

    我有这些崩溃日志 在我将它们放入管理器中后 会自动进行符号化 但结果始终相同 iOS 调用得到符号化 而我的应用程序调用则没有 我尝试将 Dym 和应用程序文件复制到同一文件夹中 删除并再次复制回来 没有任何帮助 知道发生了什么事吗 所以我
  • 如何在 SceneKit 中以编程方式将 png 纹理包裹在立方体周围

    我是 SceneKit 的新手 试图让一些基本的东西工作 但到目前为止还没有取得多大成功 由于某种原因 当我尝试将 png 纹理应用于 CNBox 时 我最终除了黑色之外什么也没有 这是我在 viewDidLoad 中的简单代码片段 let
  • Flutter-iOS 当应用程序更新/重新编译时存储的图像丢失

    嗨 请原谅我的英语 也是 flutter iOS 的新手 我在 iOS 上有一个关于 flutter 的应用程序 用户可以从他们的相机和图库中拍摄照片和视频 我正在使用 image picker 包 这没有问题 然后我将其保存在在其应用程序
  • Swift:如何让游戏中的角色只有落地后才能跳跃?

    我正在开发一款游戏 我的角色可以从一个陆地跳到另一个陆地 我已经把所有事情都做好了 除了我剩下的问题是 如果你继续点击屏幕 他可以永远跳跃 我希望他必须先落地才能再次跳跃 import SpriteKit import GameplayKi
  • iPhone:每日本地通知

    我正在尝试实现本地通知 这就是我所设置的 Current date NSDate date NSDate date Add one minute to the current time NSDate dateToFire date date
  • iOS 何时清理本地应用程序 ./tmp 目录?

    iOS什么时候清理本地应用程序 tmp目录 请注意 这不是一个骗局这个问题 https stackoverflow com questions 3593900 iphone storage in tmp directory 我问的是应用程序
  • 如何使用逗号和行分隔符对字符串进行标记

    我正在 Swift 中制作一个简单的 String Tokenizer 就像在 Java 中一样 但这对我来说确实不起作用 我的数据源中每行的末尾用 分隔 数据用逗号分隔 例如 字符串 1 字符串 2 字符串 3 字符串 1 字符串 2 字
  • iPhone 的翻译器?

    我对为 iPhone 制作一个解释器很感兴趣 这将是一个实验性的想法 但可能会很棒 我喜欢让我自 己的语言适合移动计算和数学的想法 我查阅了很多资料 发现有关 iPhone 上的口译员的信息很复杂 苹果会允许什么 我见过这个应用程序 这是一
  • 在 Swift 中的 For 循环中更改对象的属性

    我创建了一个名为 ShoppingList 的简单结构 struct ShoppingList var shoppingListId NSNumber var title String var groceryItems GroceryIte
  • gestureRecognizer shouldReceiveTouch 持续存在于已释放的视图中导致崩溃

    我有一个相当简单的 UITableView 它在堆栈上推送一个新视图 新视图有一个像这样初始化的gestureRecognizer synthesize swipeGestureLeft void viewDidLoad swipeGest
  • “无法取消归档名为 UITableViewController 的元素”

    我一直在按照 构建你的第二个 iOS 应用程序 教程一步步进行 在教程承诺所有错误都会消失之后 我遇到了这个错误 但直到其他错误都出现后 该错误才出现 全部更正 我尝试编译它 错误 The document MainStoryboard i
  • UITableViewCell 内嵌套 UIStackView 内的 UILabel 有时会被截断

    我的一个表设置中有一个表视图单元格 其中包含以下视图层次结构 外部水平 stackview 固定到单元格内容视图的尾部 前部 底部和顶部边缘 右侧标签固定到其父 stackViewHackView 的尾部 前部 底部和顶部边缘 在我的控制器
  • 使用未声明的类型“对象”

    这太奇怪了 通常我可以理解未声明的类 但这是声称 Object 类本身未声明 NSObject 可以工作 但我的项目设置方式我需要它是一个纯 Swift 对象 我的类标题如下所示 import UIKit import Foundation
  • 如何将设备上未保存的图片上传到dropbox帐户?(IOS)

    Dropbox RestClient 仅保存文件 所以我想先将图像保存在本地文件夹中 然后上传它 结果它保存了文件 但它已损坏 NSString localPath NSBundle mainBundle pathForResource I
  • 如何将nsmutable数组添加到sqlite数据库表中

    如何将nsmutablearray添加到sqlite数据库表中 有人可以帮我编码吗 您可以使用 for int i 0 i lt mutArray count i NSString string mutArray objectAtIndex
  • 如何从第二个视图弹回到根视图?

    我使用 2 将 3 个视图 根视图 第 1 个视图 第 2 个视图 连接在一起modal在 Apple Watch 故事板中继续 1 在根视图中 按下 保存 按钮后 将显示第一个模态视图 2 在第一模态视图中 一旦按下 500 按钮 将显示

随机推荐

  • 如何在树枝模板中的变量之间添加空格?

    这是一个非常简单的问题 但我还没有找到答案 这段代码 civilite nom prenom 打印 MRJOHSONBarry 我想在变量之间添加空格 我该怎么做 如果 Civilite nom prenom 不起作用 怎么样 civili
  • 我不断收到类型错误

    好吧 我正在自学 python 类 当我运行代码时 出现以下错误 class Critter object A virtual pet def init self name mood print A new critter has been
  • 使用批处理文件在 Windows 中生成 GUID

    如何在 Windows 中使用命令行运行的批处理文件中生成 GUID Windows SDK 附带了一个名为uuidgen 如果您有 Visual Studio 您将拥有 Windows SDK 并且需要运行Visual Studio 命令
  • WPF - 从 ItemsControl 的 ItemTemplate 内绑定到项目索引?

    有没有办法从 ItemsControl 的 ItemTemplate 中绑定到 ItemIndex 例如
  • 向 Ruby 数组添加回调函数,以便在添加元素时执行某些操作

    我想向 Ruby 数组添加回调函数之类的东西 这样当将元素添加到该数组时 就会调用该函数 我能想到的一件事是重写所有方法 如 有更简单的解决方案吗 以下代码仅调用size changed当数组大小发生更改并且传递数组的新大小时挂钩 a cl
  • 如何为继承的槽定义 S4 原型

    我有一个基类 我们称之为 A 其表示对于许多其他类来说是通用的 因此我定义了其他类 例如 B 来包含这个类 我想设置这些其他类 B 的原型以包含从 A 继承的插槽的默认值 我认为这是很自然的 setClass A representatio
  • SAS 错误消息(致命:在 MISSING 涂片生成期间检测到代码生成错误)

    有谁知道这个错误消息是什么意思 致命 在 MISSING smear 生成期间检测到代码生成错误 它是在连接大约 40 个数据集时发生的 我相信这可能是由于变量太多 大约 217 而达到了内存限制 但最好能得到这一点的确认 日志档案 301
  • jstree 自定义节点标记

    有没有办法拥有自定义标记或向某些节点添加额外的 html 元素 例如 我们想在路径下的所有节点的节点文本后面添加一个箭头 链接 当用户单击该箭头时 打开上下文菜单 我知道可以使用右键单击打开上下文菜单 但要求是在节点后面有一个箭头 并且单击
  • 应用程序退出时关闭模态视图控制器

    我有一个视图控制器 视图 A 当用户按下按钮时呈现模态视图 B 并且视图 B 本身有一个按钮来呈现视图 C 我的问题是 如果用户在视图 B 或如图 C 所示 下次启动应用程序时将出现相同的视图 有没有办法在退出时关闭视图 B 和 C 或在应
  • 如何在网站上预览用户要上传的视频文件(PHP、FiileAPI JS)

    我的意思是 当用户从系统中选择视频文件时 网页已经向他们显示他们想要上传的文件 我已经使用 FileAPI JS 使用图像文件进行预览 我想对视频文件的 FileAPI JS 做同样的事情 所以 它必须在我的客户端内工作 谢谢并感谢您的回答
  • 导入错误:导入 mechanize 时没有名为“_version”的模块

    我通过 pip 安装 mechanize 并在导入模块时收到错误 python Python 3 5 2 default Jun 28 2016 08 46 01 GCC 6 1 1 20160602 on linux Type help
  • 登录后重定向到原始任务

    因此 我想向用户发送电子邮件 其中包含一些链接 您可以单击这些链接来执行操作 但如果用户尚未登录 我希望能够让用户登录 然后将他重定向回他想要达到的目标 我在 application controller rb 中有这些方法 这在 URL
  • strtotime('today') 返回错误的时间?

    我正在尝试创建一个从用户当前日期开始的选择列表 我希望将其设置为 unix 时间戳格式的午夜 这就是我正在做的一切 today strtotime today echo today 这是我的结果 1333144800 即 2012 年 3
  • 在强类型视图中格式化可为 null 的 DateTime 字段

    我的模型中有一个 Person 类 其 BornDate 属性定义为 DisplayName Born Date public DateTime BornDate get set 在我看来 我将此字段用作 td br td 问
  • 阴影 UIview 和 ClipsToBounds

    我想将阴影设置为我的容器 UIView 我用这段代码来实现它 id initWithCoder NSCoder aDecoder self super initWithCoder aDecoder if self gt drop shado
  • 如何将 Visual Studio Code 连接到 Visual Studio Team Services

    我最近下载了 Visual Studio Code 并试图弄清楚如何将编辑器连接到我的 Visual Studio Team Services 项目 有人在这方面取得过成功吗 首先下载 Visual Studio 团队服务 https ma
  • jQuery 中元素在 DOM 中的相对位置

    给定两个 jquery 对象 是否有某种方法可以告诉我哪个在文档树中比另一个 更靠前 换句话说 通过一个文档 p p div p p div p p 是否有一些函数具有这样的行为 p1 isBefore p2 true p3 isBefor
  • “不包含适合入口点的静态‘main’方法”

    我不明白下面的代码有什么问题 当我尝试编译时 我收到消息 不包含适合入口点的静态 main 方法 这是我的代码 using System using System Collections Generic using System Compo
  • 需要使用 PHP 在 Ubuntu 上查找网络接口的 IP 地址

    我需要帮助查找我的计算机在网络上时的 IP 地址 我正在构建一个信息亭类型的系统 该系统将被放置在不同的位置 并且我需要能够使用网络浏览器在本地网络上查找该计算机的 IP 地址 如果我使用 SERVER SERVER ADDR 我通过该计算
  • 在约束依赖于框架的自定义视图中使用自动布局

    我正在编写一个以编程方式初始化的自定义视图 我覆盖updateConstraints添加此视图所需的所有约束 void updateConstraints self superview addConstraint NSLayoutConst