boundingRectWithSize 不考虑自动换行

2023-12-24

我创建一个 UITextView,向其中添加文本,然后将其放入视图中(使用容器)

UITextView *lyricView = [[UITextView alloc] initWithFrame:screen];
lyricView.text = [NSString stringWithFormat:@"\n\n%@\n\n\n\n\n\n", lyrics];
[container addSubview:lyricView];
[self.view addSubview:container];

然后我获取它的大小以与按钮一起使用并将其添加到 UITextView

CGRect size = [lyrics boundingRectWithSize:CGSizeMake(lyricView.frame.size.width, MAXFLOAT)
                                 options:NSStringDrawingUsesLineFragmentOrigin
                              attributes:@{NSFontAttributeName:[lyricView font]}
                                 context:nil];
UIButton *doneButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
[doneButton setFrame:CGRectMake(56, size.size.height + 55, 208, 44)];
[doneButton setTitle:@"Done" forState:UIControlStateNormal];
[lyricView addSubview:doneButton];

这适用于在大多数情况下。这将尊重 \n 换行符(就像我在 stringWithFormat 中添加的那样),但它不会尊重文本视图自动添加的自动换行。因此,如果lyrics有一行不适合屏幕,UITextView 将包裹它(正如它应该的那样),但是size现在比应有的要短一些,因为它不尊重文本视图换行。


你可以告诉boundingRectWithSize以自动换行模式处理字符串。你必须添加一个NSParagraphStyleattribute 到 attribute 参数,其lineBreakMode set to NSLineBreakByWordWrapping. So:

NSMutableDictionary *attr = [NSMutableDictionary dictionary];     
// ...whatever other attributes you need...
NSMutableParagraphStyle *paraStyle = [[NSParagraphStyle defaultParagraphStyle] mutableCopy];
paraStyle.lineBreakMode = NSLineBreakByWordWrapping;
[attr setObject:paraStyle forKey:NSParagraphStyleAttributeName];

然后使用attr作为属性参数boundingRectWithSize.

您可以轻松扩展/推广此技术,以从任何有意义的来源读取其他属性,包括现有的段落样式属性。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

boundingRectWithSize 不考虑自动换行 的相关文章

随机推荐

  • 如何从开罗表面创建 GtkImage?

    我希望能够从开罗表面制作 GtkImage 无需编写临时文件 我目前将表面以 PNG 形式写入字符数组 然后将其提供给 Pixbuf 加载器以获取用于创建 GtkImage 的 Pixbuf typedef struct unsigned
  • 使用 open xml sdk 只读或锁定特定单元格或行

    我正在使用 open xml sdk 导出 Excel 我获取 Excel 文件并将该文件复制到另一个位置 然后插入包含数据的新行 我应该使用 open xml sdk 将这些行设置为只读 或者我必须锁定 怎么做 我参考了以下链接使用 Op
  • 如何在 Python 中发送和接收 HTTP POST 请求 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我需要一个简单的客户端方法 可以在 HTTP POST 请求中发送布尔值 以及一个监听 POST 内容并将 POST 内容保存为 va
  • ReferenceError:描述未定义

    我正在尝试使用 graphql 端点运行测试gest https github com mfix22 gest 下面是我的代码 const Gest require graphicli const schema require path s
  • 在 AWS elasticbeanstalk 中配置未找到 .ebextensions 的 nginx 配置文件

    我正在尝试使用自签名 SSL 对部署在 AWS elastic beanstalk 上的 springboot Web 服务器后端启用 https 我按照在线教程和指南使用新的 https instance config 更改我的 ngin
  • EF Core 中 DbSet 属性和 Set() 函数之间的区别?

    鉴于这种背景 public class FooContext DbContext public FooContext DbContextOptions
  • 防止Android“长按”保存图像

    我用 HTML 和 Javascript 为 iPhone 和 Android 编写了一个网络应用程序 其中涉及拖放图像 您可以通过将手指放在图像上大约一秒钟来启动拖动 然而 Android 然后会弹出一条消息 让我选择保存图像 将其设置为
  • 滚动查看寻呼机内容时显示和隐藏操作栏

    我想显示和隐藏操作栏 工具栏作为 Google Play 商店应用程序 我使用顶部的滑动选项卡和视图寻呼机来显示每个选项卡的内容 以下是 Google Play 商店应用程序的屏幕截图供参考 我的布局 XML
  • 如何使按钮不可点击[重复]

    这个问题在这里已经有答案了 所以现在我在下一个按钮位于活动最后一页时无法单击时遇到问题 截至目前 它返回到第一个屏幕 我该如何做到这一点 以便它知道何时使按钮变灰或在用户到达最后一个屏幕时使其不可点击 这是我的代码 public class
  • 使用复杂的 GUI 编写跨平台应用程序

    我想开发一个具有复杂 GUI 的应用程序 带动画的组合框 带样条线的图表 透明层 我对 C 2 0 有很好的经验 并且正在研究 WPF 但不幸的是 我读到没有计划将 WPF 移植到 Mono 如果我坚持C 并使用创建自定义 GUI 控件Op
  • 如何列出 Android Q(API 级别 29)中的所有内部存储文件夹?

    我是编程新手 想在 android studio 中制作一个文件管理器 我在列出 API 级别 29 中的所有设备文件夹时遇到问题getExteralStorageDirectory已被弃用 根据文档 https developer and
  • POD 与非 POD 类类型的默认初始化

    C 标准表示 8 5 5 默认初始化类型的对象T means If T是非 POD 类类型 第 9 条 默认构造函数T被调用 并且初始化是错误的 如果T没有 可访问的默认构造函数 If T是一个数组类型 每个元素都是默认初始化的 否则 该对
  • 可滚动电子表格应如何在 Tkinter 中显示?

    目前我正在使用树视图 问题是我正在使用相当大的数据集 为了使 GUI 不庞大 我限制了 Treeview 的大小以适应窗口 并添加了垂直和水平滚动条 它完全按照我想要的方式显示数据 但是在每个方向滚动时都存在速度问题 是否有更好 更快的方法
  • 不区分大小写的查询字符串请求参数

    我的目标是以下所有 URI 都应该有效 https 休息 xyz sort name https 休息 xyz Sort name https 休息 xyz filter 名称 值 https 休息 xyz Filter 名称 值 为了实现
  • jQuery 可排序容器滚动 div 与溢出自动

    为了让这项工作成功 我一直在绞尽脑汁 我有两个连接的可排序对象 定义如下 var sortlists List1 List2 sortable appendTo body tolerance pointer connectWith List
  • 如何永久删除project.xcworkspace下的xcuserdata并解决未提交的更改

    我正在努力解决合并冲突的问题 请参阅由于与 UserInterfaceState xcuserstate 冲突而无法合并 https stackoverflow com questions 13870652 cannot merge due
  • 合并错误后有没有办法恢复 Mercurial 架子?

    当我取消搁置时 它使用 Mercurial 的合并功能 但如果我完成合并时出现错误 我没有看到任何方法可以取回原始搁置的补丁并重做事情 除了搜索备份驱动器之外 还有什么方法可以做到这一点 撤消取消搁置操作并将搁架放回原处 或者查看补丁文件中
  • Python循环运行一定的秒数

    我有一个 while 循环 我希望它继续运行 15 分钟 目前是 while True blah blah blah 这会运行完 然后重新启动 我需要它继续执行此操作 除非 15 分钟后它退出循环 Thanks 尝试这个 import ti
  • CGPDF<...> - 设置者在哪里?

    有没有办法使用 CGPDF 创建 PDF 对象 例如 带有自定义 PDF 生成器 消费者 查看器所需参数的 PDF 字典 或者我是否必须编写自己的解析器并创建新的预告片 外部参照等以便向 PDF 添加新对象 据我了解 在创建 PDF 时 C
  • boundingRectWithSize 不考虑自动换行

    我创建一个 UITextView 向其中添加文本 然后将其放入视图中 使用容器 UITextView lyricView UITextView alloc initWithFrame screen lyricView text NSStri