В настоящее время наше приложение для iPhone поддерживает IOS 8/9/10. У меня возникают трудности с поддержкой доступа к голосовым сообщениям для пользовательского UITableViewCell. Я прошел следующие SO-сообщения, но ни одно из предложений не сработало. Я хочу, чтобы отдельные компоненты были доступны.Невозможно настроить голосовую доступность для пользовательского UITableViewCell
- Custom UITableview cell accessibility not working correctly
- Custom UITableViewCell trouble with UIAccessibility elements
- Accessibility in custom drawn UITableViewCell
- https://developer.apple.com/library/content/documentation/UserExperience/Conceptual/iPhoneAccessibility/Making_Application_Accessible/Making_Application_Accessible.html#//apple_ref/doc/uid/TP40008785-CH102-SW10
- http://useyourloaf.com/blog/voiceover-accessibility/
К сожалению для меня, клетка не обнаруживается доступности инспектора. Есть ли способ озвучить возможность доступа к отдельным элементам в ячейке просмотра таблицы? При отладке этой проблемы на обоих устройствах и в симуляторе я обнаружил, что XCode вызывает функцию isAccessibleElement
. Когда функция возвращает NO
, остальные методы пропускаются. Я тестирую IOS 9.3 в XCode.
Моя пользовательская ячейка просмотра таблицы состоит из ярлыка и переключателя, как показано ниже.
Метка добавляется к просмотру контента, в то время как переключатель добавляется вид пользовательских аксессуаров.
Определение интерфейса приводится ниже
@interface MyCustomTableViewCell : UITableViewCell
///Designated initializer
- (instancetype)initWithReuseIdentifier:(NSString *)reuseIdentifier;
///Property that determines if the switch displayed in the cell is ON or OFF.
@property (nonatomic, assign) BOOL switchIsOn;
///The label to be displayed for the alert
@property (nonatomic, strong) UILabel *alertLabel;
@property (nonatomic, strong) UISwitch *switch;
#pragma mark - Accessibility
// Used for setting up accessibility values. This is used to generate accessibility labels of
// individual elements.
@property (nonatomic, strong) NSString* accessibilityPrefix;
-(void)setAlertHTMLText:(NSString*)title;
@end
Блок реализации приведен ниже
@interface MyCustomTableViewCell()
@property (nonatomic, strong) UIView *customAccessoryView;
@property (nonatomic, strong) NSString *alertTextString;
@property (nonatomic, strong) NSMutableArray* accessibleElements;
@end
@implementation MyCustomTableViewCell
- (instancetype)initWithReuseIdentifier:(NSString *)reuseIdentifier
{
if(self = [super initWithStyle:UITableViewCellStyleDefault
reuseIdentifier:reuseIdentifier]) {
[self configureTableCell];
}
return self;
}
- (void)configureTableCell
{
if (!_accessibleElements) {
_accessibleElements = [[NSMutableArray alloc] init];
}
//Alert label
self.alertLabel = [[self class] makeAlertLabel];
[self.contentView setIsAccessibilityElement:YES];
//
[self.contentView addSubview:self.alertLabel];
// Custom AccessoryView for easy styling.
self.customAccessoryView = [[UIView alloc] initWithFrame:CGRectZero];
[self.customAccessoryView setIsAccessibilityElement:YES];
[self.contentView addSubview:self.customAccessoryView];
//switch
self.switch = [[BAUISwitch alloc] initWithFrame:CGRectZero];
[self.switch addTarget:self action:@selector(switchWasFlipped:) forControlEvents:UIControlEventValueChanged];
[self.switch setIsAccessibilityElement:YES];
[self.switch setAccessibilityTraits:UIAccessibilityTraitButton];
[self.switch setAccessibilityLabel:@""];
[self.switch setAccessibilityHint:@""];
self.switch.autoresizingMask = UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleBottomMargin | UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin;
[self.customAccessoryView addSubview:self.switch];
}
+ (UILabel *)makeAlertLabel
{
UILabel *alertLabel = [[UILabel alloc] initWithFrame:CGRectZero];
alertLabel.backgroundColor = [UIColor clearColor];
alertLabel.HTMLText = @"";
alertLabel.numberOfLines = 0;
alertLabel.lineBreakMode = LINE_BREAK_WORD_WRAP
[alertLabel setIsAccessibilityElement:YES];
return alertLabel;
}
-(void)setAlertHTMLText:(NSString*)title{
_alertTextString = [NSString stringWithString:title];
[self.alertLabel setText:_alertTextString];
}
- (BOOL)isAccessibilityElement {
return NO;
}
// The view encapsulates the following elements for the purposes of
// accessibility.
-(NSArray*) accessibleElements {
if (_accessibleElements && [_accessibleElements count] > 0) {
[_accessibleElements removeAllObjects];
}
// Fetch a new copy as the values may have changed.
_accessibleElements = [[NSMutableArray alloc] init];
UIAccessibilityElement* alertLabelElement =
[[UIAccessibilityElement alloc] initWithAccessibilityContainer:self];
//alertLabelElement.accessibilityFrame = [self convertRect:self.contentView.frame toView:nil];
alertLabelElement.accessibilityLabel = _alertTextString;
alertLabelElement.accessibilityTraits = UIAccessibilityTraitStaticText;
[_accessibleElements addObject:alertLabelElement];
UIAccessibilityElement* switchElement =
[[UIAccessibilityElement alloc] initWithAccessibilityContainer:self];
// switchElement.accessibilityFrame = [self convertRect:self.customAccessoryView.frame toView:nil];
switchElement.accessibilityTraits = UIAccessibilityTraitButton;
// If you want custom values, just override it in the invoking function.
NSMutableString* accessibilityString =
[NSMutableString stringWithString:self.accessibilityPrefix];
[accessibilityString appendString:@" Switch "];
if (self.switchh.isOn) {
[accessibilityString appendString:@"On"];
} else {
[accessibilityString appendString:@"Off"];
}
switchElement.accessibilityLabel = [accessibilityString copy];
[_accessibleElements addObject:switchElement];
}
return _accessibleElements;
}
// In case accessibleElements is not initialized.
- (void) initializeAccessibleElements {
_accessibleElements = [self accessibleElements];
}
- (NSInteger)accessibilityElementCount
{
return [_accessibleElements count]
}
- (id)accessibilityElementAtIndex:(NSInteger)index
{
[self initializeAccessibleElements];
return [_accessibleElements objectAtIndex:index];
}
- (NSInteger)indexOfAccessibilityElement:(id)element
{
[self initializeAccessibleElements];
return [_accessibleElements indexOfObject:element];
}
@end
сделал и установить доступность для представления таблицы и ячейки? Покажите код, связанный с этим. –
также вам не нужно переопределить accessibleElements, вы можете просто передать массив accessibleElements собственности. –
@TejaNandamuri Я установил доступность ячейки контейнера табличного представления к «Нет» в «isAccessibleElement», поскольку это представление контейнера. Этот блок кода предоставляется в блоке кода. К вашему второму комментарию я должен каждый раз вычислять доступные элементы, так как пользователь может переключать переключатель. Я отражу значение, если это произойдет. – Kartik