- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我需要在 UIButton
的 titleLabel
上同时启用自动换行和尾部截断。将 numberOfLines 设置为大于 0 的值不起作用,文本停留在一行上。
我已经四处搜索,但没有找到解决方案。有什么想法吗?
最佳答案
这是不正确的:
lblTemp.lineBreakMode = NSLineBreakByWordWrapping | NSLineBreakByTruncatingTail
lblTemp.numberOfLines = 0;
NSLineBreakMode 在 NSParagraphStyle.h 中定义为:
typedef NS_ENUM(NSInteger, NSLineBreakMode) { /* What to do with long lines */
NSLineBreakByWordWrapping = 0, /* Wrap at word boundaries, default */
NSLineBreakByCharWrapping, /* Wrap at character boundaries */
NSLineBreakByClipping, /* Simply clip */
NSLineBreakByTruncatingHead, /* Truncate at head of line: "...wxyz" */
NSLineBreakByTruncatingTail, /* Truncate at tail of line: "abcd..." */
NSLineBreakByTruncatingMiddle /* Truncate middle of line: "ab...yz" */
} NS_ENUM_AVAILABLE_IOS(6_0);
请注意,它是一个 NS_ENUM,而不是一个 NS_OPTION,因此它不能用作掩码。有关详细信息,请参阅 this .
实际上,在这些常量上使用 | 运算符会导致掩码匹配 NSLineBreakByTruncatingTail:
(NSLineBreakByWordWrapping | NSLineBreakByTruncatingTail) == 4
NSLineBreakByTruncatingTail == 4
据我所知,截断 Core Text 中的最后一行并进行自动换行无法通过简单的 CTFramesetterCreateWithAttributedString 和 CTFrameDraw API 完成,但可以通过逐行布局完成, UILabel 必须在做什么。
iOS 6 通过在 NSStringDrawing.h 中公开新的绘图 API 简化了这一点:
typedef NS_ENUM(NSInteger, NSStringDrawingOptions) {
NSStringDrawingTruncatesLastVisibleLine = 1 << 5, // Truncates and adds the ellipsis character to the last visible line if the text doesn't fit into the bounds specified. Ignored if NSStringDrawingUsesLineFragmentOrigin is not also set.
NSStringDrawingUsesLineFragmentOrigin = 1 << 0, // The specified origin is the line fragment origin, not the base line origin
NSStringDrawingUsesFontLeading = 1 << 1, // Uses the font leading for calculating line heights
NSStringDrawingUsesDeviceMetrics = 1 << 3, // Uses image glyph bounds instead of typographic bounds
} NS_ENUM_AVAILABLE_IOS(6_0);
@interface NSAttributedString (NSExtendedStringDrawing)
- (void)drawWithRect:(CGRect)rect options:(NSStringDrawingOptions)options context:(NSStringDrawingContext *)context NS_AVAILABLE_IOS(6_0);
- (CGRect)boundingRectWithSize:(CGSize)size options:(NSStringDrawingOptions)options context:(NSStringDrawingContext *)context NS_AVAILABLE_IOS(6_0);
@end
因此,如果您使用的是 UILabel,您希望将标签本身上的 NSAttributedString 的 NSParagraphStyle 或 lineBreakMode 设置为:
NSLineBreakByTruncatingTail
并且标签上的 numberOfLines 属性必须设置为 0。
来自 numberOfLines 上的 UILabel header :
// if the height of the text reaches the # of lines or the height of the view is less than the # of lines allowed, the text will be
// truncated using the line break mode.
来自 UILabel 文档:
This property controls the maximum number of lines to use in order to fit the label’s text into its bounding rectangle. The default value for this property is 1. To remove any maximum limit, and use as many lines as needed, set the value of this property to 0.
If you constrain your text using this property, any text that does not fit within the maximum number of lines and inside the bounding rectangle of the label is truncated using the appropriate line break mode.
UILabel 这个有点晦涩的特性带来的唯一问题是,如果不即时修改 NSAttributedString 的 NSParagraphStyle,就无法在绘制之前获取尺寸(这对于某些 UITableView + UITableViewCell 动态布局来说是必需的)。
从 iOS 6.1.4 开始,使用具有 NSLineBreakByTruncatingTail 换行模式(对于 UILabel)的 NSAttributedString 调用 -boundingRectWithSize:options:context,返回不正确的单行高度,即使以下选项传入:
(NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingTruncatesLastVisibleLine)
(请注意 NSStringDrawingUsesLineFragmentOrigin 是多行字符串的必要条件。)
更糟糕的是,UILabel 的 lineBreakMode 不会覆盖 NSAttributedStrings 段落样式,因此您必须修改属性字符串的段落样式以进行大小计算,然后再将其传递给 UILabel,这样它可以画出来。
也就是说,NSLineBreakByWordWrapping 用于 -boundingRectWithSize:options:context 和 NSLineBreakByTruncatingTail 用于 UILabel(所以它可以在内部使用 NSStringDrawingTruncatesLastVisibleLine,或者它所做的任何操作来剪辑最后一行)
如果您不想多次改变字符串的段落样式,唯一的选择是做一个简单的 UIView 子类,它覆盖 -drawRect:(将适当的 contentMode 设置为重绘),并使用 iOS 6新的绘图 API:
- (void)drawWithRect:(CGRect)rect options:(NSStringDrawingOptions)options context:(NSStringDrawingContext *)context NS_AVAILABLE_IOS(6_0);
记住使用 NSLineBreakByWordWrapping 并传入 (NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingTruncatesLastVisibleLine) 作为选项。
最后,在 iOS 6 之前,如果你想对属性字符串进行自动换行 + 尾部截断,你必须自己使用 Core Text 逐行布局。
关于ios - 带有尾部截断的 UIButton 的标题标签自动换行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7378308/
我发现了一些令人费解的行为。给定一个包含 50 个日期的列表: structure(c("15513", "12830", "16503", "-3628", "15833", "13553", "4
我正在尝试创建单链表,但我不知道我做错了什么。 在插入元素 5、6、7、2、3、4 后,尾部应该是 4,但我得到的是 3,我不明白为什么。 这是我的代码: public void Insert(int
这是我的尾部代码(前 10 行): #include #include #include typedef char storage_datatype; #define MAXLINESIZE 1
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,
是否有一种有效的方法可以从 List 中删除 X 元素的范围(例如尾部),例如LinkedList 在 Java 中? 显然可以一个一个地删除最后一个元素,这应该会导致 O(X) 级别的性能。至少对于
在之前的一篇文章我们介绍了《如何向php数组中头部和尾部添加元素》既然有添加元素,那么就有删除元素,今天这篇文章详细介绍如何删除数组中的头部元素和尾部元素,还有任意数组元素。 删除末尾元素:arr
在双向链表的实现中,我使用了典型的结构: struct node { void *data; struct node *prev; struct node *next; };
ECMA-335,III.2.4指定可以在递归函数中使用的tail.前缀。但是,我在C#和F#代码中都找不到它的用法。有使用in的示例吗? 最佳答案 您不会在当前的MS C#编译器生成的任何代码中找到
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 7 年前。
这个问题在这里已经有了答案: How to 'grep' a continuous stream? (13 个答案) 关闭 8 年前。 Tail 有以下选项: -f The -f opti
我试图弄清楚一旦我击中某个字符,如何从尾部修剪 Bash 中的字符串。 示例:如果我的字符串是这个(或任何链接):https://www.cnpp.usda.gov/Innovations/DataS
我试图弄清楚一旦我击中某个字符,如何从尾部修剪 Bash 中的字符串。 示例:如果我的字符串是这个(或任何链接):https://www.cnpp.usda.gov/Innovations/DataS
当我执行这段代码时,循环总是在第一次结束(即使 auth.log 的最后两行不包含“exit”),这意味着 $c总是得到一些字符串: while true; do c=$(tail -2 /v
我正在尝试编写一个“添加”函数,该函数接受节点中保存的值(表示为“n”),以及节点要添加到链表中的位置(表示为“pos”)。 我看到代码中有 3 个单独的添加函数 - addAtBeginning、a
为什么我不能得到“cd fjadf”? 程序总是向我显示 Bus error: 10... 我想用这个super_cut_tail()函数来截断用户指定的///fjdakf。但是为什么这个功能不能实现
有一个简化的表 mytable,其中列 ('id', 'mycolumn') 为 int 和 varchar(255 )分别。 在 mycolumn 中查找当前字符串具有最长公共(public)右侧部
这个问题已经有答案了: 已关闭13 年前。 Possible Duplicate: Get last n lines of a file with Python, similar to tail 你好
我想通过对写出的响应主体进行哈希处理来计算响应的实体标签。当我计算实体标签时,将实体标签添加到响应 header 已经太晚了。我想将实体标签添加到预告片中。我看到 net/http 包支持编写预告片,
我正在尝试通过 script.sh 从第 2 行到第 5 行打印文件 (myfile) 的内容。脚本无法从位置 2 打开文件。并且内容从第 1 行打印到第 4 行。以下是文件内容、命令和命令的输出。
在一个特殊的控制台上,我喜欢从/var/log/syslog 中过滤一些信息。这并不是很棘手: tail -f /var/log/syslog | awk '{print $2,$1,$9,$3,"\
我是一名优秀的程序员,十分优秀!