UIKit之UILabel篇

1.初始化控件(文本控件)

UILabel *etlbl = [[UILable alloc]init];


2.设置基本属性及用法

  1. frame:设置UILable的显示起点坐标(x,y)和宽高(width,height)

etlbl.frame = CGRectMake(<#x起点#>, <#y起点#>, <#宽度#>,<#高度#>);

  1. text:设置文本控件的内容(即文字显示的内容)

etlbl.text = @"文字显示内容";

  1. font:文字字体大小及类型(常规,加粗,细小等)

etlbl.font = [UIFont systemFontOfSize:15];

  1. textColor:文字颜色

etlbl.textColor = [UIColor greenColor];

  1. shadowOffSet:阴影的大小

x轴及y轴的偏移量
etlbl.shadowOffset = CGSizeMake(5, 5);

  1. shadowColor:阴影部分颜色

etlbl.shadowColor = [UIColor yellowColor];

  1. textAlignment:文字的对其方式(剧中,左对齐,右对齐),系统默认的三种方式

etlbl.textAlignment = NSTextAlignmentCenter; //中心对齐(默认横向对齐)
etlbl.textAlignment = NSTextAlignmentRight; //文字靠右对齐
etlbl.textAlignment = NSTextAlignmentLeft; //文字靠左对齐

  1. lineBreakMode
  2. attributedText:可以自定义某部分显示大小和颜色

配合 NSMutableAttributedString属性介绍及使用

/**********属性方法***********/
//为某一范围内文字设置多个属性
- (void)setAttributes:(NSDictionary *)attrs range:(NSRange)range;
//为某一范围内文字添加某个属性
- (void)addAttribute:(NSString *)name value:(id)value range:(NSRange)range;
//为某一范围内文字添加多个属性
- (void)addAttributes:(NSDictionary *)attrs range:(NSRange)range;
//移除某范围内的某个属性
- (void)removeAttribute:(NSString *)name range:(NSRange)range;
/**********常用属性keys***********/
NSFontAttributeName             //字体
NSParagraphStyleAttributeName   //段落格式 
NSForegroundColorAttributeName  //字体颜色
NSBackgroundColorAttributeName  //背景颜色
NSStrikethroughStyleAttributeName//删除线格式
NSUnderlineStyleAttributeName    //下划线格式
NSStrokeColorAttributeName       //删除线颜色
NSStrokeWidthAttributeName       //删除线宽度
NSShadowAttributeName            //阴影

全部NSMutableAttributedString属性,key and value

//***********keys***********************************Value****************************************//
    NSFontAttributeName;                  //字体,value是UIFont对象
    NSParagraphStyleAttributeName;        //绘图的风格(居中,换行模式,间距等诸多风格),value是NSParagraphStyle对象
    NSForegroundColorAttributeName;       // 文字颜色,value是UIFont对象
    NSBackgroundColorAttributeName;       // 背景色,value是UIFont
    NSLigatureAttributeName;              //  字符连体,value是NSNumber
    NSKernAttributeName;                  // 字符间隔
    NSStrikethroughStyleAttributeName;    //删除线,value是NSNumber
    NSUnderlineStyleAttributeName;        //下划线,value是NSNumber
    NSStrokeColorAttributeName;           //描绘边颜色,value是UIColor
    NSStrokeWidthAttributeName;           //描边宽度,value是NSNumber
    NSShadowAttributeName;                //阴影,value是NSShadow对象
    NSTextEffectAttributeName;            //文字效果,value是NSString
    NSAttachmentAttributeName;            //附属,value是NSTextAttachment 对象
    NSLinkAttributeName;                  //链接,value是NSURL or NSString
    NSBaselineOffsetAttributeName;        //基础偏移量,value是NSNumber对象
    NSUnderlineColorAttributeName;        //下划线颜色,value是UIColor对象
    NSStrikethroughColorAttributeName;    //删除线颜色,value是UIColor
    NSObliquenessAttributeName;           //字体倾斜
    NSExpansionAttributeName;             //字体扁平化
    NSVerticalGlyphFormAttributeName;     //垂直或者水平,value是 NSNumber,0表示水平,1垂直
/*****************************************************************************************************/

基本用法如下:

/************************************************某区域内************************************************************/
NSMutableAttributedString *string = [[NSMutableAttributedString alloc]initWithString:@"0元"];
 [string setAttributes:@{NSFontAttributeName:[UIFont systemFontOfSize:14]} range:NSMakeRange(string.length-1, 1)];
 etlbl.attributedText = string;
/************************************************基本用法************************************************************/
    NSString *content = @"内容太多,需要自适应才能解决问题,所以需要写这个扩展类,内容太多,需要自适应才能解决问题,所以需要写这个扩展类";

    NSMutableAttributedString *string = [[NSMutableAttributedString alloc]initWithString:content];
    //字体大小
    [string addAttribute:NSFontAttributeName
                   value:[UIFont systemFontOfSize:10]
                   range:NSMakeRange(0, 1)];
    //字体颜色
    [string addAttribute:NSForegroundColorAttributeName
                   value:[UIColor yellowColor]
                   range:NSMakeRange(1, 1)];
    //字体背景颜色
    [string addAttribute:NSBackgroundColorAttributeName
                   value:[UIColor purpleColor]
                   range:NSMakeRange(2, 1)];

    //添加下划线
    [string addAttribute:NSUnderlineStyleAttributeName
                   value:@(NSUnderlineStyleSingle)
                   range:NSMakeRange(3, 1)];
    //添加下划线颜色
    [string addAttribute:NSUnderlineColorAttributeName
                   value:[UIColor redColor]
                   range:NSMakeRange(3, 1)];
    
    
    UILabel *etlbl3 = [[UILabel alloc]initWithFrame:CGRectMake(100, 400, 200, 30)];
    etlbl3.attributedText = string;
    [self.view addSubview:etlbl3];
/************************************************基本用法************************************************************/

  • userInteractionEnabled:设置是否可以用户交互,默认NO;一般应用于文本控件添加触摸手势
  • numberOfLines:设置文本可以显示的行数,默认1行;如果需要自适应文本高度需要设置0行
  • 最后需要将控件添加到父视图上
    *补充:富文本中间横线(效果及代码如下)


    中间横线.png
#define SystemVersion [[[UIDevice currentDevice] systemVersion] floatValue]

- (void)viewDidLoad {
    [super viewDidLoad];
    
    NSString *str = [NSString stringWithFormat:@"%.1f", 9999.0];
    
    NSRange strRange1 = {[@"京东价:" length], [str length]};
    
    NSMutableAttributedString *attributeMarket = [[NSMutableAttributedString alloc] initWithString:[NSString stringWithFormat:@"%@%@", @"京东价:", str]];
    
    if (SystemVersion >= 10.3) {
        
        [attributeMarket addAttribute:NSStrikethroughStyleAttributeName
                                value:@(NSUnderlineStyleSingle)
                                range:strRange1];
        
        [attributeMarket addAttribute:NSBaselineOffsetAttributeName
                                value:@(NSUnderlineStyleNone)
                                range:strRange1];
    } else {
        
        [attributeMarket addAttribute:NSStrikethroughStyleAttributeName
                                value:[NSNumber numberWithInteger:NSUnderlineStyleSingle]
                                range:strRange1];
    }
    
    [attributeMarket addAttribute:NSForegroundColorAttributeName
                            value:[UIColor redColor]
                            range:strRange1];

    UILabel *etlbl3 = [[UILabel alloc]initWithFrame:CGRectMake(20, 200, CGRectGetWidth(self.view.frame)-40, 30)];
    
    etlbl3.attributedText = attributeMarket;
    
    [self.view addSubview:etlbl3];
}

3.特殊用法

1.自适应高度或者宽度

UILable扩展类及使用方法:
etlbl.text = @"内容太多,需要自适应才能解决问题,所以需要写这个扩展类";
[etlbl setAutoHeigh];

typedef enum : NSUInteger {
    NSTextAlignmentVertailTop,
    NSTextAlignmentVertailTypeMiddle,//defalut
    NSTextAlignmentVertailTypeBottom,
} NSTextAlignmentVertailType;

@interface UILabel (Extern)

/**
 *  自动设置高度
 */
- (void)setAutoHeigh;

/**
 *  设置垂直方向对齐
 *
 *  @param textAlignment 对齐方式
 */
- (void)setTextAlginVertail:(NSTextAlignmentVertailType)textAlignment;

/**
 *  获取textContent内容所需要的尺寸
 *
 *  @return size
 */
- (CGSize)getContentSize;

@end


@implementation UILabel (Extern)
- (void)setAutoHeigh{
    NSAssert(self.frame.size.width==0||self.frame.size.height==0?nil:@"", @"请设置UILable的width或者Height");
    
    [self setNumberOfLines:0];
    CGSize size =  [self.text boundingRectWithSize:CGSizeMake(self.frame.size.width, MAXFLOAT)
                                           options:NSStringDrawingUsesLineFragmentOrigin
                                        attributes:@{NSFontAttributeName:self.font}
                                           context:nil].size;
    self.frame =  CGRectMake(self.frame.origin.x, self.frame.origin.y, self.frame.size.width, size.height);
}
- (void)setTextAlginVertail:(NSTextAlignmentVertailType)textAlignment{
    CGSize fontSize =  [self.text sizeWithAttributes:@{NSFontAttributeName:self.font}];
    
    double finalHeight = fontSize.height*self.numberOfLines;
    double finalWidth  = self.frame.size.width;
    
    CGSize stringSize = [self.text boundingRectWithSize:CGSizeMake(finalWidth, finalHeight)
                                                options:NSStringDrawingUsesLineFragmentOrigin
                                             attributes:@{NSFontAttributeName:self.font}
                                                context:nil].size;
    
    int newLinesToPad = (finalHeight - stringSize.width) /fontSize.width;
    switch (textAlignment) {
        case NSTextAlignmentVertailTop:{
            for (int i = 0; i<newLinesToPad; i++) {
                self.text = [self.text stringByAppendingString:@"\n "];
            }
        }
            break;
        case NSTextAlignmentVertailTypeMiddle:{
        } break;
        case NSTextAlignmentVertailTypeBottom:{
            for(int i=0; i<newLinesToPad; i++){
                self.text = [NSString stringWithFormat:@" \n%@",self.text];
            }
        
            break;
        default:
            break;
    }

}
- (CGSize)getContentSize{
    return [self.text boundingRectWithSize:CGSizeMake(self.frame.size.width, MAXFLOAT)
                                   options:NSStringDrawingUsesLineFragmentOrigin
                                attributes:@{NSFontAttributeName:self.font}
                                   context:nil].size;
}

2.获取文本内容所需要的CGSize

NSString的扩展类及用法

    NSString *content = @"内容太多,需要自适应才能解决问题,所以需要写这个扩展类,内容太多,需要自适应才能解决问题,所以需要写这个扩展类";
    UIFont *font = [UIFont systemFontOfSize:15];
    CGFloat maxHeigth = 200;
    CGFloat maxWidht  = 200;
    CGSize size1  = [NSString sizeTextContentMaxHeight:maxHeigth  font:font withContent:content];
    CGSize size2  = [NSString sizeTextContentMaxWidth:maxWidht    font:font withContent:content];
    CGFloat width = [NSString widthTextContentMaxHeight:maxHeigth font:font withContent:content];
    CGFloat height= [NSString heigtTextContentMaxWidth:maxWidht   font:font withContent:content];
@interface NSString (Extern)

/**
 *  计算文本内容的高度(输入宽度,获取高度)
 *
 *  @param width   最大宽度
 *  @param font    字体大小
 *  @param content 文本内容
 *
 *  @return height
 */
+ (CGFloat)heigtTextContentMaxWidth:(CGFloat)maxWidth  font:(UIFont*)font withContent:(NSString*)content;
/**
 *  计算文本内容的宽度(输入高度,获取宽度)
 *
 *  @param width   最大高度
 *  @param font    字体大小
 *  @param content 文本内容
 *
 *  @return width
 */
+ (CGFloat)widthTextContentMaxHeight:(CGFloat)maxHeight font:(UIFont*)font withContent:(NSString*)content;

/**
 *  计算文本内容的尺寸(输入宽度,获取尺寸)
 *
 *  @param width   最大宽度
 *  @param font    字体大小
 *  @param content 文本内容
 *
 *  @return size
 */
+ (CGSize)sizeTextContentMaxWidth:(CGFloat)maxWidth font:(UIFont*)font withContent:(NSString*)content;
/**
 *  计算文本内容的尺寸(输入高度,获取尺寸)
 *
 *  @param height  最大高度
 *  @param font    字体大小
 *  @param content 文本内容
 *
 *  @return size
 */
+ (CGSize)sizeTextContentMaxHeight:(CGFloat)maxheight font:(UIFont*)font withContent:(NSString*)content;

@end

@implementation NSString (Extern)

+ (CGFloat)heigtTextContentMaxWidth:(CGFloat)maxWidth  font:(UIFont*)font withContent:(NSString*)content{
    return [self sizeTextContentMaxWidth:maxWidth font:font withContent:content].height;
}
+ (CGFloat)widthTextContentMaxHeight:(CGFloat)maxHeight font:(UIFont*)font withContent:(NSString*)content{
    return [self sizeTextContentMaxHeight:maxHeight font:font withContent:content].width;
}

+ (CGSize)sizeTextContentMaxWidth:(CGFloat)maxWidth font:(UIFont*)font withContent:(NSString*)content{
    return [content boundingRectWithSize:CGSizeMake(maxWidth, MAXFLOAT)
                                 options:NSStringDrawingUsesLineFragmentOrigin
                              attributes:@{NSFontAttributeName:font}
                                 context:nil].size;
}
+ (CGSize)sizeTextContentMaxHeight:(CGFloat)maxheight font:(UIFont*)font withContent:(NSString*)content{
    return [content boundingRectWithSize:CGSizeMake(MAXFLOAT,maxheight)
                                 options:NSStringDrawingUsesLineFragmentOrigin
                              attributes:@{NSFontAttributeName:font}
                                 context:nil].size;
}

@end

4.UILabel的居中上中下方向对齐基类

使用方法如下:

TJLabel *etlbl = [[TJLabel alloc]init];
etlbl.frame = CGRectMake(0, 0, 200, 40);
etlbl.text  = @"文字内容";
[etlbl setVerticalAlignment:NSTextVerticalAlignmentBottom];
[self.view addSubview:etlbl];

.h文件

/**
 * UILabel设置居上对齐,居中对齐,居下对齐
 */

typedef NS_ENUM(NSInteger, NSTextVerticalAlignment) {
    NSTextVerticalAlignmentTop = 0,
    NSTextVerticalAlignmentMiddle,
    NSTextVerticalAlignmentBottom
};

@interface TJLabel : UILabel
{
    @private
    NSTextVerticalAlignment _verticalAlignment;
}

@property (nonatomic) NSTextVerticalAlignment verticalAlignment;

@end

.m文件

@implementation TJLabel

@synthesize verticalAlignment = verticalAlignment_;

- (id)initWithFrame:(CGRect)frame {
    if (self = [super initWithFrame:frame]) {
        self.verticalAlignment = NSTextVerticalAlignmentMiddle;
    }
    return self;
}

- (void)setVerticalAlignment:(NSTextVerticalAlignment)verticalAlignment {
    verticalAlignment_ = verticalAlignment;
    [self setNeedsDisplay];
}

- (CGRect)textRectForBounds:(CGRect)bounds limitedToNumberOfLines:(NSInteger)numberOfLines {
    CGRect textRect = [super textRectForBounds:bounds limitedToNumberOfLines:numberOfLines];
    switch (self.verticalAlignment) {
        case NSTextVerticalAlignmentTop:
            textRect.origin.y = bounds.origin.y;
            break;
        case NSTextVerticalAlignmentBottom:
            textRect.origin.y = bounds.origin.y + bounds.size.height - textRect.size.height;
            break;
        case NSTextVerticalAlignmentMiddle:
        default:
            textRect.origin.y = bounds.origin.y + (bounds.size.height - textRect.size.height) / 2.0;
    }
    return textRect;
}

-(void)drawTextInRect:(CGRect)requestedRect {
    CGRect actualRect = [self textRectForBounds:requestedRect limitedToNumberOfLines:self.numberOfLines];
    [super drawTextInRect:actualRect];
}
@end
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,937评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,503评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,712评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,668评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,677评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,601评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,975评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,637评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,881评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,621评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,710评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,387评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,971评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,947评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,189评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,805评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,449评论 2 342

推荐阅读更多精彩内容