2015-04-26 1 views
4

Я создаю приложение, подобное Mail (или сообщениям или заметкам), которое отображает UITableViewCell s, которые содержат предварительный просмотр сообщения. Обычно текст не подходит для UILabel, поэтому текст усекается, и эллипсис отображается автоматически. Это хорошо работает в моем приложении для зрячих пользователей, однако при использовании VoiceOver весь текст text в UILabel читается вслух. Этого не происходит в Mail - VoiceOver останавливает объявление текста при достижении многоточия.Предельный текст, читаемый VoiceOver из UILabel

Как я могу получить такое же поведение в своем приложении, как Mail - принудительно отключить VoiceOver, объявив текст, когда он достигнет многоточия?

cell.messagePreviewLabel.text = a_potentially_really_long_string_here

+0

Для передачи голоса над текстом, который соответствует этикетке. Используя ширину метки, высоту и семейство шрифтов, извлеките текст, который на самом деле подходит в нем, и передайте его на голосовую надпись –

ответ

0

Вот подкласс 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