UINavigationController:每次转换后显示具有不同方向的嵌入式视图控制器?

2023-12-10

这是 StackOverflow 上的一个常见问题,但其他解决方案均无效。许多也是几年前写的。

以下是一些考虑的帖子:

  • UINavigationController 内的 viewController 是否可以有不同的方向?

  • UINavigationController 中仅支持一个视图的横向

  • UINavigationController 内的 viewController 是否可以有不同的方向?

  • 为什么使用 UINavigationController 时不能强制横向?

  • 如何在 iOS 8 中强制视图控制器方向?

我们在 UINavigationController 中嵌入了几个视图控制器:A、B、C、D。

A、B 使用肖像。

C、D使用风景。

A 是根控制器。

假设 B 被推到 A 上。这是可行的,因为 B 是纵向的。然而,当 C 被推到 B 上时,屏幕不会旋转,因为正如类文档所述:

通常,系统仅在根视图上调用此方法 窗口的控制器或用于填充的视图控制器 整个屏幕;子视图控制器使用窗口的一部分 由其父视图控制器为它们提供,不再 直接参与有关支持哪些轮换的决策。

如此压倒一切supportedInterfaceOrientations自定义 UINavigationController 内部没有帮助,因为它不会在嵌入式控制器内的转换上进行咨询。

实际上,我们需要一种方法来强制在转换时改变方向,但似乎没有支持的方法。

以下是我们重写 UINavigationController 的方法(扩展现在仅用于调试目的,因为显然扩展不应该用于重写):

extension UINavigationController {
    override open var shouldAutorotate: Bool {
        return true
    }

    override open var supportedInterfaceOrientations : UIInterfaceOrientationMask {
        return visibleViewController?.supportedInterfaceOrientations ?? UIInterfaceOrientationMask.landscapeRight
    }
}

在嵌入式视图控制器中,我们尝试像这样设置方向:

override var shouldAutorotate: Bool {
    return true
}


override var preferredInterfaceOrientationForPresentation : UIInterfaceOrientation {
    return UIInterfaceOrientation.landscapeRight
}


override var supportedInterfaceOrientations : UIInterfaceOrientationMask {
    return UIInterfaceOrientationMask.landscapeRight
}

总而言之,目标是:

1) 显示嵌入在 UINavigationController 中的具有不同方向的视图控制器。

2) VC 转换应产生适当的方向变化(例如,从 C->B 弹出应产生纵向,从 D->C 弹出应产生横向,从 B->C 推送应产生横向,从 A->B 推送应产生横向肖像)。

如果可以强制 UINavigationController 进入某个方向(使用公开支持的方法),一种可能的解决方案可能是在显示新视图控制器时强制该方向。但这似乎也是不可能的。

建议?


Step 1

子类UINavigationController.

class LandscapeNavigationController: UINavigationController {
    public var vertical: Bool = true

    override var shouldAutorotate: Bool {
        get { return true }}

    override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
        get { return (vertical) ? .portrait : .landscapeLeft }}

    override var preferredInterfaceOrientationForPresentation: UIInterfaceOrientation {
        get { return (vertical) ? .portrait : .landscapeLeft }}
}

Step 2

使用不同的UINavigationController对于不同的方向。是的,正在推新UINavigationController在上一个之上UINavigationController本质上是模态的,但过渡看起来不错。

Storyboard with 2 nav controllers

为了更加方便,请使用用户定义的运行时属性来控制方向LandscapeNavigationController.

Runtime attributes

Step 3

Add a pop method to handle Back buttons on the now modal UIViewController.

@IBAction func doBack(_ sender: UIBarButtonItem) {
    if let navigationController = navigationController {
        navigationController.dismiss(animated: true, completion: {
        })
    }
}

行动中

请注意如何Top and Bottom视图中的标签C已正确布置。

Animation
↻ replay animation


► 在以下位置找到此解决方案GitHub以及其他详细信息快速食谱.

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

UINavigationController:每次转换后显示具有不同方向的嵌入式视图控制器? 的相关文章

  • SwiftUI 检测用户何时截取屏幕截图或屏幕录制

    On UIViewController我们可以轻松地将观察者添加到控制器 喜欢 class ViewController UIViewController override func viewDidLoad super viewDidLoa
  • sizeToFit 运行异常

    我有一段代码 每次发生后端数据库更改时都会执行 本质上我在父视图中有一个标签 标签由许多状态消息之一更新 每个状态消息位于不同的行上 并以换行符 n 结尾 每条状态消息只能在一行上 并且不能过多 我遇到的问题是 当视图首次重新加载时 一切正
  • UILongPressGestureRecognizer 不起作用,但将其替换为 UITapGestureRecognizer 效果很好。为什么?

    我有一个UIImageView with a UILongPressGestureRecognizer无论我如何配置手势识别器 似乎都不会检测到长按手势 但是 如果我把它换成UITapGestureRecognizer that工作得很好
  • 如何为所有整数类型创建通用整数到十六进制函数?

    我想为所有整数类型创建一个整数到十六进制函数 对于1字节的Int8 它返回两个字母 例如0A 对于2字节的Int16 它返回四个字母 例如0A0B 对于8字节的Int64 它返回16个字母 例如0102030405060708 func h
  • “EXC_BAD_ACCESS”与“分段错误”。两者实际上相同吗?

    在我的前几个虚拟应用程序 用于学习时练习 中 我遇到了很多EXC BAD ACCESS 这以某种方式告诉我错误访问是 您正在触摸 访问一个不应该的对象 因为它尚未分配或释放 或者只是您无权访问它 查看此示例代码 该代码存在访问错误问题 因为
  • UIAlertAction 处理程序在延迟后运行

    我正在尝试将 UIAlertViews 更改为 UIAlertControllers 我为此设置了这个操作 UIAlertAction undoStopAction UIAlertAction actionWithTitle Undo St
  • 如何计算CLLocationDistance的中心坐标

    我想计算我的位置和一些注释之间的中心点 到目前为止我已经这样做了 CLLocation myLoc self locMgr location MKPointAnnotation middleAnnotation locationV anno
  • 在 Safari 中快速打开链接

    我目前正在我的应用程序中打开链接WebView 但我正在寻找一个打开链接的选项Safari反而 它不是 融入 Swift 但你可以使用标准UIKit方法来做到这一点 看看 UIApplication 的openUrl https devel
  • 如何设置 UINavigationbar 的渐变颜色?

    我想设置UINavigationbar backgroundColor渐变颜色 我想通过颜色数组设置它以创建渐变 理想情况下 作为内部的可访问方法UINavigationBar将其颜色更改为此渐变 有什么建议么 除了手动设置图像作为导航栏的
  • iOS5 和 Facebook API

    我想将我的应用程序与 Facebook 集成并从 github 下载 Facebook ios sdk 但是 该 sdk 适用于 Xcode 4 0 代码库 我正在使用 Xcode 4 2 for iOS 5 beta 5 应用程序 是否有
  • 增量后清除推送通知徽章

    我正在研究 iPhone 中的推送通知 当我收到推送通知时 它在我的应用程序图标上显示 1 下次显示 2 3 4 如果我打开应用程序 它是 0 下次它应该是 1 2 3 4 但它显示最后一个数字和 1 我想在打开应用程序后重置推送通知徽章
  • UIView 周围的虚线边框

    如何在周围添加虚线边框UIView 像这样的东西 如果您喜欢子层 还有另一种方法 在您的自定义视图的 init 中 输入以下内容 border 是 ivar border CAShapeLayer layer border strokeCo
  • 视频中的图像/文本叠加 swift

    我正在使用 swift 在视频中使用图像叠加来实现水印效果 我正在使用AVFoundation为此 但不知何故我没有成功 以下是我的覆盖图像 文本的代码 let path NSBundle mainBundle pathForResourc
  • 带有图像的 UITableView 滚动非常慢[重复]

    这个问题在这里已经有答案了 可能的重复 带图像的表格视图 加载和滚动缓慢 https stackoverflow com questions 4071497 table view with images slow load and scro
  • 如何在多个视图中显示相同的导航栏?

    我可以为一个视图重现以下导航栏 但是 一旦我单击按钮后移至下一个视图 我就会丢失最右边的两个图标 搜索 个人资料 据我所知 从故事板设置导航项目通常是按视图进行的 我可以为每个视图复制这些项目 但我想知道是否有更好的方法来完成一次 是否有教
  • 应用程序仅启用纵向,但 UIImagePickerController 在 iOS6 中旋转

    请注意 下面的答案 不适用于 iOS6 所以我仍然需要答案 我的应用程序仅启用纵向模式 但是 如果我将 UIImagePickerController 作为子视图嵌入其中 并旋转设备 则顶部和底部栏将保持在同一位置 但 UIImagePic
  • 共享扩展程序未出现在能够在 iPhone 上共享照片的应用程序列表中

    我正在尝试创建一个共享应用程序扩展 并按照以下来源的教程进行操作 http www technetexperts com mobile share extension in ios application overview with exa
  • iOS 11 中的密码自动填充快速输入栏

    iOS 11 中引入了一项新功能 应用程序密码自动填充 此功能允许用户直接从键盘快速输入栏使用其应用程序中保存的密码 https techcrunch com 2017 06 08 ios 11s new password autofill
  • iOS 11 特定设置部分的 URL 方案停止工作

    我的应用程序使用 URL 方案将用户直接带到 设置 常规 关于 部分 以下 URL 在 10 3 x 中工作正常 应用程序首选项 根 常规 路径 关于 然而 这个 URL 方案在 iOS 11 GM 版本中不再有效 它仅启动 设置 应用程序
  • Swift:UICollectionViewCell didSelectItemAtIndexPath 更改背景颜色

    我可以轻松更改单元格的背景颜色CellForItemAtIndexPath method func collectionView collectionView UICollectionView cellForItemAtIndexPath

随机推荐

  • 无法上传 apk:READ_EXTERNAL_STORAGE 具有不同的 maxSdkVersions

    这是我第一次在这里提问 不管怎样 正如标题所说 我正在尝试将我的应用程序推向市场 当我尝试上传签名的 apk 时 出现错误 上传失败具有不同 maxSdkVersions 的重复权限声明 android permission READ EX
  • Facebook App Invites iOS v4 SDK 错误

    我已经仔细检查了所有内容 根据我的理解 这就是我需要做的 self inviteContent FBSDKAppInviteContent alloc initWithAppLinkURL NSURL URLWithString http
  • Asterisk-如何使用 ChanSpy() 或任何替代方法“耳语”音乐? [关闭]

    Closed 这个问题需要多问focused 目前不接受答案 我打算向其中一位会议参与者 耳语 音乐 消息文件 而不让其他会议参与者听到此消息 我浏览了 Asterisk Cookbook 中的音频操作章节 http ofps oreill
  • 如何在 Objective-C iphone sdk 中迭代嵌套字典

    您好 我有一个 json 字符串 已通过 JSON 框架转换为字典 我需要提取其内容 我怎样才能迭代到嵌套字典 我已经有了这段代码 可以让我查看字典 NSDictionary results responseString JSONValue
  • 如何使用 nav.popTo() (ionic 2)?

    我正在使用导航控制器 要返回 我可以使用 nav pop 但是如果我需要转到其他页面 不是最后一个页面 如何使用 nav popTo constructor nav NavController this nav nav this nav p
  • Numpy int 位长度

    我想找到以二进制表示无符号 numpy 整数 或整数数组中的每个元素 所需的位数 就像 python 的int bit length 确实如此 但 numpy 似乎没有等效的功能 例如 gt gt gt int 0b1000 bit len
  • 如何防止 Dockerfile 缓存 git clone

    我有一个 Dockerfile 试图将 Web 应用程序打包并部署到容器中 应用程序的代码在 Docker 镜像构建期间从 git 存储库获取 这是 Dockerfile 快照 RUN git clone depth 1 git repos
  • 在 openpyxl 中格式化图表数据标签

    我正在使用 Python 3 6 3 使用 openpyxl 2 4 9 编写一些 Excel 工作表 在图表数据上获取数据标签并不明显 但当我尝试格式化所述数据标签时 事情开始变得糟糕 我想要做的是改变他们的位置并改变他们的轮换 有人有什
  • PDO Mysql 语法错误 1064 [已关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 我运行以下代码 conn new PDO pdo at
  • PyQt 中的 QKeyPress 事件

    我的软件有问题 在我的钢琴软件中 如果我一直按下键盘上的某个键 那么它就会发出该特定键的多个重复的相同音调 但实际上我需要一个单一的音调 直到释放该特定的键 我提供了检测 keyPress 事件并调用相应方法的代码的一部分 那么我应该对我的
  • 用于 HTTPS 抓取的 Jsoup Cookie

    我正在尝试使用此网站在欢迎页面上收集我的用户名来学习 Jsoup 和 Android 使用以下代码 Connection Response res Jsoup connect http www mikeportnoy com forum l
  • 如何将 Spinner 默认值设置为 null?

    我正在尝试加载一个没有选定值的微调器 一旦用户选择了一个值 它就会将他们带到另一个页面 事实证明这是一个问题 因为目前页面只是在用户做出选择之前立即加载 我的 spinner 类的设置方式与 Google 的相同 http develope
  • 使用 document.body.innerHTML.replace 有多安全?

    正在运行类似的东西 document body innerHTML document body innerHTML replace 旧值 新值 危险的 我担心某些浏览器可能会搞乱整个页面 而且由于这是 JS 代码 这些代码将被放置在我无法控
  • 如何获取当前 .exe 的哈希值?

    SOLVED 我复制了该文件并在该副本上运行了哈希器 我需要我的应用程序来查找 EXE 当前的 MD5 我可以获取任何文件的MD5 但是 无论我做什么 我都无法获得 FileStream 来读取打开的 EXE 我尝试使用 FileOptio
  • 修改 google.translate.TranslateElement 结果中的元素

    我正在尝试将非常方便的 Google Translate 翻译元素嵌入到网页中 这非常简单并且效果很好 但我需要更改在生成的 HTML 中显示的默认文本 在使用过许多 Google API 和 js 库后 我认为这不会有问题 因为它几乎肯定
  • 创建 HuggingFace 数据集来训练 BIO 标记器

    我有一个字典列表 sentences text I live in Madrid labels O O O B LOC text Peter lives in Spain labels B PER O O B LOC text He lik
  • 使用处理程序从服务更新活动

    我想改变 a 的状态ToggleButton in my Activity当事件发生在service 任何人都可以帮我实现这个使用Handler 我的意思是我应该在哪里编写代码来创建处理程序以及如何从服务触发它 我读过类似的帖子 但是它们对
  • 地点选择器自动关闭

    我正在 android 中制作一个简单的地点选择器程序 问题是当我单击按钮时 地点选择器打开并在 2 3 秒后自动关闭 请帮忙 MainActivity java package com example akshay myapplicati
  • Android 发布高分辨率图像内存不足

    各位开发人员大家好 我正忙着让 android 从应用程序上传图像 我也让它工作了 代码如下 但是 当我发送大图像 10 兆像素 时 我的应用程序因内存不足异常而崩溃 解决方案是使用压缩 但如果我想发送全尺寸图像怎么办 我想也许与流有关 但
  • UINavigationController:每次转换后显示具有不同方向的嵌入式视图控制器?

    这是 StackOverflow 上的一个常见问题 但其他解决方案均无效 许多也是几年前写的 以下是一些考虑的帖子 UINavigationController 内的 viewController 是否可以有不同的方向 UINavigati