public
Last active

Simple class for IOS SDK UILabel with strikethrough

  • Download Gist
UILabelStrikethrough.h
Objective-C
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
@interface UILabelStrikethrough : UILabel {
int xOffset;
int yOffset;
int widthOffset;
int stroke;
UIColor* strokeColor;
}
@property (nonatomic) int xOffset;
@property (nonatomic) int yOffset;
@property (nonatomic) int widthOffset;
@property (nonatomic) int stroke;
@property (nonatomic,retain) UIColor* strokeColor;
 
-(id) initWithFrame:(CGRect)frame xOffset:(int)_xOffset yOffset:(int)_yOffset widthOffset:(int)_widthOffset stroke:(int)_stroke strokeColor:(UIColor*)_strokeColor;
@end
UILabelStrikethrough.m
Objective-C
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
#import "UILabelStrikethrough.h"
 
 
@implementation UILabelStrikethrough
@synthesize xOffset, yOffset, widthOffset, stroke;
@synthesize strokeColor;
 
-(void) dealloc {
[super dealloc];
[strokeColor release];
}
 
-(id) initWithFrame:(CGRect)frame {
self = [super initWithFrame:frame];
if (self) {
self.xOffset = 0;
self.yOffset = 0;
self.widthOffset = 0;
self.stroke = 2;
self.strokeColor = [UIColor colorWithRed:1 green:1 blue:1 alpha:1];
}
return self;
}
 
-(id) initWithFrame:(CGRect)frame xOffset:(int)_xOffset yOffset:(int)_yOffset widthOffset:(int)_widthOffset stroke:(int)_stroke strokeColor:(UIColor*)_strokeColor {
frame = CGRectMake(frame.origin.x, frame.origin.y, frame.size.width+_widthOffset-_xOffset, frame.size.height);
self = [super initWithFrame:frame];
if (self) {
self.xOffset = _xOffset;
self.yOffset = _yOffset;
self.widthOffset = _widthOffset;
self.stroke = _stroke;
self.strokeColor = _strokeColor;
}
return self;
}
 
- (void)drawTextInRect:(CGRect)rect {
UIEdgeInsets insets = {0, 0-self.xOffset, 0, 0+self.widthOffset};
return [super drawTextInRect:UIEdgeInsetsInsetRect(rect, insets)];
}
 
- (void)drawRect:(CGRect)rect {
CGSize size = [self.text sizeWithFont:self.font constrainedToSize:self.frame.size lineBreakMode:self.lineBreakMode];
CGContextRef c = UIGraphicsGetCurrentContext();
const float* colors = CGColorGetComponents( self.strokeColor.CGColor );
CGContextSetStrokeColor(c, colors);
CGContextSetLineWidth(c, self.stroke);
CGContextBeginPath(c);
int halfWayUp = (size.height - self.bounds.origin.y) / 2 + self.yOffset;
CGContextMoveToPoint(c, self.bounds.origin.x + self.xOffset, halfWayUp );
CGContextAddLineToPoint(c, self.bounds.origin.x + size.width + self.widthOffset - self.xOffset, halfWayUp);
CGContextStrokePath(c);
[super drawRect:rect];
}
 
@end

I had to change all integers to floats, and use CGContextSetStrokeColorWithColor for this to work on SDK 4.3.

Just make sure to round to nearest integer, as decimal precision make a line with 1 pixel line-height blurry.

Fix for label with line break:

- (void)drawRect:(CGRect)rect {
    
---    CGSize size = [self.text sizeWithFont:self.font constrainedToSize:self.frame.size];
+++    CGSize size = [self.text sizeWithFont:self.font constrainedToSize:self.frame.size lineBreakMode:self.lineBreakMode];
   CGContextRef c = UIGraphicsGetCurrentContext();

Thanks,

Just ran in to this bug myself this week.

Please sign in to comment on this gist.

Something went wrong with that request. Please try again.