Created
June 29, 2011 19:33
-
-
Save mikaelbartlett/1054706 to your computer and use it in GitHub Desktop.
Simple class for IOS SDK UILabel with strikethrough
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
@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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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.
Is it possible that we can switch between strike through effect and without it when user taps on a label?
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
This works fine.