zoukankan      html  css  js  c++  java
  • [控件] 将字符串转换成贝塞尔曲线并执行动画

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

    部分开源代码支持:

    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
  • 相关阅读:
    OD: Kernel Vulnerabilities
    newInstance()和new的区别
    原型模式
    工厂模式
    代理模式
    策略模式
    简单工厂模式
    C#操作符的重载
    旅行之舌尖上的中国
    模式和原则[转载]
  • 原文地址:https://www.cnblogs.com/YouXianMing/p/4319253.html
Copyright © 2011-2022 走看看