自动布局问题:iOS 7 与 iOS8

2024-01-11

我正在尝试创建一个可折叠的工具栏,其工作方式如下(在 iOS 7 中运行 - 出于可视化目的,颜色丑陋等):

However, when I run the code in iOS 8, this is what happens: enter image description here I have set up a constraint system that is based on the following: collapsible toolbar diagram

A centering view(未显示)将工具栏保持在屏幕中间。 Asizing view调整为折叠工具栏。这sizing view固定在右侧centering view(via a trailing约束)。 Acontainer view保存工具栏的实际内容。它固定在右侧sizing view(也通过trailing约束)。 各种各样的content views包含在container view。他们没有任何限制。系统应用的默认约束应该是宽度、高度、顶部、左侧,这确保它们在视图中保持相对位置。container view.

工具栏的折叠是通过以下方式实现的:

- (IBAction)showLess:(id)sender {
    self.widthConstraint.constant = 50; // adjust this number for collapse / expand
    [UIView animateWithDuration:0.3 animations:^{
        [self.centeringView layoutIfNeeded]; // trigger animation
    }];
}

它调整了宽度sizing view.

Problem:iOS 8 的表现就好像我已经锚定了内容视图,但事实并非如此。

我衷心感谢:

  • 解释为什么 iOS 8 对给定的(相当简单的)约束有如此完全不同的解释。
  • 关于如何在 iOS 8 中获得预期行为的指针

源代码 https://www.dropbox.com/s/4j7ut7mns5wm6bn/AutoLayoutIssueStackOverFlow.zip?dl=0可用的here https://www.dropbox.com/s/4j7ut7mns5wm6bn/AutoLayoutIssueStackOverFlow.zip?dl=0(适用于 iOS 8 的更新版本)。

UPDATE:Stack-overflow 的答案解决了这个问题。基本上,正确答案是this https://stackoverflow.com/a/26066992/228342,但它被很好地总结为这个答案 https://stackoverflow.com/a/26070049/228342。 iOS7 和 iOS8 之间的区别不在于约束的解释方式,而在于更新命令通过视图层次结构向下传递的方式。 当我首先在 iOS 7 中实现该行为时,我注意到动画只有在调用时才能正常工作layoutIfNeeded在父视图上sizing view(即在centering view)。在 iOS 7 中,这显然会自动沿着视图层次结构向下流动。在 iOS 8 中,情况并非如此。您必须手动使约束已更改的视图无效setNeedsLayout,然后使用更新布局layoutIfNeeded。我在更新代码中的解决方案如下所示:

- (IBAction)showLess:(id)sender {
    self.widthConstraint.constant = 50;
    [self.sizingView setNeedsLayout]; // *** THIS LINE IS NECESSARY TO MAKE THINGS WORK IN iOS 8
    [UIView animateWithDuration:0.3 animations:^{
        [self.sizingView layoutIfNeeded]; // trigger animation
    }];
}

我希望这可以帮助其他也陷入此向前兼容性问题的人。


Stack-overflow 的答案解决了这个问题。基本上,正确答案是this https://stackoverflow.com/a/26066992/228342,但它被很好地总结为这个答案 https://stackoverflow.com/a/26070049/228342。 iOS7 和 iOS8 之间的区别不在于约束的解释方式,而在于更新命令通过视图层次结构向下传递的方式。当我首先在 iOS 7 中实现该行为时,我注意到动画只有在调用时才能正常工作layoutIfNeeded在父视图上sizing view(即在centering view)。在 iOS 7 中,这显然会自动沿着视图层次结构向下流动。在 iOS 8 中,这是not这种情况:您必须手动使约束已更改的视图无效setNeedsLayout,然后使用更新布局layoutIfNeeded。我在更新代码中的解决方案如下所示:

- (IBAction)showLess:(id)sender {
    self.widthConstraint.constant = 50;
    [self.sizingView setNeedsLayout]; // *** THIS LINE IS NECESSARY TO MAKE THINGS WORK IN iOS 8
    [UIView animateWithDuration:0.3 animations:^{
        [self.sizingView layoutIfNeeded]; // trigger animation
    }];
}

我已经更新了问题以包含答案,但为了回复@unmircea,我也发布了一个单独的答案。

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

自动布局问题:iOS 7 与 iOS8 的相关文章

  • NSDateFormatter:根据 currentLocale 的日期,不包含年份

    这不会太难吧 我想显示不带年份的日期 例如 8 月 2 日 美国 或 02 08 德国 它也必须适用于许多其他语言环境 到目前为止 我唯一的想法是对年份进行正常格式 然后从生成的字符串中删除年份部分 我认为你需要看一下 NSString d
  • 我如何从 iPhone 设备获取电子邮件历史记录..?

    friends 我想从我的 iPhone 访问电子邮件历史记录 并且还希望在收到新邮件时收到通知 如果可能的话 请向我提供源代码片段 Thanks 简而言之 使用任何已记录的 API 都是不可能的
  • 选择 UITableViewCell 时 UIView 背景颜色消失

    我在界面生成器中构建了一个简单的 tableViewCell 它包含一个包含图像的 UIView 现在 当我选择单元格时 会显示默认的蓝色选择背景 但 UIView 的背景颜色消失了 我的 UITableViewCell 的实现文件没有做任
  • 如何在 iOS 中将 Firebase 对象持久保存到磁盘?

    看起来Firebase http www firebase comiOS 实现不支持客户端模型的离线缓存 这在实践中意味着 对于需要身份验证的 Firebase 应用程序 您需要首先进行身份验证并等待 Firebase 完成登录 检查用户身
  • 如何在应用程序项目中使用 Cocoa Touch 框架

    我熟悉构建单个 iOS 应用程序 但我坚持使用 Cocoa Touch 框架向多个应用程序共享通用代码 问题 框架的头文件不可见 无法链接到消费应用程序项目 我做了什么 1 我创建了一个名为 libTestFramework 的项目 Coc
  • 如何区分 iTunes Connect / Apple TestFlight 上的 STAGE 和 PRODUCTION 版本?

    阶段构建与阶段服务器的对话 阶段服务器与生产服务器尽可能相同 以用于测试目的 生产构建与生产服务器的通信 生产服务器存储真实的关键数据 这些构建本质上是针对同一应用程序的 但是 iTunes Connect 界面将向您显示以下内容 即构建由
  • 保存来自 TrueDepth 相机的深度图像

    我正在尝试保存 iPhone X TrueDepth 相机的深度图像 使用AVCam照片滤镜 https developer apple com library content samplecode AVCamPhotoFilter Lis
  • 使用 Quartz 创建 PDF 注释 (iOS)

    有人设法使用 Quartz 在现有 PDF 中编写自定义注释吗 我已经使用 CGPDFDocumentRef 等渲染了 PDF 现在工作正常 我成功地阅读了 Annots 字典 if CGPDFDictionaryGetArray page
  • 在 ios 版 Ionic 中接收 URL

    我正在使用离子框架 我正在尝试设置一种从另一个应用程序接收网址的方法 就像 您在浏览器中 单击共享 然后将链接发送到另一个应用程序 我的应用程序 我找到了这个cordova https stackoverflow com questions
  • 是否可以使用UIPageControl来控制UITableView的移动?

    从Apple示例 PageControl 中我们可以知道UIPageControl可以用来控制scrollview中页面的移动 由于 UITableView 是 UIScrollView 的子类 我想使用 UIPageControl 来控制
  • 在情节提要中将 Segue 拖至自身

    我想将一个 Segue 从我的视图控制器拖到其自身 所以我可以推送该特定视图控制器的 无限 实例 我知道如何在代码中执行此操作 即以编程方式实例化视图控制器 但是 我想尽可能使用 segues 我发现了一些在故事板中进行自我延续的 技巧 但
  • NSURLCache 不缓存

    我正在使用 Xcode 6 1 6A1030 iOS7 和 iOS8 模拟器 NSURLCache 似乎没有缓存任何东西 我使用 Cache Control 标头 我的服务器返回带有 max age 6000 的 Cache Control
  • 使用 BGTaskScheduler 进行后台获取与调试模拟完美配合,但在实践中却不起作用

    我在 appDelegate 的 didFinishLaunchingWithOptions 中注册后台获取任务 BGTaskScheduler shared register forTaskWithIdentifier Backgroun
  • Swift:协议、结构、类

    我开始学习 Swift 语言 但在理解协议 结构和类方面遇到了困难 我来自 Android 方面的编程 所以我相信 Swift 协议基本上是 Java 接口 其中每一个的正确用例是什么 这些类比并不 完全 正确 但这就是我所理解的要点 是的
  • UILabel 中的文本未垂直居中

    我使用以下代码创建了一个标签 func setupValueLabel valueLabel numberOfLines 1 valueLabel font UIFont name Avenir Black size 50 valueLab
  • cameraOverlayView 防止使用 allowedEditing 进行编辑

    在我的应用程序中 使用以下行在拍摄照片后对其进行编辑 移动和缩放 效果很好 imagePicker setAllowsEditing YES 但如果我还使用cameraOverlayView 则编辑模式将不再起作用 屏幕出现 但平移和捏合手
  • 在 UITableView 的部分标题文本下方添加一些边距

    我已经设计了标题文本的样式 func tableView tableView UITableView cellForRowAtIndexPath indexPath NSIndexPath gt UITableViewCell let ce
  • UILabel UILongPressGestureRecognizer 不起作用?

    我怎样才能得到UILongPressGestureRecognizer在 uilabel 当我实现以下代码时 它不会调用该函数 那么请告诉我我做错了什么 UILongPressGestureRecognizer longPress UILo
  • 领域:结果 和列表

    是否可以转换Results
  • 如何观察UserDefaults的变化?

    我有一个 ObservedObject在我看来 struct HomeView View ObservedObject var station Station var body some View Text self station sta

随机推荐