Вы можете сделать это с помощью какого-то метода, работающего во время выполнения. В качестве простого примера, если вы хотите иметь зависимый от устройства метод drawRect:
в своем подклассе UIView
, вы можете написать два метода и решить, какой использовать при инициализации класса:
#import <objc/runtime.h>
+ (void)initialize
{
Class c = self;
SEL originalSelector = @selector(drawRect:);
SEL newSelector = (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
? @selector(drawRect_iPad:)
: @selector(drawRect_iPhone:);
Method origMethod = class_getInstanceMethod(c, originalSelector);
Method newMethod = class_getInstanceMethod(c, newSelector);
if (class_addMethod(c, originalSelector, method_getImplementation(newMethod), method_getTypeEncoding(newMethod))) {
class_replaceMethod(c, newSelector, method_getImplementation(origMethod), method_getTypeEncoding(origMethod));
} else {
method_exchangeImplementations(origMethod, newMethod);
}
}
- (void)drawRect_iPhone:(CGRect)rect
{
[[UIColor greenColor] set];
UIRectFill(self.bounds);
}
- (void)drawRect_iPad:(CGRect)rect
{
[[UIColor redColor] set];
UIRectFill(self.bounds);
}
- (void)drawRect:(CGRect)rect
{
//won't be used
}
Это должно привести к красному представлению на iPad и зеленому представлению на iPhone.