在 iOS 上,当某些维度信息不可用时,我们如何在 viewDidLoad 中的屏幕上绘制东西?

Posted

技术标签:

【中文标题】在 iOS 上,当某些维度信息不可用时,我们如何在 viewDidLoad 中的屏幕上绘制东西?【英文标题】:On iOS, how do we draw things on screen in viewDidLoad when some dimension info is not available? 【发布时间】:2012-08-17 20:39:44 【问题描述】:

在应用启动时,我直接在CGBitmapContext上绘制东西,将其转换为CGImage,然后将其设置为viewDidAppear中的视图层。

实际上速度很快,但由于 Apple 需要向应用添加 Launch 图像,所以我添加了一个静态图像,显示屏幕的样子作为 Launch 图像。

但是,接下来发生的事情是,当应用程序启动时,Launch 图像会出现,但屏幕会在 0.5 到 1 秒后空白,我认为是由于viewDidLoad 启动和viewDidAppear 开始运行,但一开始,屏幕全是空白的。

然后在 0.5 秒后,一切都显示出来,但这会产生白屏“闪烁”。

所以看起来至少有两个选项,分别是

    只是让 Launch 图像完全空白,但我不确定 Apple 是否会拒绝该应用程序,因为他们想要“应用程序最初外观的静态图像”......但我想知道是否初始图像显示得如此之快(0.5 到 1 秒,他们还会介意吗?)

    另一种选择是将所有绘图从viewDidAppear移动到viewDidLoad,但是我发现viewDidLoad中缺少一些信息,例如viewDidLoad中的self.view.bounds0, 0, 768, 1004 ,并在viewDidAppear 中更改为正确的0, 0, 320, 460(正在iPhone 4S 上测试)。

所以我认为viewDidLoad 中的某些视图信息尚未正确设置,这是一个两难的选择。一种方法可能是检查它是 iPad 还是 iPhone,然后硬编码 self.view.bounds 值,但有更好的方法吗?

【问题讨论】:

【参考方案1】:

在 viewWillAppear 期间启动的后台线程上创建 CGImage,然后您将获得尺寸。

也许将 viewDidLoad 中的视图背景设置为与您的启动图像相同,以便在您绘制 CGImage 时,用户不会看到闪烁。

【讨论】:

为什么不将所有代码从viewDidAppear 移动到viewWillAppear 呢? (而不是移动到viewDidLoad)我刚刚尝试打印出self.view.bounds,它已经正确设置了。 (顺便说一下,在线程中绘制 CGImage 与在viewWillAppear 内部绘制相比有额外的优势吗?) 正是我所做的 - 使用启动图像,制作相同的图像(状态栏宽度更小)并用作第一个视图控制器的后备视图,然后当我有我想要显示的视图时为新视图设置动画,退出后备视图,然后在完成块中释放后备视图图像。 @DavidH 我认为 Apple 的意图(一种可能的方式,但可能是他们想要的主要方式)是我们显示静态图像,“好像”应用程序已经正确渲染它,所以用户可以根据 HIG 的说法,感觉它很快并且已经加载了,Apple 不希望人们使用“启动”屏幕或信用屏幕。而在画实物的时候,我觉得用意是默默的进来,如果有淡出静态画面,淡入实物的话,可能按照HIG要我们的“重”做 我给你一个技巧,让你不闪烁,而不是指导你展示什么。在我的应用程序中,可以有一个登录视图(对于新人),或者一个带有产品列表的视图(我从网络上获得的)。所以没有办法获得单个启动图像。我为登录所做的(与您想要做的类似)是拥有一块深色木头的启动图像,然后当我启动时,我使用相同的图像,但在状态栏的顶部弹出作为背景,最后,当登录视图获得 viewDidAppear 时,我在其他“浮动”在背景顶部的内容中进行动画处理。没有闪烁。 我的评论空间用完了。所以,是的,如果你想遵循 HIG(如果有人这样做,似乎很少有人这样做,甚至苹果现在似乎都忽略了,这是为早期应用程序编写的,当时发布时间很长)——那么你会尝试准确地制作你的启动图像喜欢你的第一眼。

以上是关于在 iOS 上,当某些维度信息不可用时,我们如何在 viewDidLoad 中的屏幕上绘制东西?的主要内容,如果未能解决你的问题,请参考以下文章

使用适用于 iOS 的 XMPP 框架:当订阅者可用/不可用时接收状态

如何修复 PWA 审核中的“当 JavaScript 不可用时不提供后备内容”?

当指向前一个节点的指针不可用时,从单个链表中删除中间节点

导入文件不可用时如何避免崩溃?..IOS 7

当预定义的类别不可用时如何对文本进行分类

如何在出现之前过滤ios推送通知