美文网首页IOS开发IOS收藏 ios零碎记录
取巧处理:UILabel(IOS开发) 超出宽度的文本省略号的问

取巧处理:UILabel(IOS开发) 超出宽度的文本省略号的问

作者: tumg的LNMP_IOS小集 | 来源:发表于2015-12-16 22:14 被阅读11792次

    UILabel 默认情况下,单行文本、使用固定宽高、固定字体的时候,超出的文本会被省略号代替,但对于某些设计中,省略号是不需要的(设计合理性不在本文讨论范围内)。考虑的采取几种方式:

    默认情况


    UILabel默认情况

    方式一:设置 lineBreakMode


    self.label1.lineBreakMode = NSLineBreakByWordWrapping;

    最后一个字显示得不完整...no

    方式二:提前计算UILabel 可容纳的字数


    实现可行,但总觉得每次渲染都得重新计算,这有多麻烦

    方式三:取巧,使用UITextView 代替UILabel:


    UITextView 是文本域的显示组件,默认情况不存在最后一个字的溢出问题(折到第2行了),但UITextView 本身比UIlabel 可响应用户的操作更多,所以需要做一些设置才能保障正常的事件响应(尤其在Cell 里面的时候)

    示例(仅贴出主要差异部分)


    CGFloat labelHeight = 22;
    CGFloat fontSize = 15;
    NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
    paragraphStyle.maximumLineHeight = labelHeight;
    paragraphStyle.minimumLineHeight = labelHeight;
    paragraphStyle.lineSpacing = labelHeight/2.0f;
    paragraphStyle.lineBreakMode = NSLineBreakByWordWrapping;

    NSAttributedString *aString = [[NSAttributedString alloc] initWithString:@"测试文字1标题测试" attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:fontSize],NSForegroundColorAttributeName:[UIColor whiteColor],NSBaselineOffsetAttributeName:[NSNumber numberWithFloat:labelHeight/2.0f],NSParagraphStyleAttributeName:paragraphStyle}];
    self.demoTextView.userInteractionEnabled = NO;
    [self.demoTextView resignFirstResponder];
    self.demoTextView.contentInset = UIEdgeInsetsMake(0, -4, 0, 0);
    self.demoTextView.attributedText = aString;

    最终效果:

    最后一个字被折行

    注意点:
    1.使用NSAttributedString对文本设置相应的样式和行高、行距;
    2.禁止userInteractionEnabled,防止UITextView的事件响应(编辑、选择);
    3.resignFirstResponder,设为非第一响应者,在cell中尤其重要,否则点击文字无法触发cell 的 didSelected 的事件;
    4.相比UILabel,内存占用多一些,尤其在大量cell中使用时。

    懒也是一种生产力

    相关文章

      网友评论

      本文标题:取巧处理:UILabel(IOS开发) 超出宽度的文本省略号的问

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