TextKit简单示例

效果

源码

https://github.com/YouXianMing/Animations

//
//  TextKitLoadImageController.m
//  Animations
//
//  Created by YouXianMing on 16/4/10.
//  Copyright © 2016年 YouXianMing. All rights reserved.
//

#import "TextKitLoadImageController.h"
#import "AttributedStringInitConfig+Constructor.h"
#import "JSAnimatedImagesView.h"
#import "UIView+SetRect.h"
#import "GCD.h"

@interface TextKitLoadImageController () <JSAnimatedImagesViewDataSource>

@property (nonatomic, strong) JSAnimatedImagesView  *JSView;
@property (nonatomic, strong) NSArray               *JSViewDataSource;

@end

@implementation TextKitLoadImageController

- (void)setup {

    [super setup];

    NSString *str = @"这是发生在阿拉斯加麦肯莱国家公园的事,这个公园有日本的四国那么大,却只有一个为观光客开设的游客中心,位置就在原野正中央,公园唯一的一条道路上,每天都有许多观光客利用这个游憩场所。\n这附近是北极地松鼠的栖息地,所以每当有观光客下车,地松鼠就会跑过来讨东西吃,完全不怕人,公园管理员一再呼吁游客不要喂食地松鼠,但不管来自哪个国家的人,看到可爱机伶的地松鼠,还是会忍不住丢东西给它们吃。\n有一年,公园里竖着一个奇怪的告示牌。为什么说它奇怪呢?因为这个告示牌只有十公分高,不弯腰下去的话根本看不到,牌子开头就写着:“地松鼠们!”原来,这是写给地松鼠看的警告。\n“......你们再一直吃着人类给的食物,就会越来越胖,最后跑不动,就只好被金雕或是熊吃掉......”一想到好奇的观光客发出苦笑的脸,让我不禁莞尔。又想到在日本的动物园中,看到游客不断地往熊的笼子里丢食物,挂在旁边的“请勿喂食”标示,看起来是那么的无力。\n有人看到动物就自然而然想喂食,这种事情大家都清楚,但也有人率直的认为那是不对的行为。坚持真理是很辛苦的,不如多点想象空间,用小小的幽默来劝服人心。";

    NSTextStorage *storage = [[NSTextStorage alloc] initWithString:str attributes:[AttributedStringInitConfig heitiSC]];

    // 管理器
    NSLayoutManager *layoutManager = [NSLayoutManager new];
    [storage addLayoutManager:layoutManager];

    // 显示的容器(与UITextView对应)
    NSTextContainer *textContainer = [NSTextContainer new];
    CGSize size                    = CGSizeMake(Width - 20, MAXFLOAT);
    textContainer.size             = size;
    [layoutManager addTextContainer:textContainer];

    UITextView *textView = [[UITextView alloc] initWithFrame:CGRectMake(10, 10, Width - 20, self.contentView.height - 20)
                                               textContainer:textContainer];
    textView.scrollEnabled                = YES;
    textView.layer.borderWidth            = 0.5f;
    textView.layer.borderColor            = [[UIColor grayColor] colorWithAlphaComponent:0.15f].CGColor;
    textView.editable                     = NO;
    textView.selectable                   = NO;
    textView.layer.masksToBounds          = NO;
    textView.showsVerticalScrollIndicator = NO;
    textView.layer.masksToBounds          = YES;
    [self.contentView addSubview:textView];

    CGRect imagesFrame           = CGRectMake(60, 38, textView.width - 60 * 2, 170);
    textContainer.exclusionPaths = @[[self bezierPathWithFrame:imagesFrame]];

    [GCDQueue executeInMainQueue:^{

        self.JSViewDataSource  = @[[UIImage imageNamed:@"pic_1"],
                                   [UIImage imageNamed:@"pic_2"],
                                   [UIImage imageNamed:@"pic_3"],
                                   [UIImage imageNamed:@"pic_4"]];
        self.JSView                     = [[JSAnimatedImagesView alloc] initWithFrame:imagesFrame];
        self.JSView.alpha               = 0.f;
        self.JSView.transitionDuration  = 2.f;
        self.JSView.dataSource          = self;
        self.JSView.layer.masksToBounds = YES;
        [textView addSubview:self.JSView];

        [UIView animateWithDuration:2.f animations:^{

            self.JSView.alpha = 1.f;
        }];

    } afterDelaySecs:0.5f];
}

- (UIBezierPath *)bezierPathWithFrame:(CGRect)frame {

    return [UIBezierPath bezierPathWithRect:frame];
}

- (NSUInteger)animatedImagesNumberOfImages:(JSAnimatedImagesView *)animatedImagesView {

    return self.JSViewDataSource.count;
}

- (UIImage *)animatedImagesView:(JSAnimatedImagesView *)animatedImagesView imageAtIndex:(NSUInteger)index {

    return self.JSViewDataSource[index];
}

@end
时间: 2024-10-10 06:05:12

TextKit简单示例的相关文章

AMQP消息队列之RabbitMQ简单示例

前面一篇文章讲了如何快速搭建一个ActiveMQ的示例程序,ActiveMQ是JMS的实现,那这篇文章就再看下另外一种消息队列AMQP的代表实现RabbitMQ的简单示例吧.在具体讲解之前,先通过一个图来概览下: 1.添加Maven依赖 <!-- rabbitmq begin --> <dependency> <groupId>org.springframework.amqp</groupId> <artifactId>spring-rabbit

HMM的维特比算法简单示例

今天读了一位大牛的关于HMM的技术博客,读完之后,写了一个关于维特比算法的简单示例,用scala和java语言混合编写的.现在上传之. package com.txq.hmm import java.utilimport scala.collection._ /** * HMM维特比算法,根据显示状态链条估计隐式链条 * @param states 隐式states * @param observations 显式states * @param start_probability 初始概率向量

spring-servlet.xml简单示例

spring-servlet.xml简单示例 某个项目中的spring-servlet.xml 记下来以后研究用 1 <!-- springMVC简单配置 --> 2 <?xml version="1.0" encoding="UTF-8"?> 3 <beans xmlns="http://www.springframework.org/schema/beans" 4 xmlns:xsi="http://w

关于Ajax实现的简单示例

一.代码示例 关于Ajax的基本概念(包括XMLHttpRequest对象及其相关方法属性)移步这里(w3school中文版)学习了解. <!doctype html> <html lang = "en"> <head> <meta charset = "utf-8"> <title>使用Ajax异步加载数据</title> <script type = "text/javasc

【转】bind简单示例

bind简单示例代码 namespace { class placeholder_ {}; placeholder_ __1; } template <typename R, typename T, typename Arg> class simple_bind_t { private: typedef R (T::*F)(Arg); F f_; T* t_; Arg& a_; public: simple_bind_t(F f, T* t, Arg &a) : f_(f),

SQL左连接、右连接和内连接的简单示例

left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录: right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录: inner join(等值连接) 只返回两个表中联结字段相等的行:举例如下: -------------------------------------------- 表A记录如下: aID aNum 1 a20050111 2 a20050112 3 a20050113 4 a20050114 5 a20050115 表B记录

Backbone简单示例

要的资源: <script type="text/javascript" src="../dep/underscore-1.6.0.min.js"></script> <script type="text/javascript" src="../dep/jquery-1.11.1.min.js"></script> <script type="text/javas

动态网站开发技术学习2:VS 2010制作作第一个简单示例网站

制作一个简单示例网站的步骤: 一,启动VS 2010开发环境,选择菜单中的"文件",选择其中的"新建",再选择"网站",会弹出"新建网站"对话框. 二,在"新建网站"的对话框,在"已安装模板"中选择Visual C#,右侧的选择"ASP.NET网站"选项,单击"新建网 站"中的"文件系统",下拉菜单中有"文件系统&qu

简单示例

下面是一个简单示例,当阀切换至自动模式时,会自动向储罐中补水,到达设定值后自动关闭.当储罐中水位到达设定值后水泵自动开启,水位低时联锁关闭. 上图分别显示了阀门和水泵操作面板 上图显示了水泵的联锁信息 上图是参数设置 上图显示了水位曲线