以编程方式设置约束

2023-12-26

我正在尝试如何使用 UIScrollView。经过一番折腾,我终于掌握了窍门。但现在我似乎遇到了另一个障碍。

在这个简单的应用程序中,我有一个滚动视图,为了使其工作,我必须将视图的底部空间设置为滚动视图约束为 0,如上所述here https://stackoverflow.com/a/15516706/1077789而且效果很好。我是通过IB来做的。

现在我遇到了一个场景,我必须以编程方式完成该部分。我在以下代码中添加了viewDidLoad method.

NSLayoutConstraint *bottomSpaceConstraint = [NSLayoutConstraint constraintWithItem:self.view
                                                                             attribute:NSLayoutAttributeBottom
                                                                             relatedBy:NSLayoutRelationEqual
                                                                                toItem:self.scrollView
                                                                             attribute:NSLayoutAttributeBottom
                                                                            multiplier:1.0
                                                                              constant:0.0];
[self.view addConstraint:bottomSpaceConstraint];

但这似乎不起作用。它在控制台窗口中输出以下消息,但我不知道该怎么做。

无法同时满足约束条件。 可能至少以下列表中的约束之一是您不想要的。尝试这样做:(1)​​查看每个约束并尝试找出您不期望的约束; (2) 找到添加了不需要的约束的代码并修复它。 (注意:如果您看到不理解的 NSAutoresizingMaskLayoutConstraints,请参阅 UIView 属性的文档translatesAutoresizingMaskIntoConstraints) ( "", ”” )

有人可以告诉我该怎么做吗?我还附上了一个演示项目here http://www52.zippyshare.com/v/15239751/file.html以便您可以更好地了解该问题。

UPDATE:

首先感谢您的回复。使用答案中提到的方法我能够让它发挥作用。然而,在稍微不同的情况下,情况并非如此。现在我尝试以编程方式将视图加载到视图控制器上。

如果我可以进一步解释的话。有 2 个视图控制器。第一个是UITableViewController第二个是UIViewController。里面有一个UIScrollView。还有多个UIView其中一些视图的高度超过了屏幕的正常高度。

The UITableViewController显示选项列表。根据用户的选择,特定的UIView批次外将被装载到UIViewControllerUIScrollView.

在这种情况下,上述方法不起作用。滚动没有发生。因为我是单独加载视图,所以我必须做一些不同的事情吗?

我已经上传了一个演示项目here http://www72.zippyshare.com/v/15876364/file.html这样您就可以看到它的实际效果。请参阅Email.xib并选择Email从表视图列表中。


根据对您的代码的审查,有一些评论:

  1. 当视图出现时,您通常不需要调整约束。如果您发现自己这样做,通常意味着您没有正确配置故事板(或者至少没有有效配置)。您真正需要设置/创建约束的唯一时间是(a)您以编程方式添加视图(我建议这比其价值更多的工作);或者 (b) 您需要对约束进行一些运行时调整(请参阅下面第 3 点下的第三个要点)。

  2. 我无意赘述,但您的项目有一堆冗余代码。例如。

    • 您正在为滚动视图设置框架,但这是由约束控制的,因此不会执行任何操作(即,当应用约束时,任何手动设置frame设置将被替换)。一般来说,在自动布局中,不要尝试更改frame直接:编辑约束。但是,无论如何根本不需要改变约束,所以这一点是没有意义的。

    • 您正在设置滚动视图的内容大小,但在自动布局中,这也受到(子视图)约束的控制,因此这是不必要的。

    • 您正在为滚动视图设置约束(已经为零),但是您没有将 NIB 中的视图添加到滚动视图中,这也违背了那里的任何意图。最初的问题是如何更改滚动视图的底部约束。但其底部约束已经为零,因此我认为没有理由再次将其设置为零。

  3. 我建议对您的项目进行更彻底的简化:

    • 将您的观点存储在 NIB 中会让您的生活变得更加艰难。如果您留在故事板的世界中,那就容易多了。如果您确实需要的话,我们可以帮助您做 NIB 的事情,但为什么要让自己的生活如此艰难呢?

    • 使用单元格原型来促进表中单元格的设计。您还可以定义从单元格到下一个场景的转场。这消除了编写任何内容的需要didSelectRowAtIndexPath or prepareForSegue代码。显然,如果您需要将某些内容传递到下一个场景,请务必使用prepareForSegue,但到目前为止您所呈现的内容都不需要这样做,因此我在示例中对其进行了注释。

    • 假设您正在寻找以编程方式更改约束的实际示例,我已经设置了场景,以便文本视图将根据文本视图中的文本以编程方式更改其高度。与往常一样,在更改 IB 为我创建的现有约束时,我认为建立一个约束要高效得多,而不是遍历约束来找到有问题的约束。IBOutlet为约束,并编辑constant直接约束的属性,这就是我所做的。所以我将视图控制器设置为文本视图的委托,并编写了一个textViewDidChange更新了文本视图的高度约束:

      #pragma mark - UITextViewDelegate
      
      - (void)textViewDidChange:(UITextView *)textView
      {
          self.textViewHeightConstraint.constant = textView.contentSize.height;
          [self.scrollView layoutIfNeeded];
      }
      

      请注意,我的文本视图有两个高度约束,一个强制性的最小高度约束和一个中等优先级约束,我根据文本量在上面更改了该约束。要点是它说明了以编程方式更改约束的实际示例。您根本不必处理滚动视图的底部约束,但这显示了您何时可能想要调整约束的真实示例。


当你在IB中添加滚动视图时,它会自动获取你需要的所有约束。您可能不想以编程方式添加约束(至少在不删除现有底部约束的情况下)。

有两种方法可能更简单:

  1. 创建一个IBOutlet对于您现有的底部约束,比如说scrollViewBottomConstraint。然后你就可以做

    self.scrollViewBottomConstraint.constant = 0.0;
    
  2. 或者最初在 IB 中创建视图,其中底部约束为 0.0,然后您根本不需要以编程方式执行任何操作。如果要布局长滚动视图及其子视图,请选择控制器,将其模拟指标从“推断”设置为“自由形式”。然后您可以更改视图的大小,将滚动视图的顶部和底部约束设置为零,在滚动视图内布局您想要的所有内容,然后当视图在运行时呈现时,视图将适当地调整大小,并且因为您已将滚动视图的顶部和底部约束定义为 0.0,它将正确调整大小。它在 IB 中看起来有点奇怪,但当应用程序运行时它就像一个魅力。

  3. 如果您决定添加新约束,则可以以编程方式删除旧的底部约束,或者将旧的底部约束的优先级设置得尽可能低,这样您的新约束(具有更高的优先级)将优先,并且旧的低优先级底部约束将不会被优雅地应用。

但您绝对不想只添加一个新的约束。

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

以编程方式设置约束 的相关文章

随机推荐

  • 使结构体变得易失性是否会使其所有成员都易失性?

    如果我有 struct whatever int data volatile whatever test will test data也会波动吗 可以提出另一个问题 或者只是用另一种方式来看待原始问题 是否制作一个结构体const使其所有成
  • 为当前的下一行数据编写脚本

    如果我想复制下一行的数据该怎么办 例如 客户 A 于 2015 年 1 月 1 日开始当前行程 下一次行程于 2015 年 1 月 15 日开始 因此 他当前行程的结束日期将为 2015 年 1 月 14 日 即下一次行程开始的前一天 我可
  • Spring REST 错误处理:无法获取我的自定义消息

    我读了几篇关于服务器端错误处理的文章 教程 我只想用我的自定义消息返回一个 http 错误代码 当然这是行不通的 我在 javascript 回调中始终得到的结果是以下消息
  • Visual Studio 2005 Designer 未将控件添加到 aspx.Designer.cs

    我不是 Designer 的粉丝 我更喜欢直接在 ASPX 页面上编码 然而 自从重新格式化 并导致重新格式化 以来 designer cs手动编码到 aspx 文件时 文件未正确更新 这意味着我的代码隐藏 http en wikipedi
  • 让Python忽略.pyc文件

    有没有办法让 Python 忽略任何存在的 pyc 文件并始终直接解释所有代码 包括导入的模块 谷歌还没有找到任何答案 所以我怀疑没有 但为了以防万一 似乎值得一问 为什么我要这样做 我有一个大型 Python 脚本管道 这些脚本在数百台计
  • 编译 C 程序时体系结构 x86_64 的未定义符号[重复]

    这个问题在这里已经有答案了 我有一个简单的程序演示 use c include libhello h int main void hello return 0 libhello h void hello void libhello c in
  • Java 中的 PrintWriter 或任何其他输出流不知道“\r\n”

    我在使用 PrintWriter 或任何其他输出流在服务器和客户端程序之间发送消息时遇到问题 如果我使用 println abc 进行通信 它可以正常工作 但是如果我使用 print abc r n print abc n 或 print
  • Objective-C 中的自动释放池 - 释放主 AutoreleasePool?

    根据我的理解 当一个对象被发送时autorelease消息 如果除中的自动释放池之外不存在自动释放池main m 该对象被放置在main m 假设这是正确的 我有几个问题 1 所有自动释放的对象是否都会保留在该池中直到应用程序终止 2 如果
  • NSAttributedString 文本始终以较大的 lineHeight 粘在底部

    我正在尝试实现来自 Sketch 的按设计标签 例如我需要字体大小 19 和行高 50 的文本样式 所以我最终使用NSAttributedString with NSMutableParagraphStyle但因文本粘在底部的问题而停止UI
  • \r 和 \n 有什么区别?

    How are r and n不同的 我认为这与 Unix Windows 和 Mac 有关 但我不确定它们究竟有何不同 以及在正则表达式中搜索 匹配哪些内容 他们是不同的角色 r是回车符 并且 n是换行 在 旧 打印机上 r将打印头送回行
  • 将 anticaptcha 与 selenium 集成

    我正在使用 Selenium Python 尝试填写表格 然后填写验证码 我找到了 python anticaptcha 并购买了 10 美元的积分 一切正常 验证码出现了 但什么也没发生 我花了几个小时试图寻找答案 查阅他们的 api 和
  • Android TabLayout 在启动时选择第一个选项卡

    我正在使用 Android 设计库中的 TabLayout 我有多个选项卡 每个选项卡在被选择时都有一个操作 所以我有一个属性 startSelection 它执行 tabLayout getTabAt startSelection sel
  • 如何在处理注释时写入 Gradle 日志记录?

    我有一个javax annotation processing Processor我用来生成源文件 这一切都工作正常 但我想在构建过程中将一些调试消息写入控制台 我可以使用注释Messeger类 但这不允许我利用 Gradle 日志记录 我
  • r 闪亮滑块输入轮

    我的 R 闪亮滑块输入有问题 如您所见 圆形功能 不起作用在这幅图片中 https i stack imgur com v4nd6 png 我做错什么了吗 sliderInput Er Choose expected return in p
  • 在哪里检查 android 片段中的方向变化

    在我的应用程序中 我有一个FragmentActivity与多个Fragment除了一个特定的情况外 全部处于纵向模式Fragment 我在之间移动Fragment通过页脚View是在FragmentActivity 我有不同的布局 实际上
  • 如何测试我的 Django 电子邮件视图是否可以捕获 BadHeaderError?

    我有一个带有电子邮件表单的 Django 视图 它允许用户输入主题和消息 并将其作为电子邮件发送给站点管理员 我想编写一个单元测试来确保该视图可以捕获错误标头错误 https docs djangoproject com en 1 4 to
  • SQLiteAsyncConnection UpdateWithChildren 不可用

    我正在尝试使用 SQLite net 在我的 PCL 内实现 OneToMany 关系 我有异步扩展包 SQLiteNetExtensions Async 并且我的代码基于中找到的示例https bitbucket org twincode
  • 在 Google Analytics API 中使用和查询自定义维度

    我正在尝试查询我的 Analytics 通用 以接收按自定义维度排序的指标列表 7月 Google Analytics API 博客 http analytics blogspot com 2013 07 40 new data point
  • 循环图的数据结构和算法

    我需要定义Data Structure and Algorithm for Circular Data Graph对于网络客户端 在服务器上 数据将以 2 列 CSV 格式提供 例如发送方 接收方 最终输出将呈现在JSON格式并发送到网络请
  • 以编程方式设置约束

    我正在尝试如何使用 UIScrollView 经过一番折腾 我终于掌握了窍门 但现在我似乎遇到了另一个障碍 在这个简单的应用程序中 我有一个滚动视图 为了使其工作 我必须将视图的底部空间设置为滚动视图约束为 0 如上所述here https