设置UILabel 两端对齐



遇到这个问题, 本来想找现成的方案,结果半天没合适的 于是自己搞了一个,其实挺简单,给需要的朋友:


  1. 直接上代码
- (void)viewDidLoad {
    [super viewDidLoad];
   NSString * string = @"你好";
    [self conversionCharacterInterval:4 current:string withLabel:self.tempLabel];

    NSString * string1 = @"你好吗";
    [self conversionCharacterInterval:4 current:string1 withLabel:self.tempLabel1];

    NSString * string2 = @"我不好呀";
    [self conversionCharacterInterval:4 current:string2 withLabel:self.tempLabel2];

    // Do any additional setup after loading the view, typically from a nib.
}
/**
 *  @brief  添加字符间距
 *
 *  @param  maxInteger  最大字符长度
 *  @param  currentString   当前显示字符
 *  @param  label   显示label
 */
- (void)conversionCharacterInterval:(NSInteger)maxInteger current:(NSString *)currentString withLabel:(UILabel *)label
{
    CGRect rect = [@"你" boundingRectWithSize:CGSizeMake(200,label.frame.size.height)
                                              options:NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading
                                           attributes:@{NSFontAttributeName: label.font}
                                              context:nil];

    NSMutableAttributedString *attrString = [[NSMutableAttributedString alloc] initWithString:currentString];
    [attrString addAttribute:NSKernAttributeName value:@(((maxInteger - currentString.length) * rect.size.width)/(currentString.length - 1)) range:NSMakeRange(0, currentString.length)];
    label.attributedText = attrString;
}


2 用到知识点: NSAttributedString UIKit Additions 参考文:http://developer.apple.com/library/ios/#documentation/uikit/reference/NSAttributedString_UIKit_Additions/RevisionHistory.html

概述

UIKit 在 NSAttributedString 中加入了新的方法,以支持格式化文本的绘制、计算文本在绘制前的大小及空间。这些方法不影响文本的内容,只影响绘制的过程。

默认,文本绘制使用本地坐标,内容从某个点向右向下绘制。当你放置文本内容时,记住文本块的左上角就是绘制的起点。

你可以在主线程之外使用这些方法,但是,如果是支持NSStringDrawingContext 的任何方法,则无法跨过线程或 dispatch queue 共享 NSStringDrawiingContext。

实例方法

绘制文本

– drawAtPoint:

– drawInRect:

– drawWithRect:options:context:

计算文本的空间

– size

– boundingRectWithSize:options:context:

实例方法

boundingRectWithSize:options:context:

返回文本绘制所占据的矩形空间。

  • (CGRect)boundingRectWithSize:(CGSize)size options:(NSStringDrawingOptions)options context:(NSStringDrawingContext *)context

参数

size

宽高限制,用于计算文本绘制时占据的矩形块。

Thewidth and height constraints to apply when computing the string’s boundingrectangle.

options

文本绘制时的附加选项。可能取值请参考“NSStringDrawingOptions”。

context

context上下文。包括一些信息,例如如何调整字间距以及缩放。最终,该对象包含的信息将用于文本绘制。该参数可为 nil 。

返回值

一个矩形,大小等于文本绘制完将占据的宽和高。

讨论

可以使用该方法计算文本绘制所需的空间。size 参数是一个constraint ,用于在绘制文本时作为参考。但是,如果绘制完整个文本需要更大的空间,则返回的矩形大小可能比 size 更大。一般,绘制时会采用constraint 提供的宽度,但高度则会根据需要而定。

特殊情况

为了计算文本块的大小,该方法采用默认基线。

如果 NSStringDrawingUsesLineFragmentOrigin未指定,矩形的高度将被忽略,同时使用单线绘制。(由于一个 bug,在 iOS6 中,宽度会被忽略)

兼容性

iOS 6.0 以后支持。

声明于

NSStringDrawing.h

drawAtPoint:

从指定点(当前图形上下文)开始绘制文本。

  • (void)drawAtPoint:(CGPoint)point

参数

point

当前图形上下文中的点,文本将从此开始绘制。该图形上下文的坐标系通常由当前正在绘制的视图定义。

讨论

该方法从某个点开始绘制整个文本。该方法根据 attributedstring 的属性来绘制行。如果文本中出现换行符,将进行换行,后续的文本将被放到下一行的最初位置。

兼容性

iOS 6.0 以后支持.

声明于

NSStringDrawing.h

drawInRect:

在当前图形上下文的指定矩形内绘制文本。

  • (void)drawInRect:(CGRect)rect

参数

rect

指定绘制文本的矩形范围。

讨论

该方法在指定矩形内绘制尽可能多的文本内容,必要时会压缩字符。如果对于该矩形来说,文本内容太长,该方法绘制尽可能多的内容,剩余内容将被剪切。该方法用 attributed string 的属性来绘制行。如果文本中出现换行符,将进行换行,后续的文本将被放到下一行的最初位置。

兼容性

Available in iOS 6.0 and later.

Declared In

NSStringDrawing.h

drawWithRect:options:context:

用提供的选项将文本绘制到指定的矩形分为内。

  • (void)drawWithRect:(CGRect)rect options:(NSStringDrawingOptions)options context:(NSStringDrawingContext *)context

参数

rect

指定在某个矩形中绘制文本。

options

文本绘制选项。可能取值请参考“NSStringDrawingOptions”。

context

上下文对象,用于包含信息:如何调整字间距以及缩放。最终,该对象包含的信息将用于文本绘制。该参数可为 nil。

讨论

该方法在指定矩形内绘制尽可能多的文本内容,必要时会对字符进行压缩。如果矩形内要绘制的文本内容太长,该方法将根据需要缩放字体,或者调整字符间距。

该方法用 attributed string 的属性来绘制行。如果文本中出现换行符,将进行换行,后续的文本将被放到下一行的最初位置。

特殊情况

该方法采用默认基线。

如果NSStringDrawingUsesLineFragmentOrigin 未指定,矩形的高度将被忽略,同时使用单线绘制。(由于一个 bug,在 iOS6 中,宽度会被忽略)

兼容性

iOS 6.0 以后支持.

声明于

NSStringDrawing.h

size

返回文本绘制所需 size。

Returns the sizerequired to draw the string.

  • (CGSize)size

返回值

绘制完整文本所需的最小 size。

讨论

可以用该方法在绘制之前计算需要多大空间。

兼容性

iOS 6.0 以后支持.

声明于

NSStringDrawing.h

常量

NSStringDrawingOptions

文本绘制选项。

enum {

NSStringDrawingTruncatesLastVisibleLine= 1 << 5,

NSStringDrawingUsesLineFragmentOrigin= 1 << 0,

NSStringDrawingUsesFontLeading= 1 << 1,

NSStringDrawingUsesDeviceMetrics= 1 << 3,

};

typedef NSInteger NSStringDrawingOptions;

常量

NSStringDrawingTruncatesLastVisibleLine

如果文本内容超出指定的矩形限制,文本将被截去并在最后一个字符后加上省略号。如果指定了NSStringDrawingUsesLineFragmentOrigin选项,则该选项被忽略。

NSStringDrawingUsesLineFragmentOrigin

绘制文本时使用 line fragement origin 而不是 baseline origin。

Theorigin specified when drawing the string is the line fragment origin and notthe baseline origin.

NSStringDrawingUsesFontLeading

计算行高时使用行间距。(译者注:字体大小+行间距=行高)

NSStringDrawingUsesDeviceMetrics

计算布局时使用图元字形(而不是印刷字体)。

Usethe image glyph bounds (instead of the typographic bounds) when computinglayout.

划线样式属性

指定下划线或删除线样式。

enum {

NSUnderlineStyleNone = 0x00,

NSUnderlineStyleSingle= 0x01,

};

常量

NSUnderlineStyleNone

不划线。

NSUnderlineStyleSingle

单线

讨论

可以在属性字串的 NSUnderlineStyleAttributeName和NSStrikethroughStyleAttributeName属性上使用这些常量。

字符属性

字符属性可以应用于 attributed string 的文本中。

NSString *const NSFontAttributeName;

NSString *const NSParagraphStyleAttributeName;

NSString *const NSForegroundColorAttributeName;

NSString *const NSBackgroundColorAttributeName;

NSString *const NSLigatureAttributeName;

NSString *const NSKernAttributeName;

NSString *const NSStrikethroughStyleAttributeName;

NSString *const NSUnderlineStyleAttributeName;

NSString *const NSStrokeColorAttributeName;

NSString *const NSStrokeWidthAttributeName;

NSString *const NSShadowAttributeName;

NSString *const NSVerticalGlyphFormAttributeName;

常量

NSFontAttributeName

该属性所对应的值是一个 UIFont 对象。该属性用于改变一段文本的字体。如果不指定该属性,则默认为12-point Helvetica(Neue)。

NSParagraphStyleAttributeName

该属性所对应的值是一个 NSParagraphStyle 对象。该属性在一段文本上应用多个属性。如果不指定该属性,则默认为 NSParagraphStyle 的defaultParagraphStyle 方法返回的默认段落属性。

NSForegroundColorAttributeName

该属性所对应的值是一个 UIColor 对象。该属性用于指定一段文本的字体颜色。如果不指定该属性,则默认为黑色。

NSBackgroundColorAttributeName

该属性所对应的值是一个 UIColor 对象。该属性用于指定一段文本的背景颜色。如果不指定该属性,则默认无背景色。

NSLigatureAttributeName

该属性所对应的值是一个 NSNumber 对象(整数)。连体字符是指某些连在一起的字符,它们采用单个的图元符号。0 表示没有连体字符。1 表示使用默认的连体字符。2表示使用所有连体符号。默认值为 1(注意,iOS 不支持值为 2)。

NSKernAttributeName

该属性所对应的值是一个 NSNumber 对象(整数)。字母紧排指定了用于调整字距的像素点数。字母紧排的效果依赖于字体。值为 0 表示不使用字母紧排。默认值为0。

NSStrikethroughStyleAttributeName

该属性所对应的值是一个 NSNumber 对象(整数)。该值指定是否在文字上加上删除线,该值参考“Underline Style Attributes”。默认值是NSUnderlineStyleNone。

NSUnderlineStyleAttributeName

该属性所对应的值是一个 NSNumber 对象(整数)。该值指定是否在文字上加上下划线,该值参考“Underline Style Attributes”。默认值是NSUnderlineStyleNone。

NSStrokeColorAttributeName

该属性所对应的值是一个 UIColor 对象。如果该属性不指定(默认),则等同于 NSForegroundColorAttributeName。否则,指定为删除线或下划线颜色。更多细节见“Drawing attributedstrings that are both filled and stroked”。

NSStrokeWidthAttributeName

该属性所对应的值是一个 NSNumber 对象(小数)。该值改变描边宽度(相对于字体size 的百分比)。默认为 0,即不改变。正数只改变描边宽度。负数同时改变文字的描边和填充宽度。例如,对于常见的空心字,这个值通常为3.0。

NSShadowAttributeName

该属性所对应的值是一个 NSShadow 对象。默认为 nil。

NSVerticalGlyphFormAttributeName

该属性所对应的值是一个 NSNumber 对象(整数)。0 表示横排文本。1 表示竖排文本。在 iOS 中,总是使用横排文本,0 以外的值都未定义。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-02 09:49:13

设置UILabel 两端对齐的相关文章

模拟公交站台竖直排列,两端对齐

今天看到一个公家车站台的公家站牌,对站名的排列方式很有兴趣,html和css没有提供文字竖直排列的简便方法,需要我们利用一些技巧才能完成  大概要的效果就是这样的,竖直排列,两端对齐 首先先对竖直排列进行设计 先上html代码: 1 <ul> 2 <li><b>站牌1</b></li> 3 <li><b>站牌2</b></li> 4 <li><b>长站牌3</b>

【text-align】CSS3新增文本两端对齐

text-align参数值与说明: left:内容左对齐.center:内容居中对齐.right:内容右对齐.justify:内容两端对齐,但对于强制打断的行(被打断的这一行)及最后一行(包括仅有一行文本的情况,因为它既是第一行也是最后一行)不做处理.(CSS3)start:内容对齐开始边界.(CSS3)end:内容对齐结束边界.(CSS3)match-parent:这个值和 inherit 表现一致,只是该值继承的 start 或 end 关键字是针对父母的 <' direction '>

css实现两端对齐~

今天做表单时遇到让上下两个字段对齐的情况,手机号码.用户名. 然后今天在网上找了找相关方法,发现确实是没有什么好的方法解决,特别是当需要兼容的时候.找到了两个我觉得相对还不错的方法: 方法一.是在司徒正美的博客上看到的—— text-align, text-justify: 需要设置 text-align为justify就行了,text-justify的情况复杂些.IE的取值如下: auto :允许浏览器用户代理确定使用的两端对齐法则 inter-word :通过增加字之间的空格对齐文本.该行为

浏览器中上面三个字,下面两个字 两端对齐(转)

HTML + CSS短标题(二,三,四文字长度)两端对齐的方式 这篇文章的讲的主要是关于一行横向排列内容,而又包含前面标题并且要求它的文字两端对齐的一种方法.如下图,网上有很多方法,但是经过我测试,基本 没有一种方法能通过所有浏览器测试.而以下这种方法则兼容了大多数主流浏览器(ie6.7.8.9,ff,chrome,safari). 重点:必须定义标题的字体,这里我们设置字体为simsun:.在三个字的标题,这里使用两个  当作一个汉字的宽度.而对于两 个字的标题,我们利用把输入法切换到全角的情

自定义的两端对齐的Label

使用方法: FNLabel *textL = [[FNLabel alloc] initWithFrame:(CGRect){20,100,300,MAXFLOAT}]; NSString *textStr = @",攻击哦评价,发我家偶奇偶给,我看了您访问利率:赶紧弄魔法卡片,课堂为规范嘛呢:拉倒给我扑克牌,给我恐怕,比,客人可观评价,发我:赶紧弄魔法 卡片,课堂为规范嘛呢:拉倒给我扑克牌,给我恐怕,比,客人可观评价,发我家偶奇偶给,我看了您访"; textL.backgroundC

UILabel顶端对齐

ode中默认的UILabel是垂直居中对齐的,如果你的UILabel高度有多行,当内容少的时候,会自动垂直居中. 比较郁闷的是,UILabel并不提供设置其垂直对齐方式的选项.所以如果你想让你的文字顶部对齐,那么就需要自己想办法了. stackoverflow.com 上提供了几种方法来达到顶部对齐的效果. 方法一: 在显示文字时,首先计算显示当前的文字需要多宽和多高,然后将对应的UILabel的大小改变成对应的宽度和高度. 该方法的代码如下: CGSize maximumSize =CGSiz

CSS两端对齐

flex 弹性盒模型flex作为强大的弹性布局方式,可以hold住大部分的布局效果,当然也包括两端对齐.可以使用主轴对齐justify-content的两端对齐属性space-between justify-content: space-between; 如果要考虑flex三个版本的兼容,则使用如下代码 [注意]IE9-浏览器不支持 .justify-content_flex-justify{     -webkit-box-pack: justify;     -ms-flex-pack: j

实现段落文字两端对齐的css样式

有时候网站中的文字比较多,虽然为父元素设置了宽度,但是总是会出现两端参差不齐的情况,看起来不整齐.其实实现段落的两端对齐,只需要设置两个css 样式即可. .demo{ text-align: justify; text-justify: inter-ideograph;/*IE*/ } text-justify基本语法 语法:text-justify : auto |inter-word | newspaper | distribute | distribute-all-lines | int

css实现两端对齐效果

CSS实现两端对齐效果 两端对齐,从概念上来说,其实不难理解.如果不明白什么叫两端对齐,可以玩玩word等办公软件. 下面谈谈如何实现文本的两端对齐.我所知道的大概有以下几种方法 text-align w3school指出,text-align用于设置块级元素内文本的水平对齐方式.如果想使inline元素或inline-block元素居中对齐,可以使用text-align: center方法,对于block元素无法使用text-align实现居中对齐.如果想让block元素居中对齐,可以使用ma