• iOS基础 --- UILabel的使用及对齐方式


    问题一

    如何返回单行文字的高度

    font.lineHeight,如label.font.lineHeight,可button.titleLabel.font.lineHeight

    问题二

    我有一个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:"
    
    
    
    "];
    这个方法不是万能的——尤其是如果文字超出范围,需要在末尾显示『…』就不行了。
    
    答案3:用UITextField代替UILabel
    
    jowie ,47 赞
    
    用UITextField取代UILabel,默认就是顶端对齐的。可以把userInterationEnabled设为NO,让它不能滚动。
    
    答案4:重写UILabel的drawInRect方法
    
    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
    
    将来的自己,会感谢现在不放弃的自己!
  • 相关阅读:
    nyoj256-C小加之级数求和
    nyoj254-编号统计
    nyoj286-动物统计
    最长回文子串——manacher
    动态规划:Codeforces Round #427 (Div. 2) C Star sky
    水题:51Nod1432-独木舟
    水题:HDU1716-排列2
    水题:CF16C-Monitor
    数学基础:HUD1124-Factorial(N!末尾0的个数)
    并查集:POJ1182-食物链(并查集比较高端的应用)
  • 原文地址:https://www.cnblogs.com/TheYouth/p/5466692.html
Copyright © 2020-2023  润新知