Objective-C Learning Notes - UISwitch (Rewrite)(坑)

重写 UISwitch 类以添加修改其文本信息的方法:

好讨厌一本书里面的样例程序各个编写习惯都不一样....

//  UISwitchCustom.h
#import <UIKit/UIKit.h>
/**
 添加一个名为 extended 的 category, 声明一下 UISwitch 的 setAlertnateColors 消息,否则在使用的时候会出现找不到该消息的警告.其实 setAlertnateColors 已经在 UISwitch 中实现,只是没u 头文件中公开而已,所以在此做一个声明...
 当调用setAlertnateColors:YES 时,UISwitch 的状态为"on"时显示为橙色.
 **/
@interface UISwitch (extended)
- (void) setAlertnateColors:(BOOL)boolean;
@end
//自定义 slider 类,方便存储数据而已(好像 wwwww
@interface _UISwitchSlider : UISlider
@end
//自定义 UISwitch 类并拓展可以修改按钮上面的文字方法
@interface UISwitchCustom : UISwitch
//设置左边的文字
- (void) setLeftLabelText:(NSString *)labelText
                     font:(UIFont *)labelFont
                    color:(UIColor *)labelColor;
//设置右边的文字
- (void) setRightLabelText:(NSString *)labelText
                      font:(UIFont *)labelFont
                     color:(UIColor *)labelColor;
//一个方便创建 Label 的方法而已,其实它不应该出现在这里的吧...
- (UILabel *)createLabelWithText:(NSString *)labelText
                            font:(UIFont *)labelFont
                           color:(UIColor *)labelColor;
@end



//  UISwitchCustom.m
#import "UISwitchCustom.h"
@implementation UISwitchCustom
-(id)initWithFrame:(CGRect)frame{
    if (self = [super initWithFrame:frame]){
        //初始化
    }
    return self;
}
-(void)drawRect:(CGRect)rect{
    //绘图函数(啥?
}
//坑爹做法,为啥不直接定义一个结构?
-(_UISwitchSlider *)slider{
    return [[self subviews] lastObject];
}
//为啥要这样写啊混蛋!
-(UILabel *)textHolder{
    return [[[self slider]subviews]objectAtIndex:2];
}
//..
-(UILabel *)leftLabel{
    return [[[self slider]subviews]objectAtIndex:0];
}
//..
-(UILabel*)rightLabel{
    return [[[self slider]subviews]objectAtIndex:1];
}
//创建文本标签
-(UILabel*)createLabelWithText:(NSString *)labelText font:(UIFont *)labelFont color:(UIColor *)labelColor{
    //这个大小不是应该根据自身的 UISwitch 大小来调么...
    CGRect rect = CGRectMake(-25.0f, -10.0f, 50.0f, 20.0f);
    //使用以上的 Rect 创建 UILabel 实例
    UILabel *label = [[UILabel alloc]initWithFrame:rect];
    label.text = labelText;
    label.font = labelFont;
    label.textColor = labelColor;
    label.textAlignment = NSTextAlignmentCenter;
    label.backgroundColor = [UIColor clearColor];
    return label;
}
//重新设定左边的文本标签
-(void)setLeftLabelText:(NSString *)labelText font:(UIFont *)labelFont color:(UIColor *)labelColor{
    @try {
        //
        [[self leftLabel]setText:labelText];
        [[self leftLabel]setFont:labelFont];
        [[self leftLabel]setTextColor:labelColor];
    }
    @catch (NSException *exception) {
        //
        UIImageView *leftImage = (UIImageView *)[self leftLabel];
        leftImage.image = nil;
        leftImage.frame = CGRectMake(0.0f, 0.0f, 0.0f, 0.0f);
        [leftImage addSubview:[self createLabelWithText:labelText font:labelFont color:labelColor]];
        
    }
    @finally {
        
    }
}
//重新设定右边的文本标签
-(void)setRightLabelText:(NSString *)labelText font:(UIFont *)labelFont color:(UIColor *)labelColor{
    @try {
        //
        [[self rightLabel]setText:labelText];
        [[self rightLabel]setFont:labelFont];
        [[self rightLabel]setTextColor:labelColor];
    }
    @catch (NSException *exception) {
        //
        UIImageView *rightImage = (UIImageView *)[self rightLabel];
        rightImage.image = nil;
        rightImage.frame = CGRectMake(0.0f, 0.0f, 0.0f, 0.0f);
        [rightImage addSubview:[self createLabelWithText:labelText font:labelFont color:labelColor]];
        
    }
    @finally {
        
    }
}
@end


调用(失败了 想哭不会调试 orz

#import "ViewController.h"
#import "UISwitchCustom.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
    [super viewDidLoad];
    
    UISwitchCustom *mySwitch = [[UISwitchCustom alloc]init];
    
    [mySwitch setLeftLabelText:@"YESS" font:[UIFont systemFontOfSize:17] color:[UIColor redColor]];
    
    [mySwitch setRightLabelText:@"NOOP" font:[UIFont systemFontOfSize:17] color:[UIColor grayColor]];
    
    [self.view addSubview:mySwitch];
    
    // Do any additional setup after loading the view, typically from a nib.
}
- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}
@end


标签:ios, object-c, uiswitch