[控件] 将字符串转换成贝塞尔曲线并执行动画
将字符串转换成贝塞尔曲线并执行动画
部分开源代码支持:
https://github.com/aderussell/string-to-CGPathRef
效果:
源码:
// // ShapeWordView.h // PathWord // // Created by XianMingYou on 15/3/6. // Copyright (c) 2015年 XianMingYou. All rights reserved. // #import <UIKit/UIKit.h> #import "UIBezierPath+TextPaths.h" @interface ShapeWordView : UIView @property (nonatomic, strong) NSString *text; @property (nonatomic, strong) UIFont *font; @property (nonatomic, strong) UIColor *lineColor; @property (nonatomic, assign) CGFloat lineWidth; /** * 创建view */ - (void)buildView; /** * 百分比 * * @param percent 百分比 */ - (void)percent:(CGFloat)percent animated:(BOOL)animated; @end
// // ShapeWordView.m // PathWord // // Created by XianMingYou on 15/3/6. // Copyright (c) 2015年 XianMingYou. All rights reserved. // #import "ShapeWordView.h" @interface ShapeWordView () @property (nonatomic, strong) CAShapeLayer *shapeLayer; @end @implementation ShapeWordView - (void)buildView { // 过滤数据 CGFloat lineWidth = (self.lineWidth <= 0 ? 0.5 : self.lineWidth); UIFont *font = (self.font == nil ? [UIFont systemFontOfSize:18.f] : self.font); UIColor *lineColor = (self.lineColor == nil ? [UIColor blackColor] : self.lineColor); NSString *text = self.text; if (text == nil || text.length == 0) { return; } // 初始化layer self.shapeLayer = [CAShapeLayer layer]; self.shapeLayer.frame = self.bounds; self.shapeLayer.lineWidth = lineWidth; self.shapeLayer.fillColor = [UIColor clearColor].CGColor; self.shapeLayer.strokeColor = lineColor.CGColor; self.shapeLayer.path = [UIBezierPath pathForMultilineString:text withFont:font maxWidth:self.bounds.size.width textAlignment:NSTextAlignmentCenter].CGPath; self.shapeLayer.bounds = CGPathGetBoundingBox(self.shapeLayer.path); self.shapeLayer.geometryFlipped = YES; self.shapeLayer.strokeEnd = 0.f; [self.layer addSublayer:self.shapeLayer]; } - (void)percent:(CGFloat)percent animated:(BOOL)animated { if (animated) { if (percent <= 0) { self.shapeLayer.strokeEnd = 0; } else if (percent > 0 && percent <= 1) { self.shapeLayer.strokeEnd = percent; } else { self.shapeLayer.strokeEnd = 1.f; } } else { if (percent <= 0) { [CATransaction setDisableActions:YES]; self.shapeLayer.strokeEnd = 0; [CATransaction setDisableActions:NO]; } else if (percent > 0 && percent <= 1) { [CATransaction setDisableActions:YES]; self.shapeLayer.strokeEnd = percent; [CATransaction setDisableActions:NO]; } else { [CATransaction setDisableActions:YES]; self.shapeLayer.strokeEnd = 1.f; [CATransaction setDisableActions:NO]; } } } @end
使用:
// // ViewController.m // PathWord // // Created by XianMingYou on 15/3/6. // Copyright (c) 2015年 XianMingYou. All rights reserved. // #import "ViewController.h" #import "UIBezierPath+TextPaths.h" #import "ShapeWordView.h" @interface ViewController ()<UITableViewDelegate> @property (nonatomic, strong) UITableView *tableView; @property (nonatomic, strong) ShapeWordView *shape; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; self.tableView = [[UITableView alloc] initWithFrame:self.view.bounds style:UITableViewStylePlain]; self.tableView.delegate = self; [self.view addSubview:self.tableView]; self.shape = [[ShapeWordView alloc] initWithFrame:CGRectMake(10, 20, 290, 100)]; self.shape.lineColor = [UIColor redColor]; self.shape.text = @"YouXianMing"; self.shape.lineWidth = 0.5f; [self.shape buildView]; [self.view addSubview:self.shape]; } - (void)scrollViewDidScroll:(UIScrollView *)scrollView { CGFloat offsetY = - scrollView.contentOffset.y; if (offsetY >= 0) { CGFloat percent = offsetY / 50; [self.shape percent:percent animated:NO]; } } @end