我有一个方法负责加载有关事件的详细信息(查询sqlite数据库中的标题,描述,缩略图路径等),因为我需要为大量事件调用它,我正在调度使用Grand Central Dispatch到后台主题。
问题是我得到一个UIKit线程异常(让我知道我在主线程以外的线程上运行UI方法,导致应用程序崩溃)。我根本没有改变UI,所以几乎不可能找到它,但我最终把它缩小到一行代码:
bool retina = (UIScreen.MainScreen.Scale > 1.0);
我正在使用UIScreen来确定设备是否有视网膜屏幕(以确定缩略图图像路径是否应该在末尾添加“@ 2x”)并且只是访问它(看起来像是静态变量)会抛出UIKit例外。
是否有解决方案来确定屏幕是否是不使用UIKit(或背景线程安全)的视网膜,还是有更好的方法来解决这个问题?
注意:我正在使用Xamarin(C#)创建应用程序,但swift中的任何答案都非常精细且易于转换。
答案 0 :(得分:3)
首先,打开刚刚在屏幕上显示的图像时,您不必指定@2
。 iOS使用UIImage(named: "BaseName")
选择正确的版本。
但是,如果你需要在这里你的Swift代码:
func isRetina() -> Bool
{
var scale: CGFloat = 0.0
DispatchQueue.main.sync
{
scale = UIScreen.main.scale
}
return scale > 1.0
}
因为您在很多地方使用它,请考虑将其放在某个实用程序/基类中。