iOS 8 上的 snapshotViewAfterScreenUpdates 故障

Posted

技术标签:

【中文标题】iOS 8 上的 snapshotViewAfterScreenUpdates 故障【英文标题】:snapshotViewAfterScreenUpdates glitch on iOS 8 【发布时间】:2014-11-10 11:11:41 【问题描述】:

我注意到,在从 iPhone 5 布局缩放的 iPhone 6/6+ 模拟器上运行时,运行此程序会导致视图(或主窗口,不确定)暂时调整大小(不传递 iPhone 6/6 的启动图像+):

[self.view snapshotViewAfterScreenUpdates:YES];

知道当你不能通过“NO”时如何让它工作吗?

更新(7 月 13 日): 似乎不再在 ios 8.4 上重现。

【问题讨论】:

遇到同样的问题,如果你想出了解决办法,请告诉我。 不幸的是,这一直是一个错误。它也会影响 iOS 7(当您在 iPad 上运行 iPhone 应用程序时)。见这里:openradar.io/15909891 @anon 我最终调整了 iPhone 6/6+ 的布局。在本机设备分辨率上,问题不会重现 这解决了我的问题:***.com/a/26532531/774394 看起来它已在 iOS 8.4 中修复。你能确认一下吗? 【参考方案1】:

因为这似乎是一个 Apple/API 问题,所以我决定在需要传递“是”时不使用该方法。

您可以只截取视图的屏幕截图 (UIImage) 并将其放置在 UIImageView 中,以充当您从快照方法中获取的“UIView”。

下面是代码链接: How to capture UIView to UIImage without loss of quality on retina display

#import <QuartzCore/QuartzCore.h>

+ (UIImage *) imageWithView:(UIView *)view

    UIGraphicsBeginImageContextWithOptions(view.bounds.size, view.opaque, 0.0);
    [view.layer renderInContext:UIGraphicsGetCurrentContext()];

    UIImage * img = UIGraphicsGetImageFromCurrentImageContext();

    UIGraphicsEndImageContext();

    return img;

【讨论】:

不幸的是,这不起作用。它与将“NO”作为参数传递给 snapshotViewAfterScreenUpdates 的作用相同——这不是@Dannie P 试图做的。 我不同意,因为传递“NO”与使用 UIImage 拍摄快照不同。传递一个“NO”给了我一个空白的看法。不看代码就无法知道它是否做同样的事情。我同意这不是一个完全的替代品。我不得不在 IB 中对我的自动布局进行一些调整,以便在加载视图期间减少调整,因为 UIImage 快照会在正确调整约束之前进行调整。 我的意思是当你传递“NO”时,最近的更改不会被合并到视图中,当你捕获时也是一样的。能够将最近的更改集成到捕获中有时非常重要,例如当您在自定义过渡 (animateTransition...) 中使用它时。 @anon screenhotting 在某些情况下可能是一个答案。但是,如果您例如,这将无济于事。尝试在 viewDidLoad 中执行此操作以动画一些过渡 它解决了我的大问题。很好的答案。我赞成你的好帖子【参考方案2】:

我刚遇到这个问题。

原因是我没有适合 iPhone 6 和 6 plus 的启动图像。 由于这个不存在的图像,我看到的另一个问题是,当我这样询问屏幕尺寸范围时,我得到了 iPhone 5 的尺寸:

CGSize screenSize = [[UIScreen mainScreen] bounds].size;

当我修复这些图像时,这个问题得到了解决。

P.S - 无论您使用资产目录还是 nib 文件作为启动图像,它都应该有效。 在资产目录中,您应该在 iOS 8 及更高版本的右侧(属性检查器)中添加“V”,并为“Retina HD 5.5”(适用于 6 plus)和“”设置图像Retina HD 4.7'(适用于 iPhone 6)

【讨论】:

我不明白为什么这不是公认的答案。它现在就像一个魅力!谢谢 DZenBot,最初的目标是让它在 iPhone 6 上使用 iPhone 5th 布局(缩放模式)。原因是在布局约束被修复以支持更大的 iPhone 尺寸之前需要有一个解决方法。【参考方案3】:

似乎@anon 和@PJC 是正确的,这是 UIKit 的错误。有时可以通过[view.layer renderInContext:UIGraphicsGetCurrentContext()] 解决

此时我已经通过手动调整 iPhone 6/6+ 的布局为自己解决了这个问题,因为在本机设备分辨率上问题不会重现。

【讨论】:

以上是关于iOS 8 上的 snapshotViewAfterScreenUpdates 故障的主要内容,如果未能解决你的问题,请参考以下文章

iOS 7 和 iOS 8 上的不同帧高度

iOS 8 上的 snapshotViewAfterScreenUpdates 故障

NSManagedObjectContext 和 performBlock,iOS 8 上的变化?

iOS 8 上的通用链接?

关闭外部点击 iOS 8 上的模态表单视图

iOS 8.3 上的布局位移