美文网首页对移动开发有帮助Objective-ciOS-swift
[爆栈热门 iOS 问题] 让 UILabel 顶端对齐

[爆栈热门 iOS 问题] 让 UILabel 顶端对齐

作者: 戴仓薯 | 来源:发表于2015-10-08 22:12 被阅读17906次

    系列文集:爆栈热门 iOS 问题目录在此。仓薯翻译,欢迎指正:)

    问题

    我有一个UILabel高度最多能显示两行,如果里面内容只有一行,它是垂直居中的。怎么能让它顶端对齐呢?


    回答

    答案1:用sizeToFit改变UILabel的高度

    nevan king,1969 赞

    没法直接改变UILabel的垂直对齐方式,但是把 label 的 frame 高度改小也能实现相同的效果。为了看得清楚,我把 label 标为橘黄色了。

    最简单的做法是:

    [myLabel sizeToFit];
    
    sizeToFit

    如果内容长度超过一行,把numberOfLines设成 0(就是不限制行数)。

    myLabel.numberOfLines = 0; 
    [myLabel sizeToFit];
    

    有一个问题是,如果你文字是水平居中的,那么执行完sizeToFit后 frame 宽度也缩小了,文字会缩到左上角。解决方法是把 label 的宽度先存起来,执行完sizeToFit之后再设回来。

    另外要注意,sizeToFit 会把 label 的当前宽度当做最大宽度,执行之后宽度只会比变窄,不会变宽。

    对于用 Auto Layout 的 NIB 和 Storyboard,Mark Amery 在评论中补充了解决方案:

    如果 nib 或 storyboard 里用了 autoLayout,那么在viewDidLoadsizeToFit是不管用的,因为实际顺序是先执行viewDidLoad再执行 autoLayout,执行 autoLayout 的时候会把 sizeToFit 的结果覆盖掉。
    不过,在viewDidLayoutSubviews里调sizeToFit管用的。


    答案2:末尾补充换行

    Purple Ninja Girl ,44 赞

    一个更简单的办法(也是比较脏的办法)是把UILabel的 line break mode 设为 Clip,然后直接在末尾加一些换行。

    myLabel.lineBreakMode = UILineBreakModeClip;myLabel.text = [displayString stringByAppendingString:"\n\n\n\n"];
    

    这个方法不是万能的——尤其是如果文字超出范围,需要在末尾显示『…』就不行了。


    答案3:用UITextField代替UILabel

    jowie ,47 赞

    UITextField取代UILabel,默认就是顶端对齐的。可以把userInterationEnabled设为NO,让它不能滚动。


    答案4:重写UILabeldrawInRect方法

    Martin Wickman,21 赞

    创建一个UILabel的子类,用起来非常方便:

    // TopLeftLabel.h
    #import <Foundation/Foundation.h>
    @interface TopLeftLabel : UILabel {
    }
    @end
    
    // TopLeftLabel.m
    #import "TopLeftLabel.h"
    @implementation TopLeftLabel
    - (id)initWithFrame:(CGRect)frame { 
        return [super initWithFrame:frame];
    }
    - (CGRect)textRectForBounds:(CGRect)bounds limitedToNumberOfLines:(NSInteger)numberOfLines {
        CGRect textRect = [super textRectForBounds:bounds limitedToNumberOfLines:numberOfLines]; 
        textRect.origin.y = bounds.origin.y; 
        return textRect;
    }
    -(void)drawTextInRect:(CGRect)requestedRect { 
        CGRect actualRect = [self textRectForBounds:requestedRect limitedToNumberOfLines:self.numberOfLines]; 
        [super drawTextInRect:actualRect];
    }
    @end
    

    详细说明见这里

    原文地址:Vertically align text within a UILabel

    本文地址:http://www.jianshu.com/p/429470186933

    系列文集:爆栈热门 iOS 问题

    译者:@戴仓薯

    相关文章

      网友评论

      本文标题:[爆栈热门 iOS 问题] 让 UILabel 顶端对齐

      本文链接:https://www.haomeiwen.com/subject/hhjncttx.html