自动布局、屏幕旋转和 UIView 动画

2023-12-03

我遇到了一个 UIView 问题,我将其添加到屏幕底部,并在按下按钮时将其动画化以填充大部分屏幕。视图将按预期上下动画并旋转。如果我尝试在横向时制作动画,它会中断并给出错误消息:

*** Assertion failure in -[UIScrollView _edgeExpressionInContainer:vertical:max:], /SourceCache/UIKit_Sim/UIKit-2380.17/NSLayoutConstraint_UIKitAdditions.m:2174
*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Autolayout doesn't support crossing rotational bounds transforms with edge layout constraints, such as right, left, top, bottom. The offending view is: <UIView: 0x9199340; frame = (20 0; 748 1024); transform = [0, -1, 1, 0, 0, 0]; autoresize = RM+BM; layer = <CALayer: 0x91993d0>>'

令人反感的观点是 self.view。

我如何创建 UIView:

[self.myContentView addSubview:subBar.filterListView];

[self.myContentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[filterListView]|"
                                                                           options:0
                                                                           metrics:nil
                                                                             views:@{@"filterListView": subBar.filterListView}]];

subBar.filterListView.bottomConstraint = [NSLayoutConstraint constraintWithItem:subBar.filterListView
                                                                      attribute:NSLayoutAttributeBottom
                                                                      relatedBy:NSLayoutRelationEqual
                                                                         toItem:self.mapView
                                                                      attribute:NSLayoutAttributeBottom
                                                                     multiplier:1
                                                                       constant:0];

subBar.filterListView.topConstraint = [NSLayoutConstraint constraintWithItem:subBar.filterListView
                                                                   attribute:NSLayoutAttributeTop
                                                                   relatedBy:NSLayoutRelationEqual
                                                                      toItem:self.mapView
                                                                   attribute:NSLayoutAttributeBottom
                                                                  multiplier:1
                                                                    constant:0];

[self.myContentView addConstraint:subBar.filterListView.bottomConstraint];
[self.myContentView addConstraint:subBar.filterListView.topConstraint];

self.myContentView 是一个占据整个 self.view 的 UIView:

[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[contentView]|"
                                                                  options:0
                                                                  metrics:nil
                                                                    views:NSDictionaryOfVariableBindings(contentView)]];

[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[contentView]|"
                                                                         options:0
                                                                         metrics:nil
                                                                           views:NSDictionaryOfVariableBindings(contentView)]];    

为了对 subBar.filterListView 进行动画处理,我删除了顶部和底部约束,重新分配它们,添加它们,然后进行动画处理:

[self.myContentView removeConstraint:view.topConstraint];
[self.myContentView removeConstraint:view.bottomConstraint];

view.topConstraint = [NSLayoutConstraint constraintWithItem:view
                                                  attribute:NSLayoutAttributeTop
                                                  relatedBy:NSLayoutRelationEqual
                                                     toItem:self.topToolBar
                                                  attribute:NSLayoutAttributeBottom
                                                 multiplier:1
                                                   constant:0];

view.bottomConstraint.constant -= SUB_BAR_SIZE.height;

[self.myContentView addConstraint:view.topConstraint];
[self.myContentView addConstraint:view.bottomConstraint];

[self.myContentView setNeedsUpdateConstraints];

[UIView animateWithDuration:.25 animations:^{
    [self.myContentView layoutIfNeeded];
}];

旋转时代码是否会与顶部和底部混淆?它认为肖像的顶部是风景的左侧吗?


好的,我找到了解决方案。它并没有解决上述问题,而是找到了另一种方法来解决它。

我将约束更改为视觉格式语言 (VFL) 方法:

subBar.filterListView.verticalConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"V:[filtersSubBar][filterListView(0)]" options:0
                                                                                    metrics:nil
                                                                                      views:@{@"filterListView": subBar.filterListView, @"filtersSubBar" : subBar.filtersSubBar}];

我认为问题在于使用属性NSLayoutAttributeTop, NSLayoutAttributeRight等导致问题的原因。

自动布局无法处理旋转并尝试使用NSLayoutAttributeTop当它应该被更改为NSLayoutAttributeRight来表达新的方向。我想我们可以手动更改约束。

VFL 似乎以不同的方式处理它并且不使用属性?

感觉这要么是 iOS 的一个 bug,要么只是一个缺点。

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

自动布局、屏幕旋转和 UIView 动画 的相关文章

随机推荐

  • 将附加组件集成到自定义 Firefox 版本中

    我正在制作一个自定义的 Firefox 版本 我想将我的附加组件 附加 SDK 集成到构建中 我更喜欢这样做 而不是直接与 Firefox 代码集成 实现这一目标的最佳方法是什么 我正在考虑将其放入 浏览器 扩展 目录 如果这是一个好主意
  • 查找大写字符然后添加空格

    我购买了 SQL World 城市 州数据库 在州数据库中 州名称被集中在一起 示例 北卡罗来纳州 或 南卡罗来纳州 SQL中有没有办法循环查找大写字符并添加空格 这样 北卡罗来纳州 就变成了 北卡罗来纳州 创建这个函数 if object
  • java 8 中箭头运算符内部如何工作? [复制]

    这个问题在这里已经有答案了 我知道箭头的左侧有参数 箭头的右侧是参数所在的函数 但是 我想知道java 8如何映射左侧和右侧并转换为函数 那里会发生什么 我在哪里可以找到信息 当你有一个 gt javac 编译器添加一个包含代码内容的静态方
  • 如何在 React 中下载图像?

    我想尝试通过单击按钮来下载图像 但是当我单击按钮时 它不是下载图像 而是直接打开图像 但是我想下载图片 那么在React中如何下载图片呢 a href https timesofindia indiatimes com thumb msid
  • 如何使用 python pyhs2 连接到 hive?

    我正在尝试使用访问配置单元pyhs2 我尝试了以下代码 示例 py import pyhs2 conn pyhs2 connect host localhost port 10000 authMechanism None user None
  • Shibboleth 可以与 Windows Azure 访问控制服务集成吗?

    我们的两个高等教育客户使用 Shibboleth 进行 SSO 我对 Shib 的经验为零 并且没有可供测试的实例 最终 我们希望将 Shib SSO 与 Windows Azure MVC Web 角色中的这些客户端集成 所以我的问题是
  • 检测数组 vb.net 2005 上重复数字的最快方法

    我有这个项目 让用户输入从 1 到 50 的 5 个不同的数字 但我想在保存到数据库之前验证它 我将是 5 个唯一的数字 最好和最快的方法是什么 您可以使用哈希集 T 的 检查这个 Dim numbers As IEnumerable Of
  • 如何更改面板滚动条的背景颜色?

    因此 我正在为我的应用程序制作一个深色模式选项 并且我希望滚动条的背景颜色也改变颜色 这样它就不会看起来不合适 我试图寻找解决方案 但到目前为止我只找到了控件中滚动条的代码 但我需要更改面板的滚动条 有人知道该怎么做吗 预先非常感谢 当我开
  • 如何将 SecureString 转换为 System.String?

    关于通过创建 System String 来取消 SecureString 的所有保留意见aside 如何做呢 如何将普通的 System Security SecureString 转换为 System String 我相信许多熟悉 Se
  • Cassandra 与日志记录活动

    我将卡桑德拉与昆德拉一起使用 我的问题很简单 有什么方法可以记录所有查询 请求到 Cassandra 吗 我想知道服务器站点上到底发生了什么 Regards Tom 为 org apache cassandra thrift Cassand
  • 在服务中处理 $http 响应

    我最近发布了我面临的问题的详细描述here在这样 因为我无法发送实际的 http请求时 我使用超时来模拟异步行为 在 Gloopy 的帮助下 从我的模型到视图的数据绑定工作正常 现在 当我使用 http代替 timeout 本地测试 我可以
  • 我的“重复排列”代码中的递归调用是否会累积而堵塞 RAM?

    一些背景知识 我是一名业余程序员 几个月前 在学习了一段时间的 Mathematica 编程 我的第一语言 之后 我利用业余时间学习了 Haskell 我目前正在阅读 Will Kurt 所著的第二本 Haskell 书 但要让自己对 Ha
  • 音频无法在 Android 中播放。 android.content.res.Resources$NotFoundException:资源 ID #0x0

    我正在尝试在 Android 中播放音频文件 但它似乎崩溃并给出了ResourcesNotFoundException 音频文件保存在 res 内的 raw 文件夹中 音频文件的名称由随机生成的数字确定 然后将其连接到 音频 int res
  • 如何关闭 iframe?

    打开 iframe 后 有时需要关闭它 到目前为止 我只是将 iframe 从其父节点中删除 从而将其与 DOM 断开 但是 我发现这并不会立即结束 iframe 的生命 并且它的 javascript 代码仍然可以回调到父窗口 而父窗口不
  • Spring 反应式的 Spring Security 会话超时

    我有一个集成了 Spring Security 的反应式应用程序 它是由 springinitializr 创建的 主要包含 3 个包 spring boot spring security 和 webflux 我试图通过以下配置来配置会话
  • gPRC(protobuf)可以返回空消息吗?

    我们的客户端调用 gRPC 服务器 理想情况下它应该返回 MyMessage 响应对象 但是这个MyMessage对象可以为null吗 或者gRPC不能返回null对象 因为如果它是null grpc会抛出异常 回答你的问题 检查这些谷歌文
  • 内联函数有什么好处?

    在 C 中使用内联函数的优点 缺点是什么 我发现它只会提高编译器输出的代码的性能 但是有了当今优化的编译器 快速的 CPU 巨大的内存等 不像 1980 年 优点 通过在需要的地方内联代码 您的程序将在函数调用和返回部分花费更少的时间 它应
  • Swift 数组中最大值及其索引的高效算法

    我编写了一个 Swift 算法 用于查找 Swift 数组中的最大值及其索引 这是受到 Matlab 和 Octave 中 max m 函数的启发 这里的专家能否提出一种提高该算法速度的方法 我的意思是它是否可以做得更快 或者您认为这对于大
  • 设置网页宽度

    我是网页设计新手 我想设置页面宽度 使其在 800x600 分辨率的屏幕上显示良好 我通常使用表格 但我在某处读到过度使用表格会降低网站的性能 我还可以使用什么其他东西以及如何设置宽度 使用 DIV 而不是表看起来像这样 div style
  • 自动布局、屏幕旋转和 UIView 动画

    我遇到了一个 UIView 问题 我将其添加到屏幕底部 并在按下按钮时将其动画化以填充大部分屏幕 视图将按预期上下动画并旋转 如果我尝试在横向时制作动画 它会中断并给出错误消息 Assertion failure in UIScrollVi