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

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

部分开源代码支持:

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
时间: 2024-11-02 21:17:47

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

字符串转换成时间格式如何去掉自带的星期以及上下午

问题描述 字符串转换成时间格式如何去掉自带的星期以及上下午 最近遇到一个恼火的问题,通过控件获得的时间会自动加上星期 以及 上(下)午因为数据库该时间 字段的长度是固定的 一旦加上星期和上下午就会超出范围,目前 试过N 种方法都无法成功例如 将时间 截取成 "2014-08-11"的字符串,一旦Conver.toDateTime后立马变成了"2014-08-11 星期六 下午 12:00...""的形式目前试过改时间右下角,以及各种转换时间格式的形式,都失

怎么把一个字符串转换成图片格式啊

问题描述 怎么把一个字符串转换成图片格式啊,Http返回出来的一个字符串,我想把返回出来的值转换成图片格式 解决方案 解决方案二:可以搜索一下base64编码,一般是这种方式返回的,如果是其它方式,建议你直接联系第三方解决方案三:base64解决方案四:先把字符串转成base64再将base64转成图片解决方案五:你到底是要将一个字符串写入到一个图片里,还是base64字符串转换回图片?解决方案六:字符串能变成图片?NB.........解决方案七:参考:(视频)解决方案八:引用5楼huaner

asp.net.想要实现一个文字字符串转换成MP3和wav格式的语音

问题描述 asp.net.想要实现一个文字字符串转换成MP3和wav格式的语音 2C 文字字符串转换成MP3和wav格式的语音文件并且存入数据库,请问如何实现.需要转换成音频文件后可以读出文字内容 解决方案 你需要一个与字符对应的音频库,就像电子琴.比如1对应声音多,2对应声音来,3对应声音咪--,还有长音,短音,4分,8分等等,当你输入一个字符串时,找到跟他对应的声音,就能实现准确的转换了.

把普通字符串转换成二进制字符串的函数写出来了,和大家分享一下。

二进制|函数|转换|字符串 '普通字符串转换成二进制字符串函数Function Str2Bin(String)  Dim i, tmpbin  For i=1 to strLength(String)    tmpbin = tmpbin & ChrB(Asc(Mid(String,I,1)))  Next  Str2Bin = tmpbinEnd Function '以下函数来自ChinaASP,计算字符串的真正字节数(支持中文)Function strLength(str)   If (le

怎样利用正则表达式把用URLEncode的字符串转换成正常的字符串函数

encode|函数|正则|转换|字符串 <script language=JavaScript RUNAT=SERVER>// 利用正则表达式把用URLEncode的字符串转换成正常的字符串函数function URLDecode(EncodeString) {  var lsRegExp = /\+/g;  return unescape(String(EncodeString).replace(lsRegExp, " ")); }</script> 使用例子

php将字符串转换成16进制的方法

 这篇文章主要介绍了php将字符串转换成16进制的方法,涉及php中bin2hex函数的使用技巧,非常具有实用价值,需要的朋友可以参考下     本文实例讲述了php将字符串转换成16进制的方法.分享给大家供大家参考.具体分析如下: php中可以通过bin2hex函数将字符串转换成16进制的形式输出,bin2hex()函数返回结果为ascii码 ? 1 2 3 4 5 <?php $string = "Hellotworld!n"; print($string."n&q

js字符串转换成数字与数字转换成字符串的实现方法

 本篇文章主要是对js字符串转换成数字与数字转换成字符串的实现方法进行了详细的介绍,需要的朋友可以过来参考下,希望对大家有所帮助 js字符串转换成数字   将字符串转换成数字,得用到parseInt函数. parseInt(string) : 函数从string的开始解析,返回一个整数.     举例: parseInt('123') : 返回 123(int): parseInt('1234xxx') : 返回 1234(int):   如果解析不到数字,则将返回一个NaN的值,可以用isNa

JavaScript将字符串转换成字符编码列表的方法

 这篇文章主要介绍了JavaScript将字符串转换成字符编码列表的方法,实例分析了javascript中charCodeAt函数的使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下     本文实例讲述了JavaScript将字符串转换成字符编码列表的方法.分享给大家供大家参考.具体如下: JavaScript将字符串转换成字符编码列表,例如foo转换成 [112,111,111] 方法 1: JavaScript 1.6 ? 1 2 Array.map('foo', function(x)

将字符串转换成gb2312或者utf-8编码的参数(js版)_javascript技巧

在很多时候,我们直接在url中传递中文参数时,读到的中文都是乱码,那么我们应该怎么将这些参数转换呢? 下面我们来介绍一下方法 1.我们新建一个 UrlEncode.js 然后将下面的代码拷贝进去 复制代码 代码如下: //JS版的Server.UrlEncode编码函数 String.prototype.UrlEncodeGB2312 = function () { var str = this; str = str.replace(/./g, function (sHex) { window.