我在UISwitch
应用的许多地方使用IOS
。其中一些是库存UISwitch
,其中一些是subclassed
。事情发生在iOS 6
VS iOS 7
中。所以我写了这个方法:
-(void)layoutSubviews{
if ([[[UIDevice currentDevice]systemVersion]intValue]<7) {
self.frame = CGRectMake(self.frame.origin.x-28, self.frame.origin.y, self.frame.size.width, self.frame.size.height);
}
}
我可以更改每个子类并添加此方法,但我不认为这是正确的方法。
如何设置此类以影响基类UISwitch
类?
答案 0 :(得分:0)
您只希望在调用setFrame:时更改frame属性。尝试编写一个覆盖setFrame的UISwitch类别: 类别将由所有子类继承,并且因为setFrame:是从UIView继承的,并且未在UISwitch中声明,所以您可以覆盖setter。
或许这样的事情 -// UISwitch+UISwitchAdditions.h
#import <UIKit/UIKit.h>
@interface UISwitch (UISwitchAdditions)
- (void)setFrame:(CGRect)frame;
@end
现在是.m
// UISwitch+UISwitchAdditions.m
#import "UISwitch+UISwitchAdditions.h"
#define X_OFFSET -28.0 // tweak your offset here
@implementation UISwitch (UISwitchAdditions)
-(void)setFrame:(CGRect)frame {
// get OS version
float osVersion = [[UIDevice currentDevice].systemVersion floatValue];
// now the conditional to determine offset
if (osVersion < 7.0) {
// offset frame before calling super
frame = CGRectOffset(frame, X_OFFSET, 0.0);
[super setFrame:frame];
}
else {
// no offset so just call super
[super setFrame:frame];
}
}
@end
我认为@KudoCC对layoutSubviews有一个有效的观点。请记住将您的类别的标题(在此示例中为 UISwitch + UISwitchAdditions.h )导入到将调用setFrame的任何类中:如果您发现自己将其导入到许多类中,那么您可以考虑将其放置而是在预编译的头文件中。 我在这个使用CGRectMake的例子中使用了CGRectOffset。