//
// 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. mysql-blog

    https://www.cnblogs.com/zhanht/p/5450559.html

  2. vue.js(一)

    之前看过一点vue.js但是知识点没做记录,现在也差不多不记得了,今天把以前看过的翻一遍,顺便提炼一下知识点 注意:下面的所有与vue相关的标签.指令都是写在id="app"的di ...

  3. Idea的注入和自动编译配置

    实时编译: 第二个(防止编译时Autowired报错): 修改成:

  4. Mirror--镜像使用的工作线程数

    /*在SQL SERVER 2005 及以后版本中, 使用'MAXworker thread' 来配置可用的线程数,默认设置为0 ,即自动控制线程数 计算最大工作线程数: 对于32 位系统:逻辑CPU ...

  5. 高性能Web服务器Nginx

    高性能Web服务器Nginx介绍 Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行.其特点是占有内存少,并发能力强 ...

  6. 单机部署PXC

    在一台机器上安装PXC Linux:centos 7     IP:192.168.30.221 PXC版本:Percona-XtraDB-Cluster-5.7.17-rel13-29.20.3.L ...

  7. 找回 linux root密码的几种方法

    第1种方法: 1.在系统进入单用户状态,直接用passwd root去更改  2.用安装光盘引导系统,进行linux rescue状态,将原来/分区挂接上来,作法如下: Java代码  #> c ...

  8. 运行.xcworkspace项目后报错:'React/RCTBundleURLProvider.h’ file not found

    情况:根据https://github.com/rebeccahughes/react-native-device-info添加依赖库,运行.xcworkspacea项目后报错 解决:Delete n ...

  9. 自定义 Repository 方法

    为某一个 Repository 上添加自定义方法 步骤: 定义一个接口: 声明要添加的, 并自实现的方法 提供该接口的实现类: 类名需在要声明的 Repository 后添加 Impl, 并实现方法 ...

  10. NodeJS学习笔记六

    Symbol简介 ES6引入了一种新的原始数据类型Symbol,表示独一无二的值.它是JavaScript语言的第七种数据类型,前六种是:Undefined.Null.布尔值(Boolean).字符串 ...