自动布局 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 的相关文章

  • 在 iPhone 上搜索 PDF

    经过两天尝试使用 Quartz 从 PDF 中读取注释后 我成功做到了并且发布我的代码 https stackoverflow com questions 4080373 get pdf hyperlinks on ios with qua
  • 应用程序:didReceiveRemoteNotification:未调用 fetchCompletionHandler

    出现了这个功能application didReceiveRemoteNotification fetchCompletionHandler当应用程序被强制退出时不会被调用 我的印象是 无论应用程序处于什么状态 该函数都会被调用 但似乎只有
  • 在 iOS 中,如何以编程方式填写 pdf 表单字段?

    我需要获取一个现有的 pdf 文件 并以编程方式填写带有文本的表单字段列表 然后保存 pdf 而不将其显示给用户 例如 如果 pdf 文件包含名为 LastName 和 FirstName 的字段 我想将 FirstName 的值设置为 L
  • 如何从 UI 测试访问 App Delegate?

    我想访问特定的属性router在 UI 测试期间从启动的应用程序的应用程序委托中获取 但我不知道这是否可行 我努力了 let appDelegate UIApplication sharedApplication delegate as A
  • 如何从TableViewCell上的自定义CollectionViewCell推送VC?

    我有一个tableView和细胞 在细胞上我有一个collectionView并在其上显示一些内容 我想发送一个有关选择的链接indexPath 我想从自定义中推送 呈现我的视图CollectionViewCell这是在TableViewC
  • 自定义信息窗口上的按钮未接收 ios 中的操作

    我在 iOS 应用程序中使用 Google 地图 并实现了一个自定义信息窗口来显示标记的标题 现在 我在该自定义信息窗口上添加了一个按钮 但我的问题是按钮操作方法没有被调用 自定义信息窗口 h import
  • UICollectionView 设置列数

    我刚刚开始学习 UICollectionViews 我想知道是否有人知道如何指定集合视图中的列数 默认设置为 3 iPhone 肖像 我查看了文档 似乎找不到简洁的答案 对于 Swift 5 和 iOS 12 3 您可以使用4 以下实现为了
  • iOS FacebookSDK + 解析 SDK + GoogleMaps SDK

    我搜索了很多 然后我意识到 ObjC标记那个GoogleMapSDK需要 但不能很好地配合ParseSDK and FacebookSDK 所以我阅读了所有的 stackoverflow 答案并尝试解决我的问题 问题还没有解决 我执行的步骤
  • iOS 何时清理本地应用程序 ./tmp 目录?

    iOS什么时候清理本地应用程序 tmp目录 请注意 这不是一个骗局这个问题 https stackoverflow com questions 3593900 iphone storage in tmp directory 我问的是应用程序
  • 单击按钮时退出应用程序 - iOS [重复]

    这个问题在这里已经有答案了 可能的重复 iOS 4 0 中退出应用程序 https stackoverflow com questions 3097244 exit application in ios 4 0 我有一个 AlertView
  • iPhone 的翻译器?

    我对为 iPhone 制作一个解释器很感兴趣 这将是一个实验性的想法 但可能会很棒 我喜欢让我自 己的语言适合移动计算和数学的想法 我查阅了很多资料 发现有关 iPhone 上的口译员的信息很复杂 苹果会允许什么 我见过这个应用程序 这是一
  • gestureRecognizer shouldReceiveTouch 持续存在于已释放的视图中导致崩溃

    我有一个相当简单的 UITableView 它在堆栈上推送一个新视图 新视图有一个像这样初始化的gestureRecognizer synthesize swipeGestureLeft void viewDidLoad swipeGest
  • 按升序对 NSDictionary 进行排序

    我正在尝试排序NSDictionary按升序排列 我正在使用这段代码 NSDictionary valDict self mGetDataDict key rowKey for NSString valueKey in valDict al
  • iOS绘图3D图形库[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在搜索一个可以帮助我绘制 3D 图表的库 我想要类似的东西这一页 http www math uri edu bkaskosz fla
  • 找不到 Cocoa/Cocoa.h 文件

    我在用XMPPFramework在我的应用程序中 我已将 Cocoa Cocoa h 导入到我的 m 文件中 但是当我构建项目时Xcode显示错误 错误 未找到 Cocoa Cocoa h 文件 我该如何解决这个错误 如果您正在为 iOS
  • 如何从第二个视图弹回到根视图?

    我使用 2 将 3 个视图 根视图 第 1 个视图 第 2 个视图 连接在一起modal在 Apple Watch 故事板中继续 1 在根视图中 按下 保存 按钮后 将显示第一个模态视图 2 在第一模态视图中 一旦按下 500 按钮 将显示
  • iOS:如何创建核心数据库的备份副本?以及如何导出/导入该副本?

    我想为我的应用程序的用户提供创建核心数据数据库备份的可能性 特别是在他切换到新设备等情况下 我该怎么做呢 特别是如何重新导入该文件 我的意思是 假设他制作了数据库的备份副本 然后更改了大量内容并想要重置为以前保存的备份副本 我该怎么做呢 T
  • 获取所有ios应用程序的全局列表[重复]

    这个问题在这里已经有答案了 我想对苹果应用商店进行一些全球统计 一个瓶颈是至少获取所有当前活动应用程序的 ID 这 9 位数字 有谁知道如何获取 iOS 应用商店中当前活动应用程序的所有 id 的完整列表 更好的是特定类别的所有 ID 例如
  • 具有隐式授权的 OAuth 应用程序中的客户端模拟

    来自 OAuth 草案 隐式section https datatracker ietf org doc html draft ietf oauth v2 31 section 1 3 2 在隐式授权流程期间发出访问令牌时 授权服务器不对客
  • iOS 中是否需要 Google App Indexing SDK 才能使用 Google DeepLinking?

    我想用谷歌应用程序索引与我的网页和 iOS 应用程序 我支持通用链接 or 深层链接用谷歌术语 与苹果Search并相应地设置我的网页 From 谷歌文档 https developers google com app indexing i

随机推荐

  • 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 之前 我们通过灵活的间距项进行布局 这不再起作用 所以什么也没有显示 因为我在这里没有找到真正为我解决问题的答案 所以我研究了它并提出了一