我有一个tableview,每个单元格都包含一个collectionView(滚动禁用)。使用VoiceOver向左或向右滑动时,焦点会以意想不到的方式移动。我想阻止VoiceOver滚动tableview,以便我可以实现自定义滚动行为。
答案 0 :(得分:0)
如果您希望语音跳过表格视图,则无法通过语音访问表格视图。你可以通过制作
来做到这一点 //the queue is ConcurrentLinkedQueue
static Map<String, Queue<MsgInfo>> queueReadBucketNextMessageIds = new ConcurrentHashMap<String, Queue<MsgInfo>>();
private final Map<String,ReentrantReadWriteLock > readWriteLockMap = new ConcurrentHashMap<>();
//Applying read write ReentrantLock Lock to improve performance as number of db read op decreases when the cache will have around 500 messgeInfos
public MsgInfo fetchAndMoveMessageInfo(String queueName,
Date dequeuetime, Date dequeueMinute) {
getReadWriteLock(queueName).readLock().lock(); //acquire read lock
if (!hasMessageInfo(queueName)) {
getReadWriteLock(queueName).readLock().unlock(); //unlock read lock
getReadWriteLock(queueName).writeLock().lock(); //acquire write lock
// Acquired writeLock
try {
if (!hasMessageInfo(queueName)) {
return getDequeueMessageInfo(queueName, dequeuetime,
dequeueMinute); //Form this I am invoking a method getReadBucketForQueue which is showing contention. See below JFR contention. How ??
}
getReadWriteLock(queueName).readLock().lock(); //unlock write lock
} finally {
getReadWriteLock(queueName).writeLock().unlock(); //unlock read lock
}
}
try {
return readAndHideMessageInfo(queueName, dequeuetime, dequeueMinute);
} finally {
getReadWriteLock(queueName).readLock().unlock();
}
}
private boolean hasMessageInfo(String queueName) {
boolean hasMessageInfo = false;
if (queueReadBucketNextMessageIds.containsKey(queueName)) {
Queue<MsgInfo> messageInfoQueue = queueReadBucketNextMessageIds
.get(queueName);
synchronized (messageInfoQueue) {
hasMessageInfo = !messageInfoQueue.isEmpty();
}
}
private MsgInfo readAndHideMessageInfo(String queueName, Date dequeuetime,
Date dequeueMinute) {
MsgInfo messageInfo = queueReadBucketNextMessageIds.get(queueName)
.poll();
if (messageInfo != null)
//perform a db operation here to move
return messageInfo;
}
private ReentrantReadWriteLock getReadWriteLock(String queueName) {
ReentrantReadWriteLock readWriteLock = readWriteLockMap.get(queueName);
if (readWriteLock == null) {
log.debug("getting readWriteLock for newly created queue {}",
queueName);
ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
readWriteLock = readWriteLockMap.putIfAbsent(queueName, lock);
if (readWriteLock == null)
readWriteLock = lock;
}
return readWriteLock;
}
Stack Trace of JFR contention Count Duration
com.owmessaging.qserv.service.impl.QueueServiceHelper.setReadBucketForQueue(String, List) 5,134 8 min 39 sec
com.owmessaging.qserv.service.impl.QueueServiceHelper.getDequeueMessageInfo(String, Date, Date) 5,125 8 min 39 sec
com.owmessaging.qserv.service.impl.QueueServiceHelper.fetchAndMoveMessageInfo(String, Date, Date) 5,125 8 min 39 sec
com.owmessaging.qserv.service.impl.QueueServiceImpl.dequeue(String) 5,125 8 min 39 sec
com.owmessaging.qserv.service.impl.QueueServiceHelper.getReadBucketForQueue(String) 9 1 sec 245 ms (How come this method is showing contention?clueless ?)
com.owmessaging.qserv.service.impl.QueueServiceHelper.getDequeueMessageInfo(String, Date, Date) 9 1 sec 245 ms
com.owmessaging.qserv.service.impl.QueueServiceHelper.fetchAndMoveMessageInfo(String, Date, Date) 9 1 sec 245 ms
com.owmessaging.qserv.service.impl.QueueServiceImpl.dequeue(String) 9 1,245,024,161
或者您可以使用 tableView.isAccessibilityElement=NO;
accessibilityElements
通过这种方式,您还可以更改可访问元素的顺序。
如果您不希望可以访问您的tableview,请从上面的数组中删除tableview。
self.view.accessibilityElements=@[myview,mytableview,mybutton];