美文网首页IOS开发iOS开发实战iOS开发之实战资源
iOS View自定义窍门——UILabel实现随着文字改变自身

iOS View自定义窍门——UILabel实现随着文字改变自身

作者: HustBroventure | 来源:发表于2016-06-03 16:29 被阅读2907次

    UILabel动态改变大小之前采用方法是计算出文字大小,然后重新设置frame,今天想到了一种非常简便实用的实现方法。利用了preferredMaxLayoutWidth属性和sizeToFit方法

    0. 后续更新(2016.06.06)

    之前有点疏忽了,感觉效果对了就真的以为是这样了。其实不设置sizeToFit也可以实现这种效果。如果文字改变了,需要更新相应的frame,经过测试必须加上

    [self.resultLabel setNeedsLayout];
     [self.resultLabel setNeedsLayout];
    

    一起用才能立即更新frame。

    总结来说:

    1. 使用autolayout设置相对位置(上下左右中心相对于一个位置即可)
    2. preferredMaxLayoutWidth设置最大宽度
    3. numberOfLines设置支持的几行(相当于设置最大高度)
    4. setNeedsLayoutsetNeedsLayout立即刷新frame(如果需要的话)

    1. 先看效果图

    文字乱输入的,请忽略

    效果图:随着字数变化改变自身的大小,宽度固定200

    2. 再来一波思路分析

    preferredMaxLayoutWidth:This property affects the size of the label when layout constraints are applied to it. During layout, if the text extends beyond the width specified by this property, the additional text is flowed to one or more new lines, thereby increasing the height of the label.

    sizeToFit: Call this method when you want to resize the current view so that it uses the most appropriate amount of space. Specific UIKit views resize themselves according to their own internal needs.

    3. 再上个代码

    @interface ViewController ()
    @property (weak, nonatomic)  UILabel *resultLabel;
    
    @property (weak, nonatomic) IBOutlet UITextField *textField;
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        UILabel* label = [UILabel new];
        label.text = @"我是谁";
        label.backgroundColor = [UIColor greenColor];
        [self.view addSubview:label];
        label.numberOfLines = 0;
        [label sizeToFit];
        self.resultLabel = label;
        self.resultLabel.translatesAutoresizingMaskIntoConstraints = NO;
        NSLayoutConstraint* attribureX = [NSLayoutConstraint constraintWithItem:self.resultLabel attribute:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeCenterX multiplier:1 constant:0];
        NSLayoutConstraint* attribureY = [NSLayoutConstraint constraintWithItem:self.resultLabel attribute:NSLayoutAttributeCenterY relatedBy:NSLayoutRelationEqual toItem:self.view attribute:NSLayoutAttributeCenterY multiplier:1 constant:0];
        [self.view addConstraint:attribureX];
        [self.view addConstraint:attribureY];
        self.resultLabel.preferredMaxLayoutWidth = 200;
    
    }
    
    - (IBAction)confirm:(id)sender {
        self.resultLabel.text = self.textField.text;
        [self.resultLabel sizeToFit];
        [self.textField resignFirstResponder];
    }
    
    @end
    
    

    4. 没了,喜欢点个赞吧。

    相关文章

      网友评论

      • 阳仔dynamics:有个小错误,是 setNeedLayout 和 layoutIfNeeded 一起用
      • 8bef82b761ae:你可以试试在table里边试试这种方法。你会哭的。
        格调main:遇到了这个问题就在 table cell 上使用的 上下有留边 ,知道如何解决吗
      • LaiYoung_:评论不能使用代码块,差评。
        补充:会根据内容使用它系统计算的intrinsicContentSize值
        HustBroventure:@LaiYoung 首先,不用masony是为了封装的缘故。masony也只是便捷的autolayout使用方式而已。其次,需求就是要固定label所能的最大宽度。sizeTofit改变bounds,然后再aotolayout设置一个点的相对即可。
      • LaiYoung_:使用masonr做布局y布局,可以不用设置sizeToFit,preferredMaxLayoutWidth只是设置label最大的宽度。
        ```
        - (void)viewDidLoad {
        [super viewDidLoad];
        UILabel *label = ({
        UILabel *label = [UILabel new];
        [self.view addSubview:label];
        [label makeConstraints:^(MASConstraintMaker *make) {
        make.center.equalTo(self.view);
        }];
        label.text = @"LaiYoung";
        label;
        });
        self.label = label;
        }

        -(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
        self.label.text = [self.label.text stringByAppendingString:@",Hello"];
        }
        ```
      • ShenYj:mark
      • nickName0:UIlable的上下留白会消失吗???
        HustBroventure:没有留白啊。绿色的就是label的frame大小
      • 苦笑男神:试试去
      • xxttw:这样label自身的上下留白就没了么

      本文标题:iOS View自定义窍门——UILabel实现随着文字改变自身

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