Ios UILabel具有固定宽度和1行,内容有时不能精确地与带省略号的培训对齐

Ios UILabel具有固定宽度和1行,内容有时不能精确地与带省略号的培训对齐,ios,objective-c,label,uilabel,Ios,Objective C,Label,Uilabel,我有一个常见的场景,将标题标签与徽标图像对齐5点,因此使用自动布局这很容易完成,但问题是标题标签和徽标图像背景颜色都很清晰,然后当标题超过标签宽度时,在末尾自动添加的省略号在UILabel的右端之间有一些空间,然后标题标签看起来离后面的徽标更远 现在我的UILabel有固定的宽度,并且只设置了一行来触发UILabel的自动省略号功能,然后内容有时不能精确地与省略号训练对齐。它的出现取决于它需要呈现什么内容。例如,若内容几乎和标签匹配,那个么它是完美的左对齐右对齐,但若你们给内容添加了一个特征,那

我有一个常见的场景,将
标题标签与徽标图像对齐5点
,因此使用自动布局这很容易完成,但问题是标题标签和徽标图像背景颜色都很清晰,然后当标题超过标签宽度时,在末尾自动添加的省略号在UILabel的右端之间有一些空间,然后标题标签看起来离后面的徽标更远

现在我的UILabel有固定的宽度,并且只设置了一行来触发UILabel的自动省略号功能,然后内容有时不能精确地与省略号训练对齐。它的出现取决于它需要呈现什么内容。例如,若内容几乎和标签匹配,那个么它是完美的左对齐右对齐,但若你们给内容添加了一个特征,那个么这种奇怪的情况就会出现

因此,无论如何,是否可以让我精确地控制省略号位置移动到标签的末尾,而不需要右边的空白

例如:


我只想删除UILabel末尾的空格。这是正常的,因为标签使用固定宽度,字体大小固定

尝试使用最小字体比例以适合所有内容


我不认为空间是问题所在,我认为更多的是标签设置不显示部分字母或数字的情况。。。因此,它将删除最后两个可见字符,并用省略号替换它,因此它看起来像结尾的空格(这是因为省略号大于一个字符,但小于两个字符)

如果我创建两个宽度相等的标签,一个是文本“1234”,另一个是“12345”,输出如下


基本上标签是正确的。。。但是,我认为iOS不允许显示部分字符。

正如您所注意到的,当文本被截断时,
UILabel
框架可能会有一点额外的空间。你不能(据我所知)用纯自动布局来解决这个问题,但是你可以用一点代码来解决

在标签上设置宽度约束,并将其指定给IBOutlet。然后,您可以获取被截断字符串的实际宽度,并更改该
NSLayoutConstraint
上的
.constant

@interface LabelTruncatingViewController ()
    // this is the label
    @property (weak, nonatomic) IBOutlet UILabel *theLabel;
    // this is the width constraint of theLabel
    @property (weak, nonatomic) IBOutlet NSLayoutConstraint *theWidth;
@end

@implementation LabelTruncatingViewController

// on a button tap, for example
- (IBAction)fixLabel:(id)sender {

    _theWidth.constant = [self truncatedWidthFor:_theLabel withMaxWidth:80.0];

}

- (CGFloat)truncatedWidthFor:(UILabel *)aLabel withMaxWidth:(CGFloat)maxWidth {

    NSString *s = aLabel.text;

    if (s.length == 0) {
        return 0.0;
    }

    UIFont *f = aLabel.font;
    CGSize sz = CGSizeZero;

    // while the string is at least 1 character
    while (s.length > 0) {

        // append ellipsis
        NSString *t = [NSString stringWithFormat:@"%@…", s];

        // get the size of the string using the label's font
        sz = [t sizeWithAttributes:@{NSFontAttributeName: f}];

        // if the width of the substrint + ellipsis is less than the max width,
        //  break out of the while() loop
        if (sz.width <= maxWidth) {
            break;
        }

        // strip the last character from the end of the string
        s = [s substringToIndex:s.length - 1];

    }

    // labels don't like fractions
    return ceil(sz.width);

}

@end
@接口标签RuncatingViewController()
//这是标签
@属性(弱,非原子)IBUILabel*标签;
//这是标签的宽度约束
@属性(弱,非原子)IBNSlayoutConstraint*宽度;
@结束
@LabelRuncatingViewController的实现
//例如,点击按钮
-(iAction)fixLabel:(id)发件人{
_theWidth.constant=[self-truncatedWidthFor:_最大宽度标签:80.0];
}
-(CGFloat)截断宽度用于:(UILabel*)带maxWidth的阿拉贝尔:(CGFloat)maxWidth{
NSString*s=aLabel.text;
如果(s.length==0){
返回0.0;
}
UIFont*f=aLabel.font;
CGSize sz=CGSizeZero;
//而字符串至少为1个字符
而(s.length>0){
//附加省略号
NSString*t=[NSString stringWithFormat:@“%@…”,s];
//使用标签的字体获取字符串的大小
sz=[t sizeWithAttributes:@{NSFontAttributeName:f}];
//如果子打印+省略号的宽度小于最大宽度,
//中断while()循环

如果(sz.width您是否为标签指定了固定宽度?@KKRocks是的。标签定义为固定宽度并设置了一行。您能详细说明您的需要吗?我无法回答您的问题。@KKRocks我更新了我的问题,等待您的建议。选择宽度限制并使其小于或等于。当内容超过t时,场景需要显示省略号他没有缩小字体大小,所以我不知道如何删除银行空间……是的,我知道这可能是苹果交易的正确方式。所以我们无法以微妙的方式控制这一点?不是根据我所看到的任何东西……或处理过的任何事。好的,谢谢你回答我的问题。如果我得到公司的答案,我会回复你的!@SevenJustinsure@SevenJustin-您必须更清楚地了解您想要实现的目标,因为它似乎满足了您的要求:一种将标签大小设置为截断文本的方法,在省略号之后不留额外空间“…”酷!但有一个问题,如果UILabel的文本是中文,则该方法不起作用。