向UISwitch添加行为

时间:2013-12-26 09:17:51

标签: ios ios6 ios7 subclass uiswitch

我在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类?

1 个答案:

答案 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。