jjzjj

ios - iOS 8 的自动布局问题,代码在 iOS 7 上运行良好

coder 2023-07-25 原文

我正在为 iPhone 和 iPad 开发应用程序。它支持 iOS6 和 iOS7,并且专门使用自动布局。

上周,当 Apple 宣布 iOS8 准备好迎接黄金时段时,我将我的一部 iPhone 和一部 iPad 都升级到了 iOS8。我还将我的 XCODE 升级到版本 6。我有第二部 iPhone,我留在 iOS7。

我使用 Xcode 6 生成了新的可执行文件,当我在运行 iOS8 的设备上执行时,看到它们的屏幕布局一团糟,但在 iOS7 上仍然正常,我感到很沮丧。在我的物理设备和 Xcode 的模拟器上都是如此。

这需要大量的挖掘,但我现在很清楚发生了什么,尽管我不知道为什么。

具体来说,某些自动布局操作在 iOS8 上对我来说失败了,但在 iOS7 上却没问题。

一些涉及按钮的示例,我将其放置在大小等于屏幕大小的基础 View 上:

(1) 如果我要求自动布局将按钮的水平中心 (CX) 定位为底层 View 的水平中心,结果是按钮的水平中心位于底层 View 的左边缘。

(2) 如果我要求自动布局使按钮的宽度等于基础 View 宽度的 50%,它根本没有宽度。

我可以通过以下方式解决这些问题:

(1) 我要求自动布局将按钮的中心定位为基础 View 的左边缘加上屏幕宽度的 50%。

(2) 我要求自动布局使按钮的宽度等于屏幕宽度的 50%。

我正在慢慢摸索自己的方式,使用这些变通方法,回到适用于我的 iOS7 和 iOS8 的自动布局代码。但我真的很想知道这里发生了什么。

看起来自动布局无法确定底层 View 的大小,因此需要该信息的自动布局计算失败。但它确实知道 View 的上边缘和左边缘在哪里,因此基于这些数据的计算会成功。

这是一个大型应用程序,我已经为 iOS6 和 iOS7 编写了数百行自动布局代码,它们非常适合我。

三天来,我一直在使用 iOS8 进行调整和尝试,但我并不比开始时更聪明。

有人对这里可能出现的问题有任何建议或想法吗?

最佳答案

@robmayoff 对此有一个很好的答案:https://stackoverflow.com/a/26066992/1424669

本质上,在 iOS8 中,您不能再在 View 上调用 setNeedsUpdateConstraintssetNeedsLayout 并期望更新 subview 的约束。

您必须在约束发生变化的 View 上调用这些方法。这向后兼容 iOS7。

示例:

假设您有一个带有 Root View self.view 的 ViewController 和一个名为 containerView 的 subview 。 containerView 有一个 NSLayoutConstraint 附加到它,你想改变它(在这种情况下,顶部空间)。

在 iOS7 中,您可以通过请求 Root View 的新布局来更新 VC 中的所有约束:

self.containerView_TopSpace.constant = 0;
[self.view setNeedsUpdateConstraints];
[self.view setNeedsLayout];

在 iOS8 中,您需要在 containerView 上请求布局:

self.containerView_TopSpace.constant = 0;
[self.containerView setNeedsUpdateConstraints];
[self.containerView setNeedsLayout];

关于ios - iOS 8 的自动布局问题,代码在 iOS 7 上运行良好,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25987244/

有关ios - iOS 8 的自动布局问题,代码在 iOS 7 上运行良好的更多相关文章

  1. ruby - 如何在 buildr 项目中使用 Ruby 代码? - 2

    如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby​​

  2. ruby-on-rails - Rails 源代码 : initialize hash in a weird way? - 2

    在rails源中:https://github.com/rails/rails/blob/master/activesupport/lib/active_support/lazy_load_hooks.rb可以看到以下内容@load_hooks=Hash.new{|h,k|h[k]=[]}在IRB中,它只是初始化一个空哈希。和做有什么区别@load_hooks=Hash.new 最佳答案 查看rubydocumentationforHashnew→new_hashclicktotogglesourcenew(obj)→new_has

  3. ruby - 如何验证 IO.copy_stream 是否成功 - 2

    这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下

  4. ruby-on-rails - 浏览 Ruby 源代码 - 2

    我的主要目标是能够完全理解我正在使用的库/gem。我尝试在Github上从头到尾阅读源代码,但这真的很难。我认为更有趣、更温和的踏脚石就是在使用时阅读每个库/gem方法的源代码。例如,我想知道RubyonRails中的redirect_to方法是如何工作的:如何查找redirect_to方法的源代码?我知道在pry中我可以执行类似show-methodmethod的操作,但我如何才能对Rails框架中的方法执行此操作?您对我如何更好地理解Gem及其API有什么建议吗?仅仅阅读源代码似乎真的很难,尤其是对于框架。谢谢! 最佳答案 Ru

  5. ruby - 模块嵌套代码风格偏好 - 2

    我的假设是moduleAmoduleBendend和moduleA::Bend是一样的。我能够从thisblog找到解决方案,thisSOthread和andthisSOthread.为什么以及什么时候应该更喜欢紧凑语法A::B而不是另一个,因为它显然有一个缺点?我有一种直觉,它可能与性能有关,因为在更多命名空间中查找常量需要更多计算。但是我无法通过对普通类进行基准测试来验证这一点。 最佳答案 这两种写作方法经常被混淆。首先要说的是,据我所知,没有可衡量的性能差异。(在下面的书面示例中不断查找)最明显的区别,可能也是最著名的,是你的

  6. ruby - 寻找通过阅读代码确定编程语言的ruby gem? - 2

    几个月前,我读了一篇关于ruby​​gem的博客文章,它可以通过阅读代码本身来确定编程语言。对于我的生活,我不记得博客或gem的名称。谷歌搜索“ruby编程语言猜测”及其变体也无济于事。有人碰巧知道相关gem的名称吗? 最佳答案 是这个吗:http://github.com/chrislo/sourceclassifier/tree/master 关于ruby-寻找通过阅读代码确定编程语言的rubygem?,我们在StackOverflow上找到一个类似的问题:

  7. Ruby 文件 IO 定界符? - 2

    我正在尝试解析一个文本文件,该文件每行包含可变数量的单词和数字,如下所示:foo4.500bar3.001.33foobar如何读取由空格而不是换行符分隔的文件?有什么方法可以设置File("file.txt").foreach方法以使用空格而不是换行符作为分隔符? 最佳答案 接受的答案将slurp文件,这可能是大文本文件的问题。更好的解决方案是IO.foreach.它是惯用的,将按字符流式传输文件:File.foreach(filename,""){|string|putsstring}包含“thisisanexample”结果的

  8. ruby - Net::HTTP 获取源代码和状态 - 2

    我目前正在使用以下方法获取页面的源代码:Net::HTTP.get(URI.parse(page.url))我还想获取HTTP状态,而无需发出第二个请求。有没有办法用另一种方法做到这一点?我一直在查看文档,但似乎找不到我要找的东西。 最佳答案 在我看来,除非您需要一些真正的低级访问或控制,否则最好使用Ruby的内置Open::URI模块:require'open-uri'io=open('http://www.example.org/')#=>#body=io.read[0,50]#=>"["200","OK"]io.base_ur

  9. ruby - nanoc 和多种布局 - 2

    是否可以为特定(或所有)项目使用多个布局?例如,我有几个项目,我想对其应用两种不同的布局。一个是绿色的,一个是蓝色的(但是)。我想将它们编译到我的输出目录中的两个不同文件夹中(例如v1和v2)。我一直在玩弄规则和编译block,但我不知道这是怎么回事。因为,每个项目在编译过程中只编译一次,我不能告诉nanoc第一次用layout1编译,第二次用layout2编译。我试过这样的东西,但它导致输出文件损坏。compile'*'doifitem.binary?#don’tfilterbinaryitemselsefilter:erblayout'layout1'layout'layout2'

  10. 程序员如何提高代码能力? - 2

    前言作为一名程序员,自己的本质工作就是做程序开发,那么程序开发的时候最直接的体现就是代码,检验一个程序员技术水平的一个核心环节就是开发时候的代码能力。众所周知,程序开发的水平提升是一个循序渐进的过程,每一位程序员都是从“菜鸟”变成“大神”的,所以程序员在程序开发过程中的代码能力也是根据平时开发中的业务实践来积累和提升的。提高代码能力核心要素程序员要想提高自身代码能力,尤其是新晋程序员的代码能力有很大的提升空间的时候,需要针对性的去提高自己的代码能力。提高代码能力其实有几个比较关键的点,只要把握住这些方面,就能很好的、快速的提高自己的一部分代码能力。1、多去阅读开源项目,如有机会可以亲自参与开源

随机推荐