限制 VoiceOver 从 UILabel 读取的文本

Posted

技术标签:

【中文标题】限制 VoiceOver 从 UILabel 读取的文本【英文标题】:Limiting text read by VoiceOver from a UILabel 【发布时间】:2015-04-26 05:15:18 【问题描述】:

我正在创建一个类似于邮件(或消息或便笺)的应用程序,它显示包含消息预览的UITableViewCells。文本通常不适合UILabel,因此文本被截断并自动显示省略号。这在我的应用程序中适用于视力正常的用户,但是当使用 VoiceOver 时,UILabel 的整个 text 内容会被大声朗读。这在 Mail 中不会发生 - VoiceOver 在到达省略号时停止播报文本。

如何在我的应用程序中获得与邮件相同的行为 - 强制 VoiceOver 在到达省略号时停止播报文本?

cell.messagePreviewLabel.text = a_potentially_really_long_string_here

【问题讨论】:

为配音传递适合标签的文本。使用标签宽度、高度和字体系列提取实际适合其中的文本并将其传递给配音 【参考方案1】:

这是 UILabel 的一个子类,可以满足您的要求。请注意,我已经竭尽全力优化这一点。那部分取决于你。从可访问性的角度来看,我的总体建议仍然是简单地离开它。从 A11y 的角度来看,覆盖可访问性标签以仅描绘实际标签中的部分文本是一件非常值得怀疑的事情。请谨慎使用此工具!

@interface CMPreivewLabel : UILabel
@end

@implementation CMPreviewLabel

- (NSString*)accessibilityLabel 
    return [self stringThatFits];


- (NSString*)stringThatFits 
    if (self.numberOfLines != 1) return @"This class would need modifications to support more than one line previews";

    const int width = self.bounds.size.width;

    NSMutableAttributedString* resultString = [[NSMutableAttributedString alloc] initWithAttributedString:self.attributedText];

    while (width < resultString.size.width) 
        NSRange range = [resultString.string rangeOfString:@" " options:NSBackwardsSearch];

        range.length = resultString.length - range.location;

        [resultString.mutableString replaceCharactersInRange:range withString:@""];
    

    return resultString.string;


@end

【讨论】:

以上是关于限制 VoiceOver 从 UILabel 读取的文本的主要内容,如果未能解决你的问题,请参考以下文章

iOS Voiceover 从覆盖的 UIWindow 中读取

辅助功能:Talkback 会自动读取对话内容。但是 NVDA 和 VoiceOver 不会读取

VoiceOver 在 iPhone 应用程序中读取上一个视图上的标签?漏洞?

如何为 UIControls 组设置单个 VoiceOver

iOS VoiceOver“找不到标题”

VoiceOver 是不是总是忽略宽度和高度为零的 iOS 视图?