I’ve updated my Shiny Red Button code to render high-resolution buttons on high-resolution devices. This code must be linked against the iOS 4.0 SDK, but can target iOS 3.0. You can download the header and source files right away, or read a bit about the change below.
Code
Here’s the only code that I had to change. I replaced this statement:
UIGraphicsBeginImageContext(size);
with this one:
if (UIGraphicsBeginImageContextWithOptions != NULL)
{
UIGraphicsBeginImageContextWithOptions(size, NO, 0.0);
}
else
{
UIGraphicsBeginImageContext(size);
}
The UIGraphicsBeginImageContextWithOptions
function is obviously the key here; its third parameter specifies a “scale” factor to be applied (to the Current Transformation Matrix) when converting logical device coordinates (e.g., those supplied in size
) into pixels (which are what Quartz understands). The 0.0
value supplied here is a “magic” number, which sets “the scale factor … to the scale factor of the device’s main screen”. This code, therefore, will render “normal” resolution buttons on 320×480 iPhones, and high-resolution buttons on high-resolution devices.
Weak Linking
The UIGraphicsBeginImageContextWithOptions
function was introduced in iOS 4.0; this is why the new Shiny Red Button code must be linked against the iOS 4.0 SDK. Nevertheless, I wanted to let the code target iOS 3.0, since there are still a lot of those devices out there. Fortunately, AAPL makes this easy, by weak-linking many framework functions, including this one. This is why I begin the new code by testing for NULL; if the iOS 4.0 function isn’t available, I fall back to the original, 3.0-and-earlier function.