Skip to content

Instantly share code, notes, and snippets.

@rpetrich
Created March 9, 2012 00:37
Show Gist options
  • Save rpetrich/2004347 to your computer and use it in GitHub Desktop.
Save rpetrich/2004347 to your computer and use it in GitHub Desktop.
Convenience functions for getting the screen scale and rounding metrics relative to it.
#import <UIKit/UIKit.h>
#define UI_MAIN_SCREEN_SCALE() ([UIScreen instancesRespondToSelector:@selector(scale)] ? [UIScreen mainScreen].scale : 1.0f)
static inline CGFloat CGFloatRoundToScale(CGFloat value, CGFloat scale)
{
return roundf(value * scale) / scale;
}
static inline CGFloat CGFloatRoundToMainScreen(CGFloat value)
{
return CGFloatRoundToScale(value, UI_MAIN_SCREEN_SCALE());
}
static inline CGPoint CGPointRoundToScale(CGPoint value, CGFloat scale)
{
return (CGPoint) { CGFloatRoundToScale(value.x, scale), CGFloatRoundToScale(value.x, scale) };
}
static inline CGPoint CGPointRoundToMainScreen(CGPoint value)
{
return CGPointRoundToScale(value, UI_MAIN_SCREEN_SCALE());
}
static inline CGSize CGSizeRoundToScale(CGSize value, CGFloat scale)
{
return (CGSize) { CGFloatRoundToScale(value.width, scale), CGFloatRoundToScale(value.height, scale) };
}
static inline CGSize CGSizeRoundToMainScreen(CGSize value)
{
return CGSizeRoundToScale(value, UI_MAIN_SCREEN_SCALE());
}
static inline CGRect CGRectRoundToScale(CGRect value, CGFloat scale)
{
CGRect result;
result.origin = CGPointRoundToScale(value.origin, scale);
// Rounds such that the error present in the top and left positioning is
// taken into account when calculating the right and bottom positioning
result.size.width = CGFloatRoundToScale(value.origin.x + value.size.width, scale) - result.origin.x;
result.size.height = CGFloatRoundToScale(value.origin.y + value.size.height, scale) - result.origin.y;
return result;
}
static inline CGRect CGRectRoundToMainScreen(CGRect value)
{
return CGRectRoundToScale(value, UI_MAIN_SCREEN_SCALE());
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment