UIlabel本身没有下划线的属性,使用绘制的方法,添加下滑下,并且赋给该label一个action作为响应方法,实现DIY超链接的效果。
//调用
#import "UnderLineLabel.h" UnderLineLabel *label = [[UnderLineLabel alloc] initWithFrame:CGRectMake(50, 200, 300, 30)]; [label setBackgroundColor:[UIColor clearColor]]; // [label setBackgroundColor:[UIColor yellowColor]]; [label setTextColor:[UIColor blueColor]]; [label setBackgroundColor:[UIColor yellowColor]]; label.highlightedColor = [UIColor redColor]; label.shouldUnderline = YES; [label setText:str andCenter:CGPointMake(200, 240)]; [label addTarget:self action:@selector(labelClicked)]; [self.view addSubview:label]; // [label release]; //"超链接执行的方法" - (void)labelClicked { NSLog(@"%@", NSStringFromSelector(_cmd)); UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Clicked!" message:nil delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil, nil]; [alertView show]; [alertView release]; }
UnderLineLabel.h
#import <UIKit/UIKit.h> @interface UnderLineLabel : UILabel { UIControl *_actionView; UIColor *_highlightedColor; BOOL _shouldUnderline; } @property (nonatomic, retain) UIColor *highlightedColor; @property (nonatomic, assign) BOOL shouldUnderline; - (void)setText:(NSString *)text andCenter:(CGPoint)center; - (void)addTarget:(id)target action:(SEL)action; @end
// UnderLineLabel.m
// UnderLineLabel.m #import "UnderLineLabel.h" @implementation UnderLineLabel @synthesize highlightedColor = _highlightedColor; @synthesize shouldUnderline = _shouldUnderline; //- (void)dealloc //{ // [_actionView release], // _actionView = nil; // self.highlightedColor = nil; // [super dealloc]; //} - (id)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { } return self; } - (id)init { if (self = [super init]) { self.font=[UIFont systemFontOfSize:6]; } return self; } - (id)initWithCoder:(NSCoder *)aDecoder { if (self = [super initWithCoder:aDecoder]) { } return self; } - (void)setShouldUnderline:(BOOL)shouldUnderline { _shouldUnderline = shouldUnderline; if (_shouldUnderline) { [self setup]; } } - (void)drawRect:(CGRect)rect { NSLog(@"%@", NSStringFromSelector(_cmd)); [super drawRect:rect]; if (self.shouldUnderline) { NSLog(@"XXXXX"); CGContextRef ctx = UIGraphicsGetCurrentContext(); CGSize fontSize =[self.text sizeWithFont:self.font forWidth:self.frame.size.width lineBreakMode:NSLineBreakByTruncatingTail]; CGContextSetStrokeColorWithColor(ctx, self.textColor.CGColor); // set as the text's color CGContextSetLineWidth(ctx, 2.0f); CGPoint leftPoint = CGPointMake(0, self.frame.size.height); CGPoint rightPoint = CGPointMake(fontSize.width, self.frame.size.height); CGContextMoveToPoint(ctx, leftPoint.x, leftPoint.y); CGContextAddLineToPoint(ctx, rightPoint.x, rightPoint.y); CGContextStrokePath(ctx); } } - (void)setText:(NSString *)text andCenter:(CGPoint)center { [super setText:text]; CGSize fontSize =[self.text sizeWithFont:self.font forWidth:Phone_Weight-44 lineBreakMode:NSLineBreakByTruncatingTail]; NSLog(@"%f %f", fontSize.width, fontSize.height); [self setNumberOfLines:0]; [self setFrame:CGRectMake(0, 0, fontSize.width, fontSize.height)]; [self setCenter:center]; } - (void)setup { [self setUserInteractionEnabled:TRUE]; _actionView = [[UIControl alloc] initWithFrame:self.bounds]; [_actionView setBackgroundColor:[UIColor clearColor]]; [_actionView addTarget:self action:@selector(appendHighlightedColor) forControlEvents:UIControlEventTouchDown]; [_actionView addTarget:self action:@selector(removeHighlightedColor) forControlEvents:UIControlEventTouchCancel | UIControlEventTouchUpInside | UIControlEventTouchDragOutside | UIControlEventTouchUpOutside]; [self addSubview:_actionView]; [self sendSubviewToBack:_actionView]; } - (void)addTarget:(id)target action:(SEL)action { [_actionView addTarget:target action:action forControlEvents:UIControlEventTouchUpInside]; } - (void)appendHighlightedColor { self.backgroundColor = self.highlightedColor; } - (void)removeHighlightedColor { self.backgroundColor = [UIColor clearColor]; } @end