自动布局 iOS 11 工具栏 UIBarButtonItem 与 customView

2023-12-10

最近,在我们的项目中,使用自定义视图的 UIBarButtonItem 出现了问题。在 iOS 11 之前,我们通过灵活的间距项进行布局。这不再起作用,所以什么也没有显示。

因为我在这里没有找到真正为我解决问题的答案,所以我研究了它并提出了一个我想与您分享的(诚然有点hacky)解决方案。

也许它可以帮助你或者你有一些反馈。这是混合 objc 和 swift 代码,希望你不介意。


如WWDC视频所示将您的应用程序更新为 iOS 11:

“所以现在在 iOS 11 中,UI 工具栏和 UI 导航栏都具有 对自动布局的复杂而明确的支持。”

所以我的第一步是对自定义视图本身使用布局约束:

    UIBarButtonItem *barButtonItem = [[UIBarButtonItem alloc] initWithCustomView:customView];
    [barButtonItem.customView.widthAnchor constraintEqualToConstant:375].active = YES;
    [barButtonItem.customView.heightAnchor constraintEqualToConstant:44].active = YES;

这导致工具栏显示自定义视图。问题是,视野的左右有一个间隙。你可以看到它。 于是我查看了View Hierarchy Debugging工具,发现工具栏上有一个UIToolbarContentView。这个 contentView 有正确的尺寸(尤其是宽度),我开始想知道。我查看了 contentView 唯一的子视图,它是一个 UIBarButtonStackView。这个 stackView 在宽度方面以某种方式限制了我的 customView 。

所以它看起来像这样:

contentView |<-fullWidth-------->|
stackView     |<-reducedWidth->|
customView    |<-reducedWidth->|

让我好奇的是,customView 不是 stackView 的子视图。这可能是 UIBarButtonItem 中包含 customView 的结果。对 customView 的任何(附加)约束保持不变(或崩溃,因为视图不在同一层次结构中)。

了解所有这些后,我向 UIToolbar 添加了一个扩展:

extension UIToolbar {
    private var contentView: UIView? {
        return subviews.find { (view) -> Bool in
            let viewDescription = String(describing: type(of: view))
            return viewDescription.contains("ContentView")
        }
    }

    private var stackView: UIView? {
        return contentView?.subviews.find { (view) -> Bool in
            let viewDescription = String(describing: type(of: view))
            return viewDescription.contains("ButtonBarStackView")
        }
    }

   func fitContentViewToToolbar() {
        guard let stackView = stackView, let contentView = contentView else { return }
        stackView.leadingAnchor.constraint(equalTo: contentView.leadingAnchor).isActive = true
        stackView.trailingAnchor.constraint(equalTo: contentView.trailingAnchor).isActive = true
        stackView.widthAnchor.constraint(equalTo: contentView.widthAnchor).isActive = true

    }
}

那么它的作用是这样的: 它通过将名称与“ContentView”进行比较来从子视图中获取 contentView,并通过对 contentView 执行相同的操作来获取 stackView。 大概是一个return subviews.first也会做同样的事情,但我想确定一下。

然后设置布局约束,瞧:它在全宽度下工作。

我希望有人会觉得这很有用。如果有评论:我非常愿意接受对此的反馈。也许我错过了一些东西,而这一切根本没有必要。

编辑:“查找”功能是序列的扩展。它执行“filter.first”,如下所示:

extension Sequence {
    func find(_ isIncluded: (Self.Element) throws -> Bool) rethrows -> Self.Element? {
        return try filter(isIncluded).first
}

}

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

自动布局 iOS 11 工具栏 UIBarButtonItem 与 customView 的相关文章

  • 为什么在尝试编译此代码时会收到错误“错误:未知类型名称'虚拟'”?

    Code struct IRenderingEngine virtual void Initialize int width int height 0 virtual void Render const 0 virtual void Upd
  • NSCFData isRessized 崩溃?

    我目前在控制台中收到此崩溃日志 2011 08 23 19 18 40 064 App 1697 707 NSCFData isResizable unrecognized selector sent to instance 0x11f1c
  • 无法从 iOS 中的框架访问 .nib(XIB) 文件

    我已经从现有的代码库中创建了一个框架 并尝试在新的代码库中使用它 这很好用 但是当我尝试访问属于我的框架包的一部分的 nib 文件时 我的应用程序崩溃了 这是我用来访问视图控制器 XIB 文件的代码 testViewController c
  • UITableView:显示 tableFooterView 时运行代码?

    我正在使用 UIView表页脚视图 http developer apple com library ios documentation uikit reference UITableView Class Reference Referen
  • NSString stringWithContentsOfFile 失败,错误代码似乎错误

    我正在尝试将文件加载到字符串中 这是我正在使用的代码 NSError error nil NSString fullPath NSBundle mainBundle pathForResource filename ofType html
  • 如何开始复杂级别的跨平台移动应用开发? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • .showsPhysics 内存泄漏

    我最近花了 5 个小时尝试调试 Spritekit 应用程序中的内存泄漏 应用程序启动后 我注意到内存使用量略有上升 我花了 5 个小时中的 3 个小时挖掘参考资料 了解强与弱的关系ARC https developer apple com
  • iOS、通用链接、Swift。 continueUserActivity 未调用

    我正在为我们的 iOS 应用程序实现通用链接 这是我的一小部分 AppDelegate private func application application UIApplication openURL url URL sourceApp
  • 从 UIPickerView 的选定行设置 UIButton 的标题

    详细场景是这样的 我使用循环创建 10 个按钮并设置 0 9 的标签 点击每个按钮时 我将调用 UIPickerView 在其中加载来自不同数组的数据 到这里我就得到了预期的结果 但我希望 pickerView 中选定的行应设置为相应按钮的
  • React-native-vision-camera无法访问后面的普通摄像头

    我正在尝试在 iPhone 11 Pro 上使用 普通 相机 我使用反应本机视觉相机 当我运行这段代码时 const devices useCameraDevices const deviceBack devices back consol
  • 将自定义数据包含到 iOS 故障转储中

    你好 堆栈溢出 有一个简单的问题要问您 当我的应用程序在用户的设备上崩溃时 是否可以将自定义错误数据嵌入到自动生成的 iOS 故障转储中 例如 我的 SQlite 数据库由于某种原因无法运行 例如 数据库文件已损坏 我无法从这个错误中恢复
  • 每 24 小时触发一次方法

    我正在尝试每天在给定时间触发一个方法 我尝试了一些方法 但我无法真正使其发挥作用 任何意见 将不胜感激 此外 如果无论应用程序是否打开它都会触发 那就更理想了 这可能吗 UI本地通知 http developer apple com lib
  • CALayer边框奇怪问题

    我正在向 CALayer 添加边框 但有一些奇怪的行为 在我应用的边框之后出现模糊边框 参见屏幕截图 这是我的代码 void configureLabel self hidden YES self textAlignment NSTextA
  • ios swift parse:从 3 个类收集数据

    我有这样的结构 User CardSet 带有指向 User objectId 的指针 user 和 col name 带有点 cards 的卡片到 Card Set objectId 和列 name 我想选择所有卡数据 包括当前用户的卡集
  • Swift,以编程方式更改 UICollectionViewCell 和 UILabel(单元格内)的宽度

    我已将单元格 UICollectionViewCell 的宽度设置为等于 UICollectionView 的宽度 并且我尝试对该单元格中包含的 UILabel 执行完全相同的操作 我认为下面的代码准确地解释了我想要实现的目标 所以我在这里
  • AVAssetExportSession 无法导出从 iCloud 下载的视频

    我正在尝试创建从用户相册中选择的视频的缩小版本 输出的最大尺寸为 720p 因此 在检索视频时 我使用 mediumQualityFormat as the deliveryMode 如果用户设备中不存在原始视频或其中等质量版本 这会导致
  • UIViewControllerAnimatedTransitioning:旋转更改后黑屏片段

    我已经创建了一个视图控制器转换 只要我不更改设备方向 一切都正常 图 1 显示了应有的屏幕 然后我切换到下一个视图控制器 在其中更改方向 现在我回到第一个视图控制器并再次切换方向 然后我得到的结果如图 2 所示 出现黑色边框 请不要介意屏幕
  • iOS 7 上 Safari 浏览器的用户代理

    我只想在带有 Safari 浏览器的 iPhone 和 iPod 中打开我的网站 对于 Chrome Dolphin 等任何其他浏览器 它不应该打开 但目前我从几乎所有设备获得相同的用户代理 对于Safari User Agent Stri
  • iOS:如何知道 reloadData() 已完成其任务?

    我想滚动到给定索引 self boldRowPath 但是当我调试时scrollToRow之前执行reloadData 如何知道reloadData已完成 func getAllTimeEvent self arrAllTimeEvent
  • 隐藏选项卡栏项目并对齐其他选项卡项目

    在我的应用程序中 我有 4 个选项卡栏项目 我正在 XIB 文件中添加这 4 个选项卡栏项目 最初我必须显示 3 个选项卡栏项目 同步后我必须在我的应用程序中显示第 4 个选项卡栏项目 因此 为此 我使用以下代码隐藏第四个选项卡栏项目 se

随机推荐

  • Selenium——如何等待页面完全加载[重复]

    这个问题在这里已经有答案了 我正在尝试使用 Java 和 Selenium WebDriver 自动化一些测试用例 我有以下场景 有一个名为 产品 的页面 当我点击 查看详细信息 链接时 在 产品 页面中 会出现一个包含商品详细信息的弹出窗
  • 当组合根位于客户端时如何在 WCF 中注入依赖项

    在开始之前 我必须说 我可能咬得太多 但我正处于绝望的学习狂潮中 我需要很多帮助 我正在编写一个练习 从两本书中获取样本 1 Net 中的依赖注入 作者 Mark Seemann2 Brian Egan 和 Steve Valenzuela
  • React-router transitionTo 不是一个函数

    import React from react import Router Link Navigation from react router export default class ResourceCard extends React
  • 子图之间的箭头

    我决定玩玩this示例代码一点 我能够弄清楚如何在两个子图之间绘制一条直线 即使该线位于其中一个子图的边界之外 import matplotlib pyplot as plt import matplotlib as mpl import
  • 在 Python 中通过管道传输到脚本时无法启动交互式程序

    我有一个 python 脚本需要调用定义的 EDITOR or VISUAL 当单独调用 Python 脚本时 我可以启动 EDITOR没有任何问题 但是当我将某些内容传输到 Python 脚本时 EDITOR无法启动 现在 我正在使用 n
  • 在expect中使用argc和argv解析命令行

    我有一个期望例程 它需要生成一个进程并将我传递给期望例程的命令行参数传递给生成的进程 我的期望例程有以下几行 spawn myProcess argv 当我调用我的期望例程时 我从命令行调用它 如下所示 expect myRoutine
  • 停止并重新启动 VGG-16 上的训练

    我正在使用预训练的 VGG 16 模型进行图像分类 我添加了自定义最后一层 因为我的分类类数量为 10 我正在对模型进行 200 轮训练 我的问题是 如果我随机停止 通过关闭 python 窗口 在某个时期的训练 有什么办法吗 假设时期没有
  • SSRS:我可以知道用户是否在多值参数中选择了“ALL”吗?

    客户希望我重复报告页眉中的参数值 但是 如果他们只是在多值参数上选择 全选 则他们希望列出文本 任意 例如 一个参数具有一组固定的 9 个值 我将文本框的表达式硬编码为 Room Size iif Parameters pRoomCap C
  • Python Numpy Loadtxt - 转换 unix 时间戳

    我有一个包含许多行数据的文本文件 每行中的第一条数据是一个 unix 时间戳 例如1436472000 我在用numpy loadtxt在转换器的参数中 我想指定它将时间戳转换为 numpy 理解的日期时间 我知道这需要在0 在大括号中 但
  • 将运算符作为参数传递给 C 中的函数

    我想将大于 gt 和小于 你可以用宏做一些可怕的事情 但一般来说 不 你不能这样做 您通常接受两个参数函数并调用它 并且该函数可以使用 gt or lt 酌情参见the sort docs举个例子 也就是说 它不是超级高效 通过指针调用函数
  • Spring-Jersey 应用程序的 JerseyTest 中的资源模型验证失败

    我有一个带注释的 Spring Jersey 应用程序 我正在尝试使用以下命令为我的控制器设置单元测试JerseyTest 我在运行测试时遇到以下错误 但我无法弄清楚 我错过了什么 SEVERE Following issues have
  • Android:图像保存到位置

    我正在努力显示一组图像 然后如果用户愿意 可以将图像保存到 SD 卡上 我需要帮助将它们保存到外部存储 有人可以帮我解决这个问题吗 网格视图 public void onCreate Bundle savedInstanceState su
  • 对 3 维数组中每行的深度值求和

    我需要计算每个第一级元素的深层元素的总和 3 级数组示例 1 gt A gt AA gt 3 AB gt 5 B gt BA gt 2 2 gt C gt CA gt 4 D gt DA gt 1 DB gt 2 3 gt E gt EA
  • 在 WCF 中获取“在线”消息大小

    当我对 WCF 进行 SOAP 或 REST 调用时 我希望任一端 客户端和服务器 上的通道堆栈记录接收到的数据的在线大小 所以我猜我需要向两侧的通道堆栈添加自定义行为 也就是说 在服务器端 我将记录接收到的 IP 标头通告的大小 累计 直
  • AVX2 编译的程序仍然可以使用支持 AVX-512 的 CPU 的 32 个寄存器吗?

    假设以 AVX2 为目标的编译和 C 内在函数 如果我编写一个 nbody 算法 每个 body body 计算使用 17 个寄存器 第 17 个寄存器可以间接 寄存器重命名硬件 或直接 Visual Studio 编译器 gcc 编译器
  • 通过 PersonID 获取每个 Person 的 SUM

    我的表中有以下列 SCORE ID SCORE PERSON ID SCORE VOTE SCORE PERSON ID 是一个变量 我需要对每个 SCORE PERSON ID 的 SCORE VOTE 求和 你能建议一个好方法吗 你需要
  • 类型错误参数过多

    运行此代码时 出现错误 第 8 行参数过多 我不确定如何修复它 Defining a function to raise the first to the power of the second def power value x y re
  • Mongodb 错误:子进程失败,退出,错误号 51

    mongodb 由于某种原因关闭了 系统异常关闭 当我尝试重新启动 mongodb 使用 mongod f usr local mongodb etc mongo conf got about to fork child process w
  • Java 游戏 - ClassCastException

    我正在开发一个简单的 java 游戏 我的滚动条引发异常 滚动条应该是一个 gameslider 线程 Thread 3 中的异常 java lang ClassCastException sun java2d NullSurfaceDat
  • 自动布局 iOS 11 工具栏 UIBarButtonItem 与 customView

    最近 在我们的项目中 使用自定义视图的 UIBarButtonItem 出现了问题 在 iOS 11 之前 我们通过灵活的间距项进行布局 这不再起作用 所以什么也没有显示 因为我在这里没有找到真正为我解决问题的答案 所以我研究了它并提出了一