在 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.bounds
是0, 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 框架:当订阅者可用/不可用时接收状态