UINavigationBar 旋转和自动布局

2023-12-07

关于通过将 UINavigationBar 插入场景来设计自己的视图控制器,我发现了许多关于旋转设备时框架高度如何不改变的问题的参考。这与 Apple 在其导航控制器中使用 UINavigationBar 的方式形成鲜明对比,其中导航栏的高度在旋转时会发生变化。

虽然确实有一些建议确实展示了如何更改高度以与 Apple 的做法保持一致,但所有答案都没有解决与场景中其他视图的正确关系。特别是,在构建使用自动布局的场景时,您永远不必调整框架 - 自动布局应该通过您定义的约束来为您处理这个问题。

例如,一个建议是为了这样做:

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration 
{
    [self.navigationBar performSelector:@selector(sizeToFit) withObject:nil afterDelay:(0.5f * duration)];
}

虽然这会改变大小,但与其他视图的关系不再正确。尽管上面示例中的海报确实提供了一种解决方案来调整关系,但这更多的是一种硬编码方法,苹果可能不会建议,即不是一种自动布局友好的解决方案。

通过实验,我注意到,当旋转设备时,intrinsicContentSize 实际上确实发生了正确的变化,但框架却没有。注意到这一点后,我尝试了以下操作:

- (void)viewDidLayoutSubviews
{
    [super viewDidLayoutSubviews];

    CGRect frame = self.navigationBar.frame;
    frame.size.height = self.navigationBar.intrinsicContentSize.height;
    self.navigationBar.frame = frame;
}

虽然这确实正确地改变了大小,就像上面的例子一样,但它也导致了不正确的视图关系。

具体来说,我的横向设备:

enter image description here

然后切换到纵向:

enter image description here

有谁知道苹果希望我们如何使用约束来解决 UINavigationBar 布局?


只需在按钮和顶部布局指南之间设置垂直间距约束即可。这可以在 IB 中通过将控件从按钮拖动到导航栏底部来完成。非常简单,无需任何代码。

编辑后:如果您添加独立的导航栏,则确实需要一些代码(据我所知)来获得使用导航控制器自动获得的行为。我这样做的方法是添加一个导航栏,并为其提供对超级视图侧面的约束、对顶部布局指南的垂直约束以及 44 点的固定高度。我针对此约束创建了一个 IBOutlet(在下面的代码中称为 heightCon)。该按钮具有 centerX 约束和导航栏的垂直间距约束。

- (void)viewWillLayoutSubviews {
    self.heightCon.constant = (self.view.bounds.size.height > self.view.bounds.size.width)? 44 : 32;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

UINavigationBar 旋转和自动布局 的相关文章

  • 为什么这个 CLLocationCooperative2D 变量不可分配?

    我有一个地理编码器方法 我希望它返回为我生成的 CLLocationCooperative2D CLLocationCoordinate2D geocode CLGeocoder geocoder CLGeocoder alloc init
  • “弱链接”框架是什么意思?

    在 Xcode 中 我可以将框架设置为 可选 而不是 必需 这意味着该框架是弱链接的 这是否意味着框架仅在导入到某个地方时才包含在捆绑包中 我想弱链接一些使用的调试框架私有API 并且我不希望它们出现在 App Store 版本中 重要的提
  • 连接 Realm 和 SwiftBond 的最佳方式是什么

    I love Realm http realm io我爱Bond https github com SwiftBond Bond 两者都让应用程序创建成为一种乐趣 所以我想知道连接 Realm 和 Bond 的最佳方式是什么 在 Realm
  • Apache Cordova 工具 (VS2015):将自定义条目添加到 iOS 的 *info.plist

    我正在 VS2015 上使用 Apache Cordova 工具来开发一个项目 我需要在 info plist 文件中设置一些附加选项 以便暂时解锁 HTTP Web 访问 NsAppTransportSecurity 并启用地理定位服务在
  • 资源分叉、Finder 信息或类似的碎片不允许 Xcode 8 错误? [复制]

    这个问题在这里已经有答案了 我在 Xcode 8 中运行旧项目时收到错误 在 Xcode 7 中运行的同一项目完全流量较少 我还应用以下链接中提到的解决方案 macOS Sierra Xcode 8 中的代码签名错误 不允许资源分叉 Fin
  • 断点在 xcode pod 文件中不起作用

    我有一个 xcode 项目 其中包含一些可可豆荚文件 当我在 cocoa pod 文件中放置断点时 调试器不会在这些断点处停止 为什么 有人对此有什么想法吗 我关注了 UdaySingh 的评论 它起作用了 我不确定他为什么没有发布答案 但
  • 以编程方式在 Swift 中实现尾随和前导约束 (NSLayoutConstraints)

    我正在从 xib 添加一个视图到我的 ViewController 中 然后我将其限制真正适合它 override func viewDidAppear animated Bool super viewDidAppear animated
  • CocoaPods 找不到 pod“Firebase/CoreOnly”的兼容版本

    我已经将我的 flutter 包更新到最新版本 现在 IOS 不再工作了 当我尝试更新 Pod 时 它显示此错误 CocoaPods could not find compatible versions for pod Firebase C
  • 无效图像路径 - 在路径中找不到图像。 CFBundleIcons Xcode 5

    我正在尝试使用 Xcode 5 0 更新我的 iOS 7 应用程序 一切正常 但是当我存档然后验证时 我收到以下消息 图像路径无效 在键下引用的路径中找不到图像CFBundleIcons APP ICON 57 我尝试删除并添加图像 并手动
  • 使用 javascript 加载不同的 CSS 样式表

    我需要使用 javascript 根据正在传递的 URL 变量加载不同的样式表 场景是这样的 我们需要使用一个 CSS 样式表和一个不同的样式表来维护一个移动网站 当通过 iOS 应用程序中加载的 Web 视图访问该页面时 该样式表将用于设
  • 如何在 AVCaptureVideoPreviewLayer 上添加叠加层?

    我正在使用 Swift 构建一个 iOS 应用程序 它需要二维码扫描仪功能 我已经使用 AVFoundation 实现了 QR 码扫描仪 现在我的捕获屏幕看起来与视频录制屏幕相同 即AVCaptureVideoPreviewLayer显示相
  • 裁剪图像和中心

    在 Swift 中如何裁剪图像并将其放在中心 我已经裁剪了图像 但想将其放在中间 ImgView image OrigImage var masklayer CAShapeLayer masklayer frame ImgView fram
  • 致命错误:在解包可选值时意外发现 nil (lldb)

    override func prepareForSegue segue UIStoryboardSegue sender AnyObject if segue identifier showLocalMenuDetail if let in
  • iOS Facebook SDK 通过图搜索来搜索用户

    我是图形搜索新手 我想搜索具有电子邮件地址的用户 那可能吗 现在 我只知道如何使用他们的名字进行搜索 如下所示 https graph facebook com search q chandler de angelis type user
  • ios - 安排无限数量的本地通知

    我有一个应用程序 允许用户创建重复事件 每一个事件在一天中的特定时间可能有也可能没有提醒 警报 如果有的话 应用程序会发送一个本地通知在一天中的那个时候 事件存储在CoreData Event name Go to London date
  • 从 UIImageView 的中心对 UIImageView 进行动画处理

    我有一个UIImageView应该从动画size 0 0 gt 93 75 我有以下内容 UIView animateWithDuration 0 5 delay 0 options UIViewAnimationOptionTransit
  • TDD VS BDD:REST 服务

    我对 TDD 与 BDD 很困惑 TDD 和 BDD 在以下各点上有何不同 开发 先测试用例 再开发 RestService HTTP 不进行休息调用 如果是这样 a 我们是否使用模拟对象仅返回硬编码的 json b 如何处理 REST 调
  • YouTube 嵌入 AirPlay UIWebView

    我正在开发一个视频应用程序 其中包含来自不同来源的大量视频 应用程序中的选项之一必须是通过电视上的 Airplay 播放视频 为了在我的应用程序中显示 YouTube 视频 我使用 YTPlayerView 它是 YouTube API 的
  • 禁用应用程序的启动图像

    我想从我的应用程序禁用启动图像 我已经有一个启动屏幕 因此在应用程序启动时首先显示启动图像 然后显示启动屏幕 我想禁用启动图像并仅在应用程序启动时显示启动屏幕 请帮忙 提前致谢 你不能 因为它会一直保持到你的程序被加载并从applicati
  • AVAssetWriter 不适用于音频

    我正在尝试让音频与 iOS 应用程序的视频一起使用 视频很好 文件中没有录制任何音频 我的 iPhone 扬声器可以工作 这是初始化设置 session AVCaptureSession alloc init menu gt session

随机推荐

  • 使用 DataOutputStream 将消息写入客户端套接字到服务器套接字仅在关闭客户端套接字后发送,为什么?

    我用 Java 进行了 Socket Client 编程 我正在使用 DataOutputStream 将消息发送到 Server Socket 有时 在 DataOutputstream 上写入的消息不会发送到 ServerSocket
  • 仅允许 oracle 数据库登录特定应用程序?

    我们希望仅通过我们自己的应用程序允许用户进行数据库访问 Oracle 让我们将其称为 ourTool exe 安装在用户计算机本地 目前 用户每次启动 ourTool 时都必须提供用户名 密码 提供的密码密码被解密 我们使用用户名 解密密码
  • 如何在数据库列中存储多个项目?

    在我的项目中 员工插入一个餐桌号 选择客户订购的所有商品并将其保存到数据库中 我有三张桌子 Employee empId firstname lastname Orders orderId tableNum empIDFK itemIDFK
  • 批处理脚本从文件中删除 BOM (ï¿)

    我创建了一个批处理脚本 用于将 SQL 文件从文件夹复制到一个大 SQL 脚本中 问题是当我运行这个 SQL 脚本时 它出现错误 附近的语法不正确 我将一个 SQL 脚本复制到 Notepad 中并将编码设置为 ANSI 我在发生错误的行上
  • 如何在PyGame中拖动多个图像?

    import pygame from pygame locals import pygame display init screen pygame display set mode 1143 677 img pygame image loa
  • 获取网页内容(通过AJAX调用加载)

    我是一个爬行初学者 我需要从链接中获取帖子和评论 我想自动化这个过程 我考虑过使用 webcrawler 和 jsoup 来实现此目的 但被告知 webcrawler 主要用于具有更大深度的网站 页面示例 Jive 社区网站 对于此页面 当
  • 无法使用 SCVMM powershell 模块提取虚拟网络名称

    我尝试使用 powershell 提取虚拟机的虚拟网络信息 我尝试使用正则表达式 但对于具有超过 1 个 NIC 的虚拟机 我无法看到输出 下面是我需要的输出 PS C gt get vm sql IAN01 Host select Exp
  • Swift:手势识别器无法识别选择器发送到实例

    我正在尝试在 XCode 中制作手势识别器 以便我可以点击 MKMapView 并执行一些操作 但是 每当我长按地图时 我都会收到 发送到实例的无法识别的选择器 这是我在 viewDidLoad 中的代码 let gestureRecogn
  • 在 JavaScript 中更改输入值并提交表单

    我目前正在制作一个基本表格 当您点击提交按钮时 它应该首先更改字段的值 然后像平常一样提交表单 一切看起来有点像这样
  • Jetty SslConnector 已弃用的方法

    SslConnector java最新的 Jetty 中的界面已更改7 3 1 v20110307 几乎所有方法都已被标记为已弃用 而没有提及要使用的替换接口或方法 我已经检查过码头用户 and 码头开发邮件列表中的信息没有运气 有谁知道将
  • Zend_Form:带有复选框的 HTML 表中的数据库记录

    我正在尝试将 HTML 多列表添加到 Zend Form 该表将由数据库中的数据填充 并且每行前面应有一个复选框 如下面的 ASCII 所示 Column 1 Column 2 Column 3 x Row 1 Some data more
  • 如何将 Drawable 资源写入文件?

    我需要出口一些Drawable资源到文件 例如 我有一个函数返回给我一个Drawable目的 我想把它写到一个文件中 sdcard drawable newfile png 我该怎么做 尽管这里的最佳答案有一个很好的方法 这只是链接 以下是
  • 向 Netbeans 应用程序的基于 Inno 的设置添加其他文件

    我在用Inno 5 设置安装程序位于Netbeans将我的 Java Swing 应用程序构建为可执行设置文件 它创建一个包含所有 lib 所有 jar 文件 和 app jar 的 app exe 安装文件 因此 一旦用户执行 app e
  • 纠结于如何使用 api 响应进行调用以从不同的链接检索响应

    我目前在使用 PokeApi 时遇到问题 我有代码可以让我查看 Pokemon 的名称以及 Pokemon 的其他 JSON 的 URL 但我不太确定如何检索该数据 这是我到目前为止所拥有的 这是 api 的链接 让 pokeList im
  • 使用 Gmail SMTP 发送电子邮件时出错

    我正在尝试使用 Gmail SMTP 发送电子邮件PHPmailer 问题是我有这个错误 SMTP gt ERROR Failed to connect to server php network getaddresses getaddri
  • 使用正则表达式以任意顺序排列多个单词[重复]

    这个问题在这里已经有答案了 正如标题所说 我需要在句子中找到两个特定的单词 但它们可以是任何顺序和任何大小写 我该如何使用正则表达式来做到这一点 例如 我需要提取单词test and long从下面的句子中是否该词test首先出现或long
  • Linq2SQL:更新对象未在数据上下文中创建

    通常 当您在 linq2sql 中更新对象时 您会从数据上下文中获取该对象并使用相同的数据上下文来保存该对象 对吧 更新尚未由用于执行保存操作的数据上下文检索的对象的最佳方法是什么 即我使用Florinefx在flex和asp net之间传
  • 错误代码 1005,SQL 状态 HY000:无法创建表 errno:150

    我正在尝试创建一个表 但是当我的 netbeans 出错数据库的第一个表时 脚本就会失败 如何解决这个问题 CREATE TABLE filmy Film Id int NOT NULL Nazwa varchar 250 Adres va
  • HttpModule 仅在特定 MVC 路由上

    我有一个习惯IHttpModule我只想在特定路线上工作 例如 http example com HandleAzureTask 我希望这个模块只能在 HandleAzureTask route 由于这不是控制器 我无法真正设置 Autho
  • UINavigationBar 旋转和自动布局

    关于通过将 UINavigationBar 插入场景来设计自己的视图控制器 我发现了许多关于旋转设备时框架高度如何不改变的问题的参考 这与 Apple 在其导航控制器中使用 UINavigationBar 的方式形成鲜明对比 其中导航栏的高