2013-12-26 4 views
0

Я использую UISwitch во многих местах своего приложения IOS. Некоторые из них представляют собой акции UISwitch, а некоторые из них - subclassed. Дело в iOS 6 VS iOS 7 размер изменяется. Так что я написал этот метод:Добавить поведение в UISwitch

-(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

Почему бы не создать класс и в этом поставить этот метод и использовать этот объект класса – Retro

+2

Я думаю, что здесь есть логическая ошибка. Каждый раз, когда вызывается вызов 'layoutSubviews', ваш кадр будет меняться. Или вы можете убедиться, что он вызывается только один раз. – KudoCC

ответ

0

Вы хотите, чтобы свойство кадра изменялось при вызове setFrame:. Попробуйте написать категорию UISwitch, которая переопределяет setFrame: Категория будет наследоваться всеми подклассами, а поскольку setFrame: наследуется от UIView и не объявляется в UISwitch, вы можете переопределить setter.

что-то вроде этого perhaps-

// 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: если вы обнаружите, что импортируете его во множество классов, вы можете рассмотреть возможность размещения его в предварительно скомпилированном заголовке вместо. Я использовал CGRectOffset в этом примере, где вы использовали CGRectMake.

Смежные вопросы