- (void)setStrokeLabel:(BOOL)strokeLabel
{
_strokeLabel = strokeLabel;
if (_strokeLabel) {
_timer = [NSTimer scheduledTimerWithTimeInterval:0.4 target:self selector:@selector(setStrokeThrough) userInfo:nil repeats:NO];
} else {
[self cancelStrokeThrough];
}
}
- (void)setStrokeThrough
{
NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithAttributedString:self.attributedText];
for (NSUInteger i = 1; i <= [attributedString length]; i++) {
[attributedString addAttribute:NSStrikethroughStyleAttributeName
value:[NSNumber numberWithInt:1]
range:NSMakeRange(0, i)];
self.attributedText = attributedString;
}
}
- (void)cancelStrokeThrough
{
NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithAttributedString:self.attributedText];
[attributedString removeAttribute:NSStrikethroughStyleAttributeName
range:NSMakeRange(0, [attributedString length])];
self.attributedText = attributedString;
}
I want to animate strike-through, like todo done animation.
As I set timer for it, the timer only handle how to show the stoke through letter by letter??
Here are two functions which do the job.
BOOL setStrokethrough(UILabel *label, NSRange range)
{
if (range.location >= [label.attributedText length])
return FALSE;
if (range.location + range.length > [label.attributedText length])
range.length = [label.attributedText length] - range.location;
NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithAttributedString:label.attributedText];
[attributedString addAttribute:NSStrikethroughStyleAttributeName
value:@(NSUnderlineStyleSingle)
range:range];
label.attributedText = attributedString;
return TRUE;
}
-(void)animateSetStrokethroughDuration:(float)duration
{
__block float const stepDuration = 0.1;
float steps = duration / stepDuration;
__block NSRange range = NSMakeRange(0, ceil((float)[self.label.attributedText length] / steps));
void (^__block fn)();
void (^__block __weak weakfn)();
weakfn = fn = ^(){
if (!setStrokethrough(self.label, range))
return;
range = NSMakeRange(range.location + range.length, range.length);
[self performBlock:weakfn afterDelay:stepDuration];
};
fn();
}
Notes
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With