gridView 中的 UIAccessibility - 看不到新单元格
UIAccessibility in gridView - doesn't see new cells
在我的项目中,我有 tableView,作为一行,有一个自定义的 UITableViewCell,它有一个 属性 - GMGridView(它类似于 UICollectionView),它有它的委托方法:
- (GMGridViewCell *)GMGridView:(GMGridView *)gridView cellForItemAtIndex:(NSInteger)index {
GMGridViewCell *cell = [gridView dequeueReusableCell];
if (!cell)
{
cell = [[GMGridViewCell alloc] initWithFrame:CGRectMake(0, 0, size.width, size.height)];
cell.contentView = [[GridViewContentView alloc] initWithFrame:cell.frame style:GridViewStyleNews];
}
Item *feed = _contentArray[index];
GridViewContentView *contentView = (GridViewContentView *)cell.contentView;
contentView.textLabel.text = feed.textLabel;
[contentView.imageView setURL:[NSURL URLWithString:feed.imageLink] withPreset:self.preset];
cell.contentView = contentView;
NSLog(@"Address index %d - %p:", index, cell);
return cell;
}
在此阶段 - 创建了自定义 contentView -GridViewContentView 并将其标识为单元格 contentView。
此自定义内容视图被定义为可访问,其中有以下方法:
- (BOOL)isAccessibilityElement {
return YES;
}
- (NSString *)accessibilityLabel {
return [NSString stringWithFormat:@"%p, %@", self.superview, self.textLabel.text];
}
在我的例子中,我在 GridView 中有 19 个项目。
因此,当 tableView 加载到 iPad(横向)时创建了 6 个项目,它们被插入到 GridView 内的 NSArray 中:
2016-08-07 17:04:39.626 DummyAccessibility[2785:230602] Address index 0 - 0x7a0162e0:
2016-08-07 17:04:39.632 DummyAccessibility[2785:230602] Address index 1 - 0x797390e0:
2016-08-07 17:04:39.633 DummyAccessibility[2785:230602] Address index 2 - 0x79643db0:
2016-08-07 17:04:39.639 DummyAccessibility[2785:230602] Address index 3 - 0x7a013290:
2016-08-07 17:04:39.640 DummyAccessibility[2785:230602] Address index 4 - 0x7a0114f0:
2016-08-07 17:04:39.641 DummyAccessibility[2785:230602] Address index 5 - 0x7965ef30:
并且画外音告诉正确的文本 - 属于录音项目。
但是当我滚动时 - 另外创建了接下来的 2 个项目(6 和 7),而第一个 2 - 被重新用于项目(8 和 9)。
新项目:
2016-08-07 17:04:59.961 DummyAccessibility[2785:230602] Address index 6 - 0x79674ac0:
2016-08-07 17:05:00.366 DummyAccessibility[2785:230602] Address index 7 - 0x7a074f20:
重复使用的物品:
2016-08-07 17:05:00.982 DummyAccessibility[2785:230602] Address index 8 - 0x7a0162e0:
2016-08-07 17:05:05.704 DummyAccessibility[2785:230602] Address index 9 - 0x797390e0:
调试后我发现这些新项目从未被 UIAccessibility 接受。当我尝试点击它时 - VoiceOver 告诉 - 在单元格(编号 5)内重定向并从中获取文本值。
因此,当我尝试点击重复使用的项目时 - 它告诉我正确(重复使用的 textInfo)。这样的情况(这些新物品即使在被重复使用时也保持不变)。我不明白为什么会这样。
我花了很多时间在上面,但不明白为什么它会那样工作。我真的很感激任何想法。
非常感谢。
我在这里找到了基于 Sean Howell 回答的解决方案
所以我在我的自定义 tableViewCell 中添加了额外的 属性 - UIView,
然后添加到其中 - 在我的例子中 - GMGridView。
self.trickView = [[UIView alloc]initWithFrame:self.bounds];
self.trickView.backgroundColor = [UIColor clearColor];
self.trickView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
_trickView.accessibilityElements = @[gmGridView];
[self.contentView addSubview:_trickView];
[self.gridView removeFromSuperview];
self.gridView = nil;
self.gridView = gmGridView;
[self.trickView addSubview:gmGridView];
在我的项目中,我有 tableView,作为一行,有一个自定义的 UITableViewCell,它有一个 属性 - GMGridView(它类似于 UICollectionView),它有它的委托方法:
- (GMGridViewCell *)GMGridView:(GMGridView *)gridView cellForItemAtIndex:(NSInteger)index {
GMGridViewCell *cell = [gridView dequeueReusableCell];
if (!cell)
{
cell = [[GMGridViewCell alloc] initWithFrame:CGRectMake(0, 0, size.width, size.height)];
cell.contentView = [[GridViewContentView alloc] initWithFrame:cell.frame style:GridViewStyleNews];
}
Item *feed = _contentArray[index];
GridViewContentView *contentView = (GridViewContentView *)cell.contentView;
contentView.textLabel.text = feed.textLabel;
[contentView.imageView setURL:[NSURL URLWithString:feed.imageLink] withPreset:self.preset];
cell.contentView = contentView;
NSLog(@"Address index %d - %p:", index, cell);
return cell;
}
在此阶段 - 创建了自定义 contentView -GridViewContentView 并将其标识为单元格 contentView。
此自定义内容视图被定义为可访问,其中有以下方法:
- (BOOL)isAccessibilityElement {
return YES;
}
- (NSString *)accessibilityLabel {
return [NSString stringWithFormat:@"%p, %@", self.superview, self.textLabel.text];
}
在我的例子中,我在 GridView 中有 19 个项目。
因此,当 tableView 加载到 iPad(横向)时创建了 6 个项目,它们被插入到 GridView 内的 NSArray 中:
2016-08-07 17:04:39.626 DummyAccessibility[2785:230602] Address index 0 - 0x7a0162e0:
2016-08-07 17:04:39.632 DummyAccessibility[2785:230602] Address index 1 - 0x797390e0:
2016-08-07 17:04:39.633 DummyAccessibility[2785:230602] Address index 2 - 0x79643db0:
2016-08-07 17:04:39.639 DummyAccessibility[2785:230602] Address index 3 - 0x7a013290:
2016-08-07 17:04:39.640 DummyAccessibility[2785:230602] Address index 4 - 0x7a0114f0:
2016-08-07 17:04:39.641 DummyAccessibility[2785:230602] Address index 5 - 0x7965ef30:
并且画外音告诉正确的文本 - 属于录音项目。 但是当我滚动时 - 另外创建了接下来的 2 个项目(6 和 7),而第一个 2 - 被重新用于项目(8 和 9)。 新项目:
2016-08-07 17:04:59.961 DummyAccessibility[2785:230602] Address index 6 - 0x79674ac0:
2016-08-07 17:05:00.366 DummyAccessibility[2785:230602] Address index 7 - 0x7a074f20:
重复使用的物品:
2016-08-07 17:05:00.982 DummyAccessibility[2785:230602] Address index 8 - 0x7a0162e0:
2016-08-07 17:05:05.704 DummyAccessibility[2785:230602] Address index 9 - 0x797390e0:
调试后我发现这些新项目从未被 UIAccessibility 接受。当我尝试点击它时 - VoiceOver 告诉 - 在单元格(编号 5)内重定向并从中获取文本值。
因此,当我尝试点击重复使用的项目时 - 它告诉我正确(重复使用的 textInfo)。这样的情况(这些新物品即使在被重复使用时也保持不变)。我不明白为什么会这样。
我花了很多时间在上面,但不明白为什么它会那样工作。我真的很感激任何想法。
非常感谢。
我在这里找到了基于 Sean Howell 回答的解决方案
所以我在我的自定义 tableViewCell 中添加了额外的 属性 - UIView,
然后添加到其中 - 在我的例子中 - GMGridView。
self.trickView = [[UIView alloc]initWithFrame:self.bounds];
self.trickView.backgroundColor = [UIColor clearColor];
self.trickView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
_trickView.accessibilityElements = @[gmGridView];
[self.contentView addSubview:_trickView];
[self.gridView removeFromSuperview];
self.gridView = nil;
self.gridView = gmGridView;
[self.trickView addSubview:gmGridView];