Tag: 视图控制器

如何在iOS中修复错误的状态栏方向

当我第一次启动iOS时,当时是iOS 8,我有一个错误花了整整一天的时间才弄清楚。 问题是,尽管我已经将主ViewController锁定为纵向模式,但状态栏始终会定向为设备定向。 这就是为什么我在GitHub上启动notes项目的原因,该项目详细说明了我所面临的问题。 ViewController已锁定为人像,但设备旋转时状态栏也会旋转·问题2• 问题rootViewController被锁定为纵向。 当我旋转时,视图控制器为纵向,但状态为… github.com 现在是iOS 12,令我惊讶的是人们仍然遇到这个问题。 今天,我将在iOS 12项目中修订此问题并使用Swift。 支持的界面方向 大多数应用仅支持纵向模式,横向或横向有1或2个屏幕可用于图像查看或视频播放器。 因此,我们通常声明纵向,横向左和横向右。 从iOS 7开始,应用具有简单的设计,着重于内容。 UIViewController在外观规范中被赋予了更大的作用。 假设我们有一个MainViewController作为rootViewController ,我们希望将其锁定为纵向模式。 @UIApplicationMain 类AppDelegate:UIResponder,UIApplicationDelegate { var window:UIWindow? func application(_ application:UIApplication,didFinishLaunchingWithOptions launchOptions:[UIApplication.LaunchOptionsKey:Any]?)->布尔{ 窗口= UIWindow(框架:UIScreen.main.bounds) window?.rootViewController = MainViewController() 窗口?.makeKeyAndVisible() 返回真 } } 我们可以在Info.plist指定一个名为UIViewControllerBasedStatusBarAppearance的属性,以断言我们希望UIViewController动态控制状态栏的外观。 一个布尔值,指示状态栏外观是否基于当前视图控制器的首选样式。 首先在Info.plist中进行声明 UIViewControllerBasedStatusBarAppearance 然后在MainViewController ,将状态栏锁定为纵向 导入UIKit 类MainViewController:UIViewController { 让标签= UILabel() 覆盖func viewDidLoad(){ super.viewDidLoad() view.backgroundColor = .yellow […]

处理视图控制器状态

视图控制器除其他功能外,还负责在用户输入以及与基础数据进行交互之后更改视图状态。 您可以将视图状态视为输入和输出对。 每当用户选择一行时,视图控制器就会启用特定按钮。 当API开始获取新数据时,视图控制器将显示活动指示器。 映射这些状态的一种方法是使用布尔值,也称为标志 。 您有一个标志来说明当前状态是否为错误。 另一个告诉您内容是否正在加载。 彼此之间还有另外一种情况。 这种方法存在潜在的问题,您将看到其中的一些问题。 本文还显示了一种更好的状态处理方式。 每个州是一个不同的标志 检查以下代码以处理公共视图控制器的状态: var isLoading = false var产品:[产品] = [] var错误:错误? 在这种情况下,您有三种可能的状态: 装货 内容加载 错误 考虑所有可能发生的相互作用。 这里是其中的一些: 视图控制器使用API​​来获取内容。 然后将isLoading设置为true 。 并且由于它现在处于加载状态,因此它显示了活动指示器。 它接收一些产品作为响应,并在表格视图中显示内容。 但是,如果响应是错误,则显示“重试”消息。 用户拉表视图以刷新数据。 在这种情况下,视图控制器将再次调用API。 这是一个容易出错的代码,因为每当发生这些交互之一时,您都必须更新所有标志。 而且,即使您忘记了一个,您也可能陷入不确定的状态并产生错误。 接口上的状态通常是互斥的。 这就是为什么用标志处理状态会带来歧义的原因。 映射状态的更好方法是使用枚举。 用枚举处理状态 Swift中的枚举是强大的值类型,它们不仅可以定义一组相关的事物,还可以为每种不同的情况指定关联的值。 检查多选题应用的以下枚举映射状态: 枚举状态{ 案例未回答 案例回答(选项) 案例确认(选项) } 这显示了一组明确定义的状态。 视图控制器没有很多标志,而是具有如下状态变量: 类MCQViewController:UIViewController { var state:State = […]

自定义ViewControllers演示

您可以在我的博客上阅读此文章 我们的应用程序中发生的大多数屏幕转换都属于以下类别: 模态演示 在导航堆栈上推送/弹出 尽管这足以完成我们需要做的大多数工作,但在某些极端情况下,我们可能希望采用一种“原生”方式少而定制化的解决方案。 对我们来说幸运的是,UIKit为这项工作提供了正确的工具。 与往常一样,我们不必离官方文档(View Controller编程指南)太远,更详细地说,我们正在寻找创建自定义演示文稿。 本指南在文档档案库中,并带有Objective-C示例,但它们仍然是您可以在其中找到的最佳内容。 阅读指南将揭示一些有趣的观点。 当将要显示视图控制器时,UIKit将执行以下操作: 调用过渡委托的presentationControllerForPresentedViewController:presentingViewController:sourceViewController:方法以检索您的自定义表示控制器。 向过渡委托者询问动画师和交互式动画师对象(如果有)。 调用演示文稿控制器的presentationTransitionWillBegin方法。 执行过渡动画。 在动画过程中,UIKit调用演示文稿控制器的containerViewWillLayoutSubviews和containerViewDidLayoutSubviews方法,以便您可以根据需要调整自定义视图的布局。 过渡动画结束时,调用presentationTransitionDidEnd :方法。 因此,我们有几点可以操作和更改动画和演示样式。 展示横幅 假设我们要将文件上传到我们的服务器,并且我们希望在操作完成后通知用户: func upload(file: File, using uploader: FileUploader) { uploader.send(file, then: { let banner = Banner(message: “File successfully uploaded ✅”) self.present(banner, animated: true) }) } 现在这将以模态形式全屏显示我们的横幅,但是我们可能希望使其看起来像屏幕底部的横幅,以减少入侵。 我们将专注于自定义演示,同时使用底部的默认过渡。 首先,让我们创建我们的自定义表示控制器: class BannerPresentationController: UIPresentationController { override var frameOfPresentedViewInContainerView: CGRect […]