前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >iOS开发小技巧:根据文本,字体,计算UILabel高度及宽度

iOS开发小技巧:根据文本,字体,计算UILabel高度及宽度

作者头像
陈满iOS
发布于 2018-09-10 03:18:26
发布于 2018-09-10 03:18:26
5.6K00
代码可运行
举报
文章被收录于专栏:陈满iOS陈满iOS
运行总次数:0
代码可运行

为了计算UILabel的宽度,除了通过NSString自带的boundingRectWithSize的API外,还可以利用sizeToFit对UILabel封装一个分类。

1. 需求:

  • 根据字符串,字体,计算UILabel宽度
  • 根据字符串,字体,宽度,计算UILabel高度

2. 解决:

  • 新建一个分类Category,封装好相关计算方法
  • 调用时,导入该分类,调用相关计算方法得出数值

3. 实现示例:

UILabel+Size分类,实现代码

  • UILabel+Size.h
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//
//  UILabel+Size.h
//  Created by ChenMan on 2018/1/25.
//  Copyright © 2018年. All rights reserved.
//

#import <UIKit/UIKit.h>

@interface UILabel (Size)

+ (CGFloat)getHeightByWidth:(CGFloat)width title:(NSString *)title font:(UIFont*)font;

+ (CGFloat)getWidthWithTitle:(NSString *)title font:(UIFont *)font;

@end
  • UILabel+Size.m
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//
//  UILabel+Size.m
//  Created by ChenMan on 2018/1/25.
//  Copyright © 2018年. All rights reserved.
//

#import "UILabel+Size.h"

@implementation UILabel (Size)

+ (CGFloat)getHeightByWidth:(CGFloat)width title:(NSString *)title font:(UIFont *)font
{
    
    UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, width, 0)];
    label.text = title;
    label.font = font;
    label.numberOfLines = 0;
    [label sizeToFit];
    CGFloat height = label.frame.size.height;
    return ceil(height);
}

+ (CGFloat)getWidthWithTitle:(NSString *)title font:(UIFont *)font {
    UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 1000, 0)];
    label.text = title;
    label.font = font;
    [label sizeToFit];
    CGFloat width = label.frame.size.width;
    return ceil(width);
}

@end

4. 调用示例:

场景:在一个UITableViewCell中,重写Cell的一个模型属性的setter方法,需要先对UILabel对象的text属性赋值后,再进行更新布局约束操作。代码如下:

  • CMTestTableViewCell.m
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
- (void)setCellMdl:(SupplementCellModel *)cellMdl{
    if (cellMdl) {
        _cellMdl = cellMdl;
        self.titleLabel.text = cellMdl.titleStr;
        self.contextTextField.placeholder = cellMdl.holderStr;
        self.rightLbl.text = cellMdl.tailStr;
        CGFloat width = [UILabel getWidthWithTitle:self.rightLbl.text font:self.rightLbl.font];
        [self.rightLbl mas_updateConstraints:^(MASConstraintMaker *make) {
            make.width.mas_equalTo(width);
        }];
        self.kind = cellMdl.cellType;
    }
}

5. 补充拓展

还有一种方式,可利用NSString的API

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
- (CGRect)boundingRectWithSize:(CGSize)size options:(NSStringDrawingOptions)options attributes:(nullable NSDictionary<NSString *, id> *)attributes context:(nullable NSStringDrawingContext *)context NS_AVAILABLE(10_11, 7_0);

参数解释

  • size: 宽高限制,用于计算文本绘制时占据的矩形块。
  • options: 文本绘制时的附加选项。可能取值请参考“NSStringDrawingOptions”。
  • attributes: 文本绘制时用到的AttributedString的属性。
  • context: context上下文。包括一些信息,例如如何调整字间距以及缩放。最终,该对象包含的信息将用于文本绘制。该参数一般为 nil 。
  • 返回值: 一个矩形,大小等于文本绘制完将占据的宽和高。

练习题:封装一个根据字体,字符串,宽度等参数得到高度的方法?

  • 参考答案:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
-(CGFloat)getSpaceLabelHeight:(NSString*)str withFont:(UIFont*)font withWidth:(CGFloat)width
{
    NSMutableParagraphStyle *paraStyle = [[NSMutableParagraphStyle alloc] init];
    paraStyle.alignment = NSTextAlignmentLeft;
    paraStyle.lineSpacing = 4;
    NSDictionary *dic = @{NSFontAttributeName:font, NSParagraphStyleAttributeName:paraStyle
                          };
    
    CGSize size = [str boundingRectWithSize:CGSizeMake(width, CGFLOAT_MAX) options:NSStringDrawingUsesLineFragmentOrigin attributes:dic context:nil].size;
    return size.height;
}

API的区别

关于boundingRectWithSize,系统API有几个类的相关方法。搜索官方文档,可见如下:

image.png

其中

  • NSAttributedString Calculates and returns bounding rectangle for the receiver drawn using the options specified, within the given rectangle in the current graphics context.
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
- (NSRect)boundingRectWithSize:(NSSize)size options:(NSStringDrawingOptions)options;
  • NSAttributedString Returns the bounding rectangle required to draw the string.
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
- (CGRect)boundingRectWithSize:(CGSize)size options:(NSStringDrawingOptions)options context:(NSStringDrawingContext *)context;
  • NSString Calculates and returns the bounding rect for the receiver drawn using the given options and display characteristics, within the specified rectangle in the current graphics context.
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
- (NSRect)boundingRectWithSize:(NSSize)size options:(NSStringDrawingOptions)options attributes:(NSDictionary<NSAttributedStringKey, id> *)attributes;
  • NSString Calculates and returns the bounding rect for the receiver drawn using the given options and display characteristics, within the specified rectangle in the current graphics context.
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
- (CGRect)boundingRectWithSize:(CGSize)size options:(NSStringDrawingOptions)options attributes:(NSDictionary<NSAttributedStringKey, id> *)attributes context:(NSStringDrawingContext *)context;
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018.03.02 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
frame方式布局一段文子,设置宽高
计算一段文字的宽高 /** * 计算一段文字的宽高 * * @param size 这段文字的最大宽高 * @param options NSStringDrawingUsesLineFragmentOrigin * @param attributes 文字的字体属性 * @param context nil * * @return 返回的是 CGRect 类型,frame */ - (CGRect)boundingRectWithSize:(CGSiz
用户1941540
2018/05/11
7350
iOS文本尺寸自适应异步计算实现
目前市面上的非UI线程文本算高方法或多或少都有一些问题。本文通过逆向和分析UILabel的sizeThatFits方法实现来得到一个最佳的文本算高的精简方法。方法可以运行在任意线程,因此可以有效的应用在那些异步算高或者要求尺寸进行提前计算的场景中。
欧阳大哥2013
2020/07/24
1.6K0
绘图-圆环进度条实现详解
前言 实现了一款时下比较流行的环状进度动图,以下是源码解析 使用 Core Graphics 和 定时器 实现环形进度动图 圆环进度.gif 核心源码 # 使用 [self setNeedsDisp
進无尽
2018/09/12
2.3K0
绘图-圆环进度条实现详解
iOS UILabe及UIFont用法总结 原
UILabel * label = [[UILabel alloc]initWithFrame:CGRectMake(100, 100, 100, 100)];
珲少
2018/08/15
1.1K0
iOS 10.3 Label高度计算问题 (UITableView+FDTemplateLayoutCell)1.前言2.问题发现3.解决问题4.列举下解决问题的方法
1.前言 今天有用户反馈说10.3的系统,有些文字显示不全,影响正式用户我哪里敢怠慢。急速的更新手机系统进行测试,发现真的是有问题,而且这个问题是UITableView+FDTemplateLayoutCell 引起的,计算的高度不准确引起的。 2.问题发现 经过测试发现问题出现在xib或者nib创建的cell 拉约束之后再用UITableView+FDTemplateLayoutCell 计算高度就会出现问题,用Masonry 配合UITableView+FDTemplateLayoutCell
陈雨尘
2018/06/01
1.7K0
OC知识--Foundation框架详尽总结之『数字、结构体、日期、文件类』
本文首发于我的个人博客:『不羁阁』 https://bujige.net 文章链接:https://bujige.net/blog/iOS-Foundation-other.html 本文对Foundation框架中一些数字类(NSNumber)、常用结构体类(CGPoint、CGSize、CGRect、CGRange和NSValue)、日期类(NSDate、NSCalendar)和文件类(NSFileManager)的使用做一个详细的总结。 1.数字类(NSNumber) 1. NSNumb
程序员充电站
2018/05/31
6390
商城分类页面自适应标题,自适应换行。
  最近在做商城,做到分类觉得网上应该一大把现成的代码。搜了一会没有搜到,懒人也懒不了了。
星宇大前端
2019/01/15
1.3K0
底牌项目中设置论坛中各个模块头图的代码
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010105969/article/details/54906641
用户1451823
2018/09/13
6080
iOS开发 UIlabel 文字两边对齐
1、给UIlabel添加一个分类即可,代码如下: 必须导入这个头文件:CoreText/CoreText.h - (void)changeAlignmentRightandLeft{ CGRect textSize = [self.text boundingRectWithSize:CGSizeMake(self.frame.size.width, MAXFLOAT) options:NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingTr
czjwarrior
2018/05/28
2.1K0
iOS | 动态获取字符串宽高并添加约束
在 iOS 实际编码过程中,我们可能会需要通过代码动态的向某个 View 视图中添加 UILabel, 此时,我们必须手动的为这些 UILabel 对象添加约束条件,否则,这些 UILabel 将会因为没有约束条件而无法显示。
CnPeng
2021/02/03
7860
iOS 计算NSString宽高与计算NSAttributedString的宽高
开篇 项目有一个客服反馈功能,用到的是聊天列表的形式,这就免不了计算字符串的宽高,由于要给字符串加间距,没办法,只能用 NSAttributedString 所以要计算NSAttributedString的长宽 计算NSString宽高 计算NSString宽高很简单,代码如下: //返回字符串所占用的尺寸. - (CGSize)sizeWithFont:(UIFont *)font maxSize:(CGSize)maxSize { NSDictionary *attrs = @{NSFontAt
GuangdongQi
2018/05/24
5.3K0
【IOS开发基础系列】UITextView专题
frame.size.height = self.serTextView.contentSize.height;
江中散人_Jun
2023/10/16
5320
【IOS开发基础系列】UITextView专题
iOS文本布局探讨之二——关于TextKit框架中的字体描述
        UIFont是iOS开发中处理文本字体的类,关于UIFont的相关内容,以前的一篇博客有详细介绍,本片博客主要介绍关于动态字体的应用与字体描述类NSFontDescriptor的应用。
珲少
2018/08/15
1.5K0
iOS文本布局探讨之二——关于TextKit框架中的字体描述
iOS开发之自定义字体
iOS 开发中文字默认使用的是系统的字体,但如果需要自定义字体,方法也很简单。 实现步骤 下载需要的字体,并将字体文件(.ttf文件)或者包含字体的文件夹添加到项目中。 编辑 Info.plist 文件,增加字段Fonts provided by application,然后在其下的item字段中配置字体的名称字体名.ttf,如果有多个字体文件需要增加多个item。 通过UIFont(name:size:)方法使用自定义字体。 案例 import UIKit class ViewController: U
YungFan
2023/03/16
1.3K0
Objective-C UIButton 自定义图片位置
在项目中经常会遇到一个按钮上放一个图片 位置有可能会是在标题的上,下,左,右 如果一个按钮,可以单独设置titleEdgeInsets和imageEdgeInsets即可,但是如果有很多 类似的按钮但是设置就很麻烦。为了解决这个问题 我们写一个UIButton的Category
赵哥窟
2018/09/13
8510
Objective-C UIButton 自定义图片位置
Swift:Lable 高度计算误差
项目中,发现同样的代码,在swift里面计算出来的高度是有误差的 但是用oc确没这个问题 #import "PHString.h" @implementation PHString /// 获取字符串size /// @param string 字符串 /// @param lineSpacing 行数 /// @param fontSize 字符串字号 /// @param rectSize 给一个固定的宽或者高 + (CGSize)getStringRectWith:(NSString *)stri
菜菜不吃蔡
2020/10/27
1.1K0
iOS的NSString总结
1.常用功能使用 1)初始化 NSString *astring = @"This is a String!";                             //固定字符串 NSString *str = [NSString stringWithFormat:@"asd%d%@",123,@"ttt"];    //拼组字符串 2)截取 NSString *str = [@"asd" substringFromIndex:1];                       //从第几位开始截到
用户8983410
2021/10/31
5560
Swift日常开发随笔
提示:之所以为空白,是因为我把下拉列表中的tableView.reloadData()这行代码屏蔽掉了,加入的数组没有刷新。
编程怪才-凌雨画
2020/10/11
2.1K0
UILabel在开发中的常用功能总结
在项目开发中,我们经常会遇到在这样情形: 1、在一个UILabel 使用不同的颜色或不同的字体来体现字符串 在iOS 6 以后我们可以很轻松的实现这一点,官方的API 为我们提供了UILabel类的attributedText, 使用不同颜色和不同字体的字符串,我们可以使用NSAttributedText 和 NSMutableAttributedText 类来实现。
Python疯子
2018/09/06
1K0
UILabel在开发中的常用功能总结
富文本AttributedString的总结
AttributedString可以分为NSAttributedString和NSMutableAttributedString两种。 在使用中通过将AttributedString赋值给控件的 attributedText 属性来添加文字样式。 可设置的控件有UILabel、UITextField和UITextView。
码客说
2019/10/22
3.6K0
推荐阅读
相关推荐
frame方式布局一段文子,设置宽高
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验