//
// BWLabel.h
// IOS_0119_label
//
// Created by ma c on 16/1/19.
// Copyright © 2016年 博文科技. All rights reserved.
// #import <UIKit/UIKit.h> typedef NS_ENUM(NSInteger, BWTextAlignment) {
BWTextAlignmentTop = ,
BWTextAlignmentBottom = ,
BWTextAlignmentCenter = ,
BWTextAlignmentLeftTop = ,//文字-左上
BWTextAlignmentLeftDown = ,//文字-左下
BWTextAlignmentRightTop = ,//文字-右上
BWTextAlignmentRightDown= //文字-右下
}; @interface BWLabel : UILabel @property (nonatomic, assign) BWTextAlignment bowenTextAlignment; @end //
// BWLabel.m
// IOS_0119_label
//
// Created by ma c on 16/1/19.
// Copyright © 2016年 博文科技. All rights reserved.
// #import "BWLabel.h" @implementation BWLabel - (instancetype)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
_bowenTextAlignment = BWTextAlignmentCenter; }
return self;
} - (CGRect)textRectForBounds:(CGRect)bounds limitedToNumberOfLines:(NSInteger)numberOfLines
{
CGRect bowenRect = [super textRectForBounds:bounds limitedToNumberOfLines:numberOfLines]; switch (_bowenTextAlignment) {
case BWTextAlignmentTop:
bowenRect.origin.x = (bounds.size.width - bowenRect.size.width)/;
bowenRect.origin.y = bounds.origin.y;
break;
case BWTextAlignmentCenter:
bowenRect.origin.x = (bounds.size.width - bowenRect.size.width)/;
bowenRect.origin.y = bounds.origin.y + (bounds.size.height - bowenRect.size.height)/;
break;
case BWTextAlignmentBottom:
bowenRect.origin.x = (bounds.size.width - bowenRect.size.width)/;
bowenRect.origin.y = bounds.origin.y + bounds.size.height - bowenRect.size.height;
case BWTextAlignmentLeftTop:
bowenRect.origin.y = bounds.origin.y;
bowenRect.origin.x = ;
break;
case BWTextAlignmentLeftDown:
bowenRect.origin.y = bounds.origin.y + bounds.size.height - bowenRect.size.height;
bowenRect.origin.x = ;
break;
case BWTextAlignmentRightTop:
bowenRect.origin.y = bounds.origin.y;
bowenRect.origin.x = bounds.size.width - bowenRect.size.width;
break;
case BWTextAlignmentRightDown:
bowenRect.origin.y = bounds.origin.y + bounds.size.height - bowenRect.size.height;
bowenRect.origin.x = bounds.size.width - bowenRect.size.width;
break;
}
return bowenRect;
} - (void)drawTextInRect:(CGRect)rect
{
CGRect bowenRect = [self textRectForBounds:rect limitedToNumberOfLines:self.lineBreakMode]; [super drawTextInRect:bowenRect];
}
@end //
// ViewController.m
// IOS_0119_label
//
// Created by ma c on 16/1/19.
// Copyright © 2016年 博文科技. All rights reserved.
// #import "ViewController.h"
#import "BWLabel.h"
#import <CoreText/CoreText.h> @interface ViewController () @end @implementation ViewController - (void)viewDidLoad {
[super viewDidLoad]; NSMutableAttributedString *bowenAttributedString = [[NSMutableAttributedString alloc] initWithString:@"举头望明月,低头思故乡"]; //字体颜色NSForegroundColorAttributeName
//字体大小NSFontAttributeName
NSDictionary *dict = [[NSDictionary alloc] initWithObjectsAndKeys:
[UIColor redColor], NSForegroundColorAttributeName,
[UIFont systemFontOfSize:], NSFontAttributeName, nil]; [bowenAttributedString setAttributes:dict range:NSMakeRange(, )]; //kCTUnderlineStyleAttributeName设置下划线
[bowenAttributedString addAttribute:(NSString *)kCTUnderlineStyleAttributeName value:(id)[NSNumber numberWithInt:kCTUnderlineStyleSingle] range:NSMakeRange(, )];
NSLog(@"%@",bowenAttributedString); //进行替换属性字符串通过NSRange
[bowenAttributedString replaceCharactersInRange:NSMakeRange(, ) withString:@"伤"]; BWLabel *label = [[BWLabel alloc] initWithFrame:CGRectMake(, , , )];
//label.text = @"123666";
label.attributedText = bowenAttributedString;
label.backgroundColor = [UIColor groupTableViewBackgroundColor];
label.bowenTextAlignment = BWTextAlignmentTop;
[self.view addSubview:label];
}

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event

{

NSLog(@"%@",[touches valueForKey:@"view"]);

}

 @end
我们先从NSMutableAttributedString看起(47行)到(48行),与(54行)到(67行)

//(1)通过给出的range替换属性字符串

- (void)replaceCharactersInRange:(NSRange)range withString:(NSString *)str;

//(2)通过给出的NSDictionary(设置属性字符串)

- (void)setAttributes:(nullable NSDictionary<NSString *, id> *)attrs range:(NSRange)range;


我们看一下属性字符串可以设置的Keys

//

//  NSAttributedString.h

//  UIKit

//

//  Copyright (c) 2011-2015, Apple Inc. All rights reserved.

//

#import <Foundation/NSAttributedString.h>

#import <UIKit/UIKitDefines.h>

@class NSFileWrapper;

@class NSURL;

NS_ASSUME_NONNULL_BEGIN

//字体

UIKIT_EXTERN NSString * const NSFontAttributeName NS_AVAILABLE(10_0, 6_0);   
//段落样式
UIKIT_EXTERN NSString * const NSParagraphStyleAttributeName NS_AVAILABLE(10_0, 6_0);

//文字颜色
UIKIT_EXTERN NSString * const NSForegroundColorAttributeName NS_AVAILABLE(10_0, 6_0);

//文字颜色背景
UIKIT_EXTERN NSString * const NSBackgroundColorAttributeName NS_AVAILABLE(10_0, 6_0);

//设置连体属性,取之味NSNumber对象(整数),0表示没有连体字符串,1表示使用默认连体字符串
UIKIT_EXTERN NSString * const NSLigatureAttributeName NS_AVAILABLE(10_0, 6_0);           
//设置字符间距
UIKIT_EXTERN NSString * const NSKernAttributeName NS_AVAILABLE(10_0, 6_0);

//设置删除线
UIKIT_EXTERN NSString * const NSStrikethroughStyleAttributeName NS_AVAILABLE(10_0, 6_0);

//下划线
UIKIT_EXTERN NSString * const NSUnderlineStyleAttributeName NS_AVAILABLE(10_0, 6_0);

//填充部分颜色
UIKIT_EXTERN NSString * const NSStrokeColorAttributeName NS_AVAILABLE(10_0, 6_0);

//设置笔画宽度
UIKIT_EXTERN NSString * const NSStrokeWidthAttributeName NS_AVAILABLE(10_0, 6_0);

//阴影属性
UIKIT_EXTERN NSString * const NSShadowAttributeName NS_AVAILABLE(10_0, 6_0);

//文本特殊效果
UIKIT_EXTERN NSString *const NSTextEffectAttributeName NS_AVAILABLE(10_10, 7_0);

//文本附件,取值为NSTextAttachment对象,用于图文混排CoreText
UIKIT_EXTERN NSString * const NSAttachmentAttributeName NS_AVAILABLE(10_0, 7_0);

//设置链接属性,点击后调用浏览器打开指定URL地址
UIKIT_EXTERN NSString * const NSLinkAttributeName NS_AVAILABLE(10_0, 7_0);

//设置基线偏移值,正,上偏,负下偏
UIKIT_EXTERN NSString * const NSBaselineOffsetAttributeName NS_AVAILABLE(10_0, 7_0);

//设置下划线
UIKIT_EXTERN NSString * const NSUnderlineColorAttributeName NS_AVAILABLE(10_0, 7_0);

//设置删除线的颜色
UIKIT_EXTERN NSString * const NSStrikethroughColorAttributeName NS_AVAILABLE(10_0, 7_0);  
//设置字形倾斜度,取值为NSNumber(float),正,向右倾斜,负,向左倾斜

UIKIT_EXTERN NSString * const NSObliquenessAttributeName NS_AVAILABLE(10_0, 7_0);  
//设置文本横向拉伸属性,取之为NSnumber(float)正值,横向拉伸文本,负值,横向压缩文本

UIKIT_EXTERN NSString * const NSExpansionAttributeName NS_AVAILABLE(10_0, 7_0);           
//设置蚊子书写方向,从左向右书写或者从右向左书写

UIKIT_EXTERN NSString * const NSWritingDirectionAttributeName NS_AVAILABLE(10_6, 7_0);

//设置蚊子拍版方向,取值为NSNumber对象(整数),0横排文本,1竖排文本
UIKIT_EXTERN NSString * const NSVerticalGlyphFormAttributeName NS_AVAILABLE(10_7, 6_0);

苹果自己的API用来设置属性字符串的Keys的
 或者,刚才的操作~在初始化的时候setAttributes也是可以的

 

//---------------然后我们看看类蔟中的内容---------------
//(1)设置属性字符串的属性 

- (void)addAttribute:(NSString *)name value:(id)value range:(NSRange)range;

//(2)通过NSDictionary设置属性字符串的属性 

- (void)addAttributes:(NSDictionary<NSString *, id> *)attrs range:(NSRange)range; 

//(3)删除属性字符串的属性

- (void)removeAttribute:(NSString *)name range:(NSRange)range;

//(4)替换属性字符串

- (void)replaceCharactersInRange:(NSRange)range withAttributedString:(NSAttributedString*)attrString;

//(5)插入属性字符串

- (void)insertAttributedString:(NSAttributedString *)attrString atIndex:(NSUInteger)loc;

//(7)拼接属性字符串
- (void)appendAttributedString:(NSAttributedString *)attrString;

//(8)删除属性字符串

- (void)deleteCharactersInRange:(NSRange)range;

//(9)设置属性字符串

- (void)setAttributedString:(NSAttributedString *)attrString;

- (void)beginEditing;

- (void)endEditing;

有人会问了为什么我的属性字符串加载不出来,是因为,我加了如下的代码
这就涉及到了CoreText和CoreGray还有,OpenGLES了,先看代码,听我逐一讲解

#import <CoreText/CoreText.h>

- (void)drawRect:(CGRect)rect

{

[super drawRect:rect];

NSAttributedString *attriString = orangeAttributeString;

CGContextRef ctx = UIGraphicsGetCurrentContext();

CGContextConcatCTM(ctx, CGAffineTransformScale(CGAffineTransformMakeTranslation(0, rect.size.height), 1.f, -1.f));

CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString((CFAttributedStringRef)attriString);

CGMutablePathRef path = CGPathCreateMutable();

CGPathAddRect(path, NULL, rect);

CTFrameRef frame = CTFramesetterCreateFrame(framesetter, CFRangeMake(0, 0), path, NULL);

CFRelease(path);

CFRelease(framesetter);

CTFrameDraw(frame, ctx);

CFRelease(frame);

}

今天继续更新(关于CGContextRef)的介绍

相当于重写了UIView的drawRect方法(CoreGraphics)

UIKIT_EXTERN CGContextRef __nullable UIGraphicsGetCurrentContext(void) CF_RETURNS_NOT_RETAINED;
这是CGContextRef的定义

#define UIKIT_EXTERN         extern __attribute__((visibility ("default")))

这是UIKIT_EXTERN的定义
偏向C的语言方法
CGContextRef是CoreFoundation框架的对象
释放的时候ARC控制不了,所以内存管理使用CFRelease来释放CoreFoundation对象

转自:http://user.qzone.qq.com/282187892?ptlang=2052

IOS UI-标签(Label)的高级应用的更多相关文章

  1. 【Java EE 学习 36】【struts2】【struts2系统验证】【struts2 ognl值栈】【struts2 ongl标签】【struts2 UI标签】【struts2模型驱动和令牌机制】

    一.struts2系统验证 1.基于struts2系统验证的方式实际上就是通过配置xml文件的方式达到验证的目的. 2.实际上系统校验的方法和手工校验的方法在底层的基本实现是相同的.但是使用系统校验的 ...

  2. Struts2 UI标签

    表单标签的共同属性(该属性只在没有使用 simple 主题时才可以使用) form 标签  用来呈现 HTML 语言中的表单元素 默认情况下, form 标签将被呈现为一个表格形式的 HTML 表单. ...

  3. OGNL逻辑标签,UI标签

    逻辑标签 public class IndexAction extends BasicAction{ private static final long serialVersionUID = 1L; ...

  4. IOS UI 第八篇:基本UI

    实现图片的滚动,并且自动停止在每张图片上     - (void)viewDidLoad{    [super viewDidLoad]; UIScrollView *scrollView = [[U ...

  5. Struts2第十一篇【简单UI标签、数据回显】

    Struts2UI标签 Sturts2为了简化我们的开发,也为我们提供了UI标签-也就是显示页面的标签-.. 但是呢,Struts2是服务端的框架,因此使用页面的标签是需要在服务器端解析然后再被浏览器 ...

  6. Struts2【UI标签、数据回显、资源国际化】

    Struts2UI标签 Sturts2为了简化我们的开发,也为我们提供了UI标签...也就是显示页面的标签..... 但是呢,Struts2是服务端的框架,因此使用页面的标签是需要在服务器端解析然后再 ...

  7. 【转】JSF中的三大核心组件 UI标签的详细介绍和使用举例

    JSF提供了大量的UI标签来简化创建视图.这些UI标签类似于ASP.NET中的服务器组件.使用这些标签,可以通过其value,binding,action,actionListener等属性直接绑定到 ...

  8. struts2 UI标签 和 主题

    四.Struts2的UI标签和主题 1.Struts2中UI标签的优势 自动的数据回显和错误提示功能 自带的简单样式和排版 2.表单标签的通用属性 说明:UI标签中value的取值一般都是字符串. 2 ...

  9. 《IT蓝豹》高仿花田ios版标签移动效果

    高仿花田ios版标签移动效果,长按每一个item拖动到自己想要位置后,后面位置移动补全效果 . 本项目适合研究gridview拖拽效果的朋友下载. 学习android动画特效. 本项目主要靠DragG ...

  10. [IOS]IOS UI指南

    [IOS]IOS UI指南 众所周知,IOS的界面设计,越来越流行,可以说都形成了一个标准,搜集了一些资料,供自己以后学习使用! iOS Human Interface Guidelines (中文翻 ...

随机推荐

  1. <sourceDirectory>src/main/java</sourceDirectory> mvn 配置 包路径

    <?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven ...

  2. Ubuntu proxychains && setProxy及 unsetProxy

    https://www.socks-proxy.net/ (ubuntu proxy )[ lantern -addr 0.0.0.0:8787 proxychains4 printenv http: ...

  3. LAMP开发(1)

    apache web服务器软件,最近款的有7兆大小,工作:监听端口,接收请求,解析HTTP协议,转发给PHP比如:当一个客户端的请求发过来的时候,通常客户端(浏览器),请求发送给某一台IP,这个IP肯 ...

  4. Django - Jsonp、CORS

    一.同源策略 https://www.cnblogs.com/yuanchenqi/articles/7638956.html 同源策略(Same origin policy)是一种约定,它是浏览器最 ...

  5. android 导出数据库文件

    1.打开dos窗口,进入自己SDK路径下,再进入platform-tools下边 2.进入shell模式: adb shell 3.获取所有root权限: su root 4.打开需要导出的数据库文件 ...

  6. leetcode——Search for a Range 排序数组中寻找目标下标范围(AC)

    Given a sorted array of integers, find the starting and ending position of a given target value. You ...

  7. python用pyinstaller打包成exe文件

    版本为Python2.7 一.安装Pyinstaller 1.安装pywin32 下载安装文件:查找到跟自己适用的python版本及window系统版本匹配的pywin32,下载后安装  使用pip命 ...

  8. sql 用xml方式插入数据乱码问题解决方法

    sql 使用存储过程 参数为xml字符串 xml不要写编码,如下 <?xml version=\"1.0\" ?><root>数据字符串</root& ...

  9. ReactNative 环境配置

    一直是从事iOS的开发,现在研究下mac环境下reatNative的环境配置: 1. 安装HomeBlew(OS系统上的一个安装包管理器,安装后可以方便后续安装包的安装.) 终端命令: ruby -e ...

  10. Common Knowledge

    2014-08-23 11:01:11 -6:四面体 (1)内切球半径:r = 3V / (S1+S2+S3+S4) (2)体积:将四点组成三个向量AB,AC,AD,向量的混合积就是它们组成的平行六面 ...