且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

[控件] 将字符串转换成贝塞尔曲线并执行动画

更新时间:2022-08-13 13:18:59

将字符串转换成贝塞尔曲线并执行动画

[控件] 将字符串转换成贝塞尔曲线并执行动画

部分开源代码支持:

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