文档章节

iOS UILabel显示网络图片 NSMutableAttributedString使用网络图片

赵大财
 赵大财
发布于 2016/04/03 17:12
字数 662
阅读 1781
收藏 1

效果图

4.5 BUG 修复    if(_dcAttributedString.length+1 == ms.length){

} //增加这句判断   如果需要请联系我  

4.6日  进行重构 代码更少  需要可以QQ联系 完整稳定版1.0完成

使用代码

    DCLabel *testLabel = [[DCLabel alloc]initWithFrame:CGRectMake(0, 100, 320, 60)];
    testLabel.backgroundColor = [UIColor lightGrayColor];
    testLabel.textAlignment = NSTextAlignmentCenter;
    testLabel.dcAttributedString = @"123456";
    
    //请务必按顺序使用 // 1:imgSize  2:networkImg||localImg 3:position 4:imgMargin
    testLabel.imgSize = CGRectMake(0,0,40,40);
    testLabel.networkImg = @"http://desk.fd.zol-img.com.cn/t_s960x600c5/g5/M00/05/02/ChMkJ1bxATiIVlzmAAlJIHaXmLkAAOTUgN32YEACUk4716.jpg"; //支持网络
    //testLabel.localImg = //支持本地
    testLabel.position = 0;
    testLabel.imgMargin = 10;

h文件

//
//  DCLabel.h
//  DCLabel
//
//  Created by point on 16/4/2.
//  Copyright © 2016年 赵大财. All rights reserved.
//

#import <UIKit/UIKit.h>

@interface DCLabel : UILabel

@property(copy,nonatomic) NSString *networkImg; //需要插入的网络图片
@property(strong,nonatomic) UIImage *localImg; //需要插入的本地图片
@property(assign,nonatomic) NSInteger position; //需要插入的图片位置
@property(assign,nonatomic) CGRect imgSize; //图片的大小
@property(assign,nonatomic) CGFloat imgMargin; //图片的边距
@property(copy,nonatomic) NSString *dcAttributedString; //文字

@end

m文件

//
//  DCLabel.m
//  DCLabel
//
//  Created by point on 16/4/2.
//  Copyright © 2016年 赵大财. All rights reserved.
//

#import "DCLabel.h"
@interface DCLabel()

@property(strong,nonatomic) NSTextAttachment *attch;

@property(strong,nonatomic) UIImage *networkImage;

/** 内存缓存的图片 */
@property (nonatomic, strong) NSMutableDictionary *images;
/** 队列对象 */
@property (nonatomic, strong) NSOperationQueue *queue;

@end

@implementation DCLabel

- (void)setDcAttributedString:(NSString *)string {
    _dcAttributedString =  string;
}

- (void)setLocalImg:(UIImage *)localImg {
    [self insertMs:localImg];
}

/**
 * 插入图片
 */
-  (void)insertMs:(UIImage *)img {
    _attch = [[NSTextAttachment alloc] init];
    _attch.image = img;
    _attch.bounds = _imgSize;
    NSMutableAttributedString *ms = [[NSMutableAttributedString alloc]initWithString:_dcAttributedString];
    NSAttributedString *string = [NSAttributedString attributedStringWithAttachment:_attch];
    [ms insertAttributedString:string atIndex:0];
    self.attributedText = ms;
    [self setPosition:_position];
    [self setImgMargin:_imgMargin]; //重新处理图片的间距
    
}


- (void)setNetworkImg:(NSString *)networkImg {
    UIImage *image = self.images[networkImg];
    if (image) {
        _networkImage =  image;
        [self insertMs:image];
    } else {
        NSString *cachesPath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject];
        NSString *filename = [networkImg lastPathComponent];
        NSString *file = [cachesPath stringByAppendingPathComponent:filename];
        NSData *data = [NSData dataWithContentsOfFile:file];
        if (data) {
            UIImage *image = [UIImage imageWithData:data];
            [self insertMs:image];
            _networkImage =  image;
            self.images[networkImg] = image;
        } else {
            [self.queue addOperationWithBlock:^{
                NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:networkImg]];
                UIImage *image = [UIImage imageWithData:data];
                [[NSOperationQueue mainQueue] addOperationWithBlock:^{
                    _networkImage =  image;
                    [self insertMs:image];
                }];
                self.images[networkImg] = image;
                [data writeToFile:file atomically:YES];
            }];
        }
    }
}

- (void)setImgSize:(CGRect)imgSize {
    _imgSize = imgSize;
}

- (void)setPosition:(NSInteger)position {
    _position = position;
    if(_networkImage || _localImg) {
        NSAttributedString *string = [NSAttributedString attributedStringWithAttachment:_attch];
        NSMutableAttributedString *ms =[[NSMutableAttributedString alloc]init];
        ms = (NSMutableAttributedString *)self.attributedText;
        [ms replaceCharactersInRange:NSMakeRange(0, 1) withString:@""];
        [ms insertAttributedString:string atIndex:position];
    }
}

- (void)setImgMargin:(CGFloat)imgMargin {
     _imgMargin = imgMargin;
    if(_networkImage || _localImg) {
       
        
        NSMutableAttributedString *ms =[[NSMutableAttributedString alloc]init];
        ms = (NSMutableAttributedString *)self.attributedText;
        self.attributedText = ms;
        
        //创建透明图片
        UIView * imageV = [[UIView alloc]init];
        imageV.backgroundColor = [UIColor clearColor];
        imageV.bounds = CGRectMake(0, 0, imgMargin, imgMargin);
        
        //此为透明图片的边距
        UIImage * image = [self imageWithUIView:imageV];
        NSTextAttachment *attch = [[NSTextAttachment alloc] init];
        attch.image = image;
        attch.bounds = CGRectMake(0, 0, imgMargin, imgMargin);
        NSAttributedString *string = [NSAttributedString attributedStringWithAttachment:attch];
        
        if(_position == 0) {
            [ms insertAttributedString:string atIndex:_position+1];
        }else if(_position == ms.length-1){
            [ms insertAttributedString:string atIndex:_position];
        }else{
            [ms insertAttributedString:string atIndex:_position];
            [ms insertAttributedString:string atIndex:_position+2];
        }
    }
}

- (UIImage*) imageWithUIView:(UIView*) view{
    UIGraphicsBeginImageContext(view.bounds.size);
    CGContextRef currnetContext = UIGraphicsGetCurrentContext();
    [view.layer renderInContext:currnetContext];
    UIImage* image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return image;
}

- (NSOperationQueue *)queue
{
    if (!_queue) {
        _queue = [[NSOperationQueue alloc] init];
        _queue.maxConcurrentOperationCount = 3;
    }
    return _queue;
}

- (NSMutableDictionary *)images
{
    if (!_images) {
        _images = [NSMutableDictionary dictionary];
    }
    return _images;
}
@end


© 著作权归作者所有

赵大财
粉丝 22
博文 162
码字总数 38743
作品 0
长沙
私信 提问
加载中

评论(2)

赵大财
赵大财 博主

引用来自“qing1115016689”的评论

良心 楼主 博文多彩, 人还帅!! 44
不客气 欢迎传播
q
qing1115016689
良心 楼主 博文多彩, 人还帅!! 44
[iOS Animation]-CALayer 专用图层 富文本

富文本 iOS 6中,Apple给UILabel和其他UIKit文本视图添加了直接的属性化字符串的支持,应该说这是一个很方便的特性。不过事实上从iOS3.2开始CATextLayer就已经支持属性化字符串了。这样的话,...

浩浩老师
2015/09/23
92
0
《iPhone与iPad开发实战—iOS经典应用剖析》连载八

3.3.5 主视图控制器代码 主视图控制器是MainViewController ,由于视图使用的控件都已经在视图MainView 中定义了,所以在视图控制器MainViewController 代码很少了,在本应用中还设计了按钮按...

长平狐
2013/03/19
42
0
iOS 11 下 UICollectionView 出现滚动条被 HeaderView 遮挡的问题

iOS 11 下 UICollectionView 出现滚动条被 HeaderView 遮挡的问题 在使用了的 UICollectionView 页面中,滑动页面的时候滚动条会被 HeaderView 遮挡。导致滚动条看起来是断断续续的。 问题页...

宜铜铜
2017/10/21
136
0
用视图上移解决UITextField/UITextView被键盘遮盖问题

先看看UILabel/UITextField/UITextView的区别: UILabel 显示的文本只读,无法编辑,可以根据文字个数自动换行; UITextField 可编辑本文,但是无法换行,只能在一行显示;当点击键盘上的ret...

yoyoso
2015/03/18
564
0
UI_02 基础视图、程序启动流程

⼀、UITextField UITextField(输⼊框):是控制⽂本输⼊和显⽰的控件 UITextField核⼼功能主要包含3个⽅⾯: ⽂本显⽰ 输⼊控制 外观配置 1、⽂本显⽰ // textField.text = @"你好"; // tex...

黑伞将军
2015/08/17
55
0

没有更多内容

加载失败,请刷新页面

加载更多

java通过ServerSocket与Socket实现通信

首先说一下ServerSocket与Socket. 1.ServerSocket ServerSocket是用来监听客户端Socket连接的类,如果没有连接会一直处于等待状态. ServetSocket有三个构造方法: (1) ServerSocket(int port);...

Blueeeeeee
今天
6
0
用 Sphinx 搭建博客时,如何自定义插件?

之前有不少同学看过我的个人博客(http://python-online.cn),也根据我写的教程完成了自己个人站点的搭建。 点此:使用 Python 30分钟 教你快速搭建一个博客 为防有的同学不清楚 Sphinx ,这...

王炳明
昨天
5
0
黑客之道-40本书籍助你快速入门黑客技术免费下载

场景 黑客是一个中文词语,皆源自英文hacker,随着灰鸽子的出现,灰鸽子成为了很多假借黑客名义控制他人电脑的黑客技术,于是出现了“骇客”与"黑客"分家。2012年电影频道节目中心出品的电影...

badaoliumang
昨天
14
0
很遗憾,没有一篇文章能讲清楚线程的生命周期!

(手机横屏看源码更方便) 注:java源码分析部分如无特殊说明均基于 java8 版本。 简介 大家都知道线程是有生命周期,但是彤哥可以认真负责地告诉你网上几乎没有一篇文章讲得是完全正确的。 ...

彤哥读源码
昨天
15
0
jquery--DOM操作基础

本文转载于:专业的前端网站➭jquery--DOM操作基础 元素的访问 元素属性操作 获取:attr(name);$("#my").attr("src"); 设置:attr(name,value);$("#myImg").attr("src","images/1.jpg"); ......

前端老手
昨天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部