在着手下一个项目之前,我想寻求一些建议。我希望支持 iOS 中现有的所有分辨率(retina、非 retina 的 iPhone 和所有 3 个 iPad)。开发人员通常是如何完成这个任务的?我看到过类似的问题,但都是特定的情况。我要求的是全套解决方案。例如,我想支持不同分辨率位图字体、图像等。
设备特定的开关或 if 语句是标准的吗?
提前感谢您的所有帮助。
E
编辑:我从 Apple 找到了这个:
如果您的应用程序使用 OpenGL ES 进行渲染,则您现有的绘制代码应该可以无需任何更改即可继续工作。但是,当在高分辨率屏幕上绘制时,您的内容将相应地缩放并且会显得更加块状。块状外观的原因是 CAEAGLLayer 类的默认行为与其他 Core Animation 层对象相同,它用于背面 OpenGL ES 渲染缓存。换句话说,它的比例因子最初设置为 1.0,这导致 Core Animation 合成器在高分辨率屏幕上缩放层的内容。为避免这种块状外观,您需要增加 OpenGL ES 渲染缓存的大小以匹配屏幕的大小(使用更多像素可以增加提供内容的详细程度)。然而,因为将更多像素添加到渲染缓存会对性能产生影响,所以您必须显式地选择支持高分辨率屏幕。
要启用高分辨率绘图,您必须更改用于呈现 OpenGL ES 内容的视图的比例因子。将视图的 contentScaleFactor 属性从 1.0 更改为 2.0 将触发底层 CAEAGLLayer 对象的匹配比例因子更改。您用于将层对象绑定到渲染缓存的 renderbufferStorage:fromDrawable: 方法通过将层的边界乘以其比例因子来计算渲染缓存的大小。因此,将比例因子加倍将使结果渲染缓存的宽度和高度加倍,给您的内容提供了更多像素。之后,您需要为这些额外的像素提供内容。
所以我的更新问题是如何执行上述操作中的比例因子加倍?
编辑 2:
我已经接近成功了......
我正在使用以下代码在 EAGLView 中进行缩放:
// Adjust for retina displays
if ([self respondsToSelector:@selector(setContentScaleFactor:)])
{
self.contentScaleFactor = [[UIScreen mainScreen] scale];
}
唯一的问题是图片位置有些混乱。现在,显示的图片可以根据分辨率进行缩放,但在更高分辨率下,图片会从屏幕中间开始显示。请帮忙解决!
第三次编辑:问题已解决!!!问题出在我的屏幕方向上。
您需要确保已更新翻译。我使用了这个:
glTranslatef( width / 2, height /2, 0);
glRotatef(-90, 0, 0, 1);
glTranslatef(-1 * (height / 2),-1 * (width / 2),0);
感谢您的阅读。希望这篇内容能对某些人有所帮助。