Вы хотите, чтобы свойство кадра изменялось при вызове 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.
Почему бы не создать класс и в этом поставить этот метод и использовать этот объект класса – Retro
Я думаю, что здесь есть логическая ошибка. Каждый раз, когда вызывается вызов 'layoutSubviews', ваш кадр будет меняться. Или вы можете убедиться, что он вызывается только один раз. – KudoCC